47827b904aeb50201f43a86992880bb97b08d31b
[yaffs-website] / web / core / modules / aggregator / src / Controller / AggregatorController.php
1 <?php
2
3 namespace Drupal\aggregator\Controller;
4
5 use Drupal\Component\Utility\Xss;
6 use Drupal\Core\Controller\ControllerBase;
7 use Drupal\Core\Datetime\DateFormatterInterface;
8 use Drupal\aggregator\FeedInterface;
9 use Drupal\Core\Url;
10 use Symfony\Component\DependencyInjection\ContainerInterface;
11
12 /**
13  * Returns responses for aggregator module routes.
14  */
15 class AggregatorController extends ControllerBase {
16
17   /**
18    * The date formatter service.
19    *
20    * @var \Drupal\Core\Datetime\DateFormatterInterface
21    */
22   protected $dateFormatter;
23
24   /**
25    * Constructs a \Drupal\aggregator\Controller\AggregatorController object.
26    *
27    * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
28    *   The date formatter service.
29    */
30   public function __construct(DateFormatterInterface $date_formatter) {
31     $this->dateFormatter = $date_formatter;
32   }
33
34   /**
35    * {@inheritdoc}
36    */
37   public static function create(ContainerInterface $container) {
38     return new static(
39       $container->get('date.formatter')
40     );
41   }
42
43   /**
44    * Presents the aggregator feed creation form.
45    *
46    * @return array
47    *   A form array as expected by
48    *   \Drupal\Core\Render\RendererInterface::render().
49    */
50   public function feedAdd() {
51     $feed = $this->entityManager()->getStorage('aggregator_feed')->create();
52     return $this->entityFormBuilder()->getForm($feed);
53   }
54
55   /**
56    * Builds a listing of aggregator feed items.
57    *
58    * @param \Drupal\aggregator\ItemInterface[] $items
59    *   The items to be listed.
60    * @param array|string $feed_source
61    *   The feed source URL.
62    *
63    * @return array
64    *   The rendered list of items for the feed.
65    */
66   protected function buildPageList(array $items, $feed_source = '') {
67     // Assemble output.
68     $build = [
69       '#type' => 'container',
70       '#attributes' => ['class' => ['aggregator-wrapper']],
71     ];
72     $build['feed_source'] = is_array($feed_source) ? $feed_source : ['#markup' => $feed_source];
73     if ($items) {
74       $build['items'] = $this->entityManager()->getViewBuilder('aggregator_item')
75         ->viewMultiple($items, 'default');
76       $build['pager'] = ['#type' => 'pager'];
77     }
78     return $build;
79   }
80
81   /**
82    * Refreshes a feed, then redirects to the overview page.
83    *
84    * @param \Drupal\aggregator\FeedInterface $aggregator_feed
85    *   An object describing the feed to be refreshed.
86    *
87    * @return \Symfony\Component\HttpFoundation\RedirectResponse
88    *   A redirection to the admin overview page.
89    *
90    * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
91    *   If the query token is missing or invalid.
92    */
93   public function feedRefresh(FeedInterface $aggregator_feed) {
94     $message = $aggregator_feed->refreshItems()
95       ? $this->t('There is new syndicated content from %site.', ['%site' => $aggregator_feed->label()])
96       : $this->t('There is no new syndicated content from %site.', ['%site' => $aggregator_feed->label()]);
97     $this->messenger()->addStatus($message);
98     return $this->redirect('aggregator.admin_overview');
99   }
100
101   /**
102    * Displays the aggregator administration page.
103    *
104    * @return array
105    *   A render array as expected by
106    *   \Drupal\Core\Render\RendererInterface::render().
107    */
108   public function adminOverview() {
109     $entity_manager = $this->entityManager();
110     $feeds = $entity_manager->getStorage('aggregator_feed')
111       ->loadMultiple();
112
113     $header = [$this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations')];
114     $rows = [];
115     /** @var \Drupal\aggregator\FeedInterface[] $feeds */
116     foreach ($feeds as $feed) {
117       $row = [];
118       $row[] = $feed->link();
119       $row[] = $this->formatPlural($entity_manager->getStorage('aggregator_item')->getItemCount($feed), '1 item', '@count items');
120       $last_checked = $feed->getLastCheckedTime();
121       $refresh_rate = $feed->getRefreshRate();
122
123       $row[] = ($last_checked ? $this->t('@time ago', ['@time' => $this->dateFormatter->formatInterval(REQUEST_TIME - $last_checked)]) : $this->t('never'));
124       if (!$last_checked && $refresh_rate) {
125         $next_update = $this->t('imminently');
126       }
127       elseif ($last_checked && $refresh_rate) {
128         $next_update = $next = $this->t('%time left', ['%time' => $this->dateFormatter->formatInterval($last_checked + $refresh_rate - REQUEST_TIME)]);
129       }
130       else {
131         $next_update = $this->t('never');
132       }
133       $row[] = $next_update;
134       $links['edit'] = [
135         'title' => $this->t('Edit'),
136         'url' => Url::fromRoute('entity.aggregator_feed.edit_form', ['aggregator_feed' => $feed->id()]),
137       ];
138       $links['delete'] = [
139         'title' => $this->t('Delete'),
140         'url' => Url::fromRoute('entity.aggregator_feed.delete_form', ['aggregator_feed' => $feed->id()]),
141       ];
142       $links['delete_items'] = [
143         'title' => $this->t('Delete items'),
144         'url' => Url::fromRoute('aggregator.feed_items_delete', ['aggregator_feed' => $feed->id()]),
145       ];
146       $links['update'] = [
147         'title' => $this->t('Update items'),
148         'url' => Url::fromRoute('aggregator.feed_refresh', ['aggregator_feed' => $feed->id()]),
149       ];
150       $row[] = [
151         'data' => [
152           '#type' => 'operations',
153           '#links' => $links,
154         ],
155       ];
156       $rows[] = $row;
157     }
158     $build['feeds'] = [
159       '#prefix' => '<h3>' . $this->t('Feed overview') . '</h3>',
160       '#type' => 'table',
161       '#header' => $header,
162       '#rows' => $rows,
163       '#empty' => $this->t('No feeds available. <a href=":link">Add feed</a>.', [':link' => $this->url('aggregator.feed_add')]),
164     ];
165
166     return $build;
167   }
168
169   /**
170    * Displays the most recent items gathered from any feed.
171    *
172    * @return string
173    *   The rendered list of items for the feed.
174    */
175   public function pageLast() {
176     $items = $this->entityManager()->getStorage('aggregator_item')->loadAll(20);
177     $build = $this->buildPageList($items);
178     $build['#attached']['feed'][] = ['aggregator/rss', $this->config('system.site')->get('name') . ' ' . $this->t('aggregator')];
179     return $build;
180   }
181
182   /**
183    * Route title callback.
184    *
185    * @param \Drupal\aggregator\FeedInterface $aggregator_feed
186    *   The aggregator feed.
187    *
188    * @return array
189    *   The feed label as a render array.
190    */
191   public function feedTitle(FeedInterface $aggregator_feed) {
192     return ['#markup' => $aggregator_feed->label(), '#allowed_tags' => Xss::getHtmlTagList()];
193   }
194
195 }