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