feedStorage = $feed_storage; $this->itemStorage = $item_storage; $this->itemQuery = $item_query; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('entity.manager')->getStorage('aggregator_feed'), $container->get('entity.manager')->getStorage('aggregator_item'), $container->get('entity.query')->get('aggregator_item') ); } /** * {@inheritdoc} */ public function defaultConfiguration() { // By default, the block will contain 10 feed items. return array( 'block_count' => 10, 'feed' => NULL, // Modify the default max age for the 'Aggregator Feed' blocks: // modifications made to feeds or feed items will automatically invalidate // corresponding cache tags, therefore allowing us to cache these blocks // forever. 'cache' => array( 'max_age' => \Drupal\Core\Cache\Cache::PERMANENT, ), ); } /** * {@inheritdoc} */ protected function blockAccess(AccountInterface $account) { // Only grant access to users with the 'access news feeds' permission. return $account->hasPermission('access news feeds'); } /** * {@inheritdoc} */ public function blockForm($form, FormStateInterface $form_state) { $feeds = $this->feedStorage->loadMultiple(); $options = array(); foreach ($feeds as $feed) { $options[$feed->id()] = $feed->label(); } $form['feed'] = array( '#type' => 'select', '#title' => t('Select the feed that should be displayed'), '#default_value' => $this->configuration['feed'], '#options' => $options, ); $range = range(2, 20); $form['block_count'] = array( '#type' => 'select', '#title' => t('Number of news items in block'), '#default_value' => $this->configuration['block_count'], '#options' => array_combine($range, $range), ); return $form; } /** * {@inheritdoc} */ public function blockSubmit($form, FormStateInterface $form_state) { $this->configuration['block_count'] = $form_state->getValue('block_count'); $this->configuration['feed'] = $form_state->getValue('feed'); } /** * {@inheritdoc} */ public function build() { // Load the selected feed. if ($feed = $this->feedStorage->load($this->configuration['feed'])) { $result = $this->itemQuery ->condition('fid', $feed->id()) ->range(0, $this->configuration['block_count']) ->sort('timestamp', 'DESC') ->sort('iid', 'DESC') ->execute(); $items = $this->itemStorage->loadMultiple($result); $more_link = array( '#type' => 'more_link', '#url' => $feed->urlInfo(), '#attributes' => array('title' => $this->t("View this feed's recent news.")), ); $read_more = drupal_render($more_link); $rendered_items = array(); foreach ($items as $item) { $aggregator_block_item = array( '#type' => 'link', '#href' => $item->getLink(), '#title' => $item->label(), ); $rendered_items[] = drupal_render($aggregator_block_item); } // Only display the block if there are items to show. if (count($rendered_items) > 0) { $item_list = array( '#theme' => 'item_list', '#items' => $rendered_items, ); return array( '#children' => drupal_render($item_list) . $read_more, ); } } } /** * {@inheritdoc} */ public function getCacheTags() { $cache_tags = parent::getCacheTags(); $feed = $this->feedStorage->load($this->configuration['feed']); return Cache::mergeTags($cache_tags, $feed->getCacheTags()); } }