b459b196ccbd441011649218a73f73ec7dbd91e7
[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 drupal_render().
48    */
49   public function feedAdd() {
50     $feed = $this->entityManager()->getStorage('aggregator_feed')->create();
51     return $this->entityFormBuilder()->getForm($feed);
52   }
53
54   /**
55    * Builds a listing of aggregator feed items.
56    *
57    * @param \Drupal\aggregator\ItemInterface[] $items
58    *   The items to be listed.
59    * @param array|string $feed_source
60    *   The feed source URL.
61    *
62    * @return array
63    *   The rendered list of items for the feed.
64    */
65   protected function buildPageList(array $items, $feed_source = '') {
66     // Assemble output.
67     $build = [
68       '#type' => 'container',
69       '#attributes' => ['class' => ['aggregator-wrapper']],
70     ];
71     $build['feed_source'] = is_array($feed_source) ? $feed_source : ['#markup' => $feed_source];
72     if ($items) {
73       $build['items'] = $this->entityManager()->getViewBuilder('aggregator_item')
74         ->viewMultiple($items, 'default');
75       $build['pager'] = ['#type' => 'pager'];
76     }
77     return $build;
78   }
79
80   /**
81    * Refreshes a feed, then redirects to the overview page.
82    *
83    * @param \Drupal\aggregator\FeedInterface $aggregator_feed
84    *   An object describing the feed to be refreshed.
85    *
86    * @return \Symfony\Component\HttpFoundation\RedirectResponse
87    *   A redirection to the admin overview page.
88    *
89    * @throws \Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException
90    *   If the query token is missing or invalid.
91    */
92   public function feedRefresh(FeedInterface $aggregator_feed) {
93     $message = $aggregator_feed->refreshItems()
94       ? $this->t('There is new syndicated content from %site.', ['%site' => $aggregator_feed->label()])
95       : $this->t('There is no new syndicated content from %site.', ['%site' => $aggregator_feed->label()]);
96     drupal_set_message($message);
97     return $this->redirect('aggregator.admin_overview');
98   }
99
100   /**
101    * Displays the aggregator administration page.
102    *
103    * @return array
104    *   A render array as expected by drupal_render().
105    */
106   public function adminOverview() {
107     $entity_manager = $this->entityManager();
108     $feeds = $entity_manager->getStorage('aggregator_feed')
109       ->loadMultiple();
110
111     $header = [$this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations')];
112     $rows = [];
113     /** @var \Drupal\aggregator\FeedInterface[] $feeds */
114     foreach ($feeds as $feed) {
115       $row = [];
116       $row[] = $feed->link();
117       $row[] = $this->formatPlural($entity_manager->getStorage('aggregator_item')->getItemCount($feed), '1 item', '@count items');
118       $last_checked = $feed->getLastCheckedTime();
119       $refresh_rate = $feed->getRefreshRate();
120
121       $row[] = ($last_checked ? $this->t('@time ago', ['@time' => $this->dateFormatter->formatInterval(REQUEST_TIME - $last_checked)]) : $this->t('never'));
122       if (!$last_checked && $refresh_rate) {
123         $next_update = $this->t('imminently');
124       }
125       elseif ($last_checked && $refresh_rate) {
126         $next_update = $next = $this->t('%time left', ['%time' => $this->dateFormatter->formatInterval($last_checked + $refresh_rate - REQUEST_TIME)]);
127       }
128       else {
129         $next_update = $this->t('never');
130       }
131       $row[] = $next_update;
132       $links['edit'] = [
133         'title' => $this->t('Edit'),
134         'url' => Url::fromRoute('entity.aggregator_feed.edit_form', ['aggregator_feed' => $feed->id()]),
135       ];
136       $links['delete'] = [
137         'title' => $this->t('Delete'),
138         'url' => Url::fromRoute('entity.aggregator_feed.delete_form', ['aggregator_feed' => $feed->id()]),
139       ];
140       $links['delete_items'] = [
141         'title' => $this->t('Delete items'),
142         'url' => Url::fromRoute('aggregator.feed_items_delete', ['aggregator_feed' => $feed->id()]),
143       ];
144       $links['update'] = [
145         'title' => $this->t('Update items'),
146         'url' => Url::fromRoute('aggregator.feed_refresh', ['aggregator_feed' => $feed->id()]),
147       ];
148       $row[] = [
149         'data' => [
150           '#type' => 'operations',
151           '#links' => $links,
152         ],
153       ];
154       $rows[] = $row;
155     }
156     $build['feeds'] = [
157       '#prefix' => '<h3>' . $this->t('Feed overview') . '</h3>',
158       '#type' => 'table',
159       '#header' => $header,
160       '#rows' => $rows,
161       '#empty' => $this->t('No feeds available. <a href=":link">Add feed</a>.', [':link' => $this->url('aggregator.feed_add')]),
162     ];
163
164     return $build;
165   }
166
167   /**
168    * Displays the most recent items gathered from any feed.
169    *
170    * @return string
171    *   The rendered list of items for the feed.
172    */
173   public function pageLast() {
174     $items = $this->entityManager()->getStorage('aggregator_item')->loadAll(20);
175     $build = $this->buildPageList($items);
176     $build['#attached']['feed'][] = ['aggregator/rss', $this->config('system.site')->get('name') . ' ' . $this->t('aggregator')];
177     return $build;
178   }
179
180   /**
181    * Route title callback.
182    *
183    * @param \Drupal\aggregator\FeedInterface $aggregator_feed
184    *   The aggregator feed.
185    *
186    * @return array
187    *   The feed label as a render array.
188    */
189   public function feedTitle(FeedInterface $aggregator_feed) {
190     return ['#markup' => $aggregator_feed->label(), '#allowed_tags' => Xss::getHtmlTagList()];
191   }
192
193 }