Commit f0ef79ce authored by catch's avatar catch

Issue #1888702 by Berdir: Fixed Use configuration selection instead of derivatives for some blocks.

parent 5c88ea31
...@@ -200,13 +200,6 @@ function aggregator_schema() { ...@@ -200,13 +200,6 @@ function aggregator_schema() {
'default' => 0, 'default' => 0,
'description' => 'When the feed was last modified, as a Unix timestamp.', 'description' => 'When the feed was last modified, as a Unix timestamp.',
), ),
'block' => array(
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'size' => 'tiny',
'description' => "Number of items to display in the feed's block.",
)
), ),
'primary key' => array('fid'), 'primary key' => array('fid'),
'indexes' => array( 'indexes' => array(
......
...@@ -70,7 +70,6 @@ public function feedAdd() { ...@@ -70,7 +70,6 @@ public function feedAdd() {
$feed = $entity_manager->getStorageController('aggregator_feed') $feed = $entity_manager->getStorageController('aggregator_feed')
->create(array( ->create(array(
'refresh' => 3600, 'refresh' => 3600,
'block' => 5,
)); ));
return $entity_manager->getForm($feed); return $entity_manager->getForm($feed);
} }
...@@ -174,7 +173,7 @@ public function feedRefresh(FeedInterface $aggregator_feed, Request $request) { ...@@ -174,7 +173,7 @@ public function feedRefresh(FeedInterface $aggregator_feed, Request $request) {
* A render array as expected by drupal_render(). * A render array as expected by drupal_render().
*/ */
public function adminOverview() { public function adminOverview() {
$result = $this->database->query('SELECT f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, f.block ORDER BY f.title'); $result = $this->database->query('SELECT f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image, COUNT(i.iid) AS items FROM {aggregator_feed} f LEFT JOIN {aggregator_item} i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.checked, f.link, f.description, f.hash, f.etag, f.modified, f.image ORDER BY f.title');
$header = array($this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations')); $header = array($this->t('Title'), $this->t('Items'), $this->t('Last update'), $this->t('Next update'), $this->t('Operations'));
$rows = array(); $rows = array();
......
...@@ -134,13 +134,6 @@ class Feed extends EntityNG implements FeedInterface { ...@@ -134,13 +134,6 @@ class Feed extends EntityNG implements FeedInterface {
*/ */
public $modified; public $modified;
/**
* Number of items to display in the feed’s block.
*
* @var \Drupal\Core\Entity\Field\FieldInterface
*/
public $block;
/** /**
* Overrides Drupal\Core\Entity\EntityNG::init(). * Overrides Drupal\Core\Entity\EntityNG::init().
*/ */
...@@ -160,7 +153,6 @@ public function init() { ...@@ -160,7 +153,6 @@ public function init() {
unset($this->hash); unset($this->hash);
unset($this->etag); unset($this->etag);
unset($this->modified); unset($this->modified);
unset($this->block);
} }
/** /**
...@@ -208,10 +200,6 @@ public static function preCreate(EntityStorageControllerInterface $storage_contr ...@@ -208,10 +200,6 @@ public static function preCreate(EntityStorageControllerInterface $storage_contr
* {@inheritdoc} * {@inheritdoc}
*/ */
public static function preDelete(EntityStorageControllerInterface $storage_controller, array $entities) { public static function preDelete(EntityStorageControllerInterface $storage_controller, array $entities) {
// Invalidate the block cache to update aggregator feed-based derivatives.
if (\Drupal::moduleHandler()->moduleExists('block')) {
\Drupal::service('plugin.manager.block')->clearCachedDefinitions();
}
$storage_controller->deleteCategories($entities); $storage_controller->deleteCategories($entities);
foreach ($entities as $entity) { foreach ($entities as $entity) {
// Notify processors to remove stored items. // Notify processors to remove stored items.
...@@ -226,14 +214,15 @@ public static function preDelete(EntityStorageControllerInterface $storage_contr ...@@ -226,14 +214,15 @@ public static function preDelete(EntityStorageControllerInterface $storage_contr
* {@inheritdoc} * {@inheritdoc}
*/ */
public static function postDelete(EntityStorageControllerInterface $storage_controller, array $entities) { public static function postDelete(EntityStorageControllerInterface $storage_controller, array $entities) {
foreach ($entities as $entity) { if (\Drupal::moduleHandler()->moduleExists('block')) {
// Make sure there is no active block for this feed. // Make sure there are no active blocks for these feeds.
$block_configs = config_get_storage_names_with_prefix('plugin.core.block'); $ids = \Drupal::entityQuery('block')
foreach ($block_configs as $config_id) { ->condition('plugin', 'aggregator_feed_block')
$config = \Drupal::config($config_id); ->condition('settings.feed', array_keys($entities))
if ($config->get('id') == 'aggregator_feed_block:' . $entity->id()) { ->execute();
$config->delete(); if ($ids) {
} $block_storage = \Drupal::entityManager()->getStorageController('block');
$block_storage->delete($block_storage->loadMultiple($ids));
} }
} }
} }
...@@ -244,7 +233,6 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont ...@@ -244,7 +233,6 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont
public function preSave(EntityStorageControllerInterface $storage_controller) { public function preSave(EntityStorageControllerInterface $storage_controller) {
parent::preSave($storage_controller); parent::preSave($storage_controller);
$this->clearBlockCacheDefinitions();
$storage_controller->deleteCategories(array($this->id() => $this)); $storage_controller->deleteCategories(array($this->id() => $this));
} }
...@@ -259,15 +247,6 @@ public function postSave(EntityStorageControllerInterface $storage_controller, $ ...@@ -259,15 +247,6 @@ public function postSave(EntityStorageControllerInterface $storage_controller, $
} }
} }
/**
* Invalidate the block cache to update aggregator feed-based derivatives.
*/
protected function clearBlockCacheDefinitions() {
if ($block_manager = \Drupal::getContainer()->get('plugin.manager.block', Container::NULL_ON_INVALID_REFERENCE)) {
$block_manager->clearCachedDefinitions();
}
}
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
...@@ -338,11 +317,6 @@ public static function baseFieldDefinitions($entity_type) { ...@@ -338,11 +317,6 @@ public static function baseFieldDefinitions($entity_type) {
'description' => t('When the feed was last modified, as a Unix timestamp.'), 'description' => t('When the feed was last modified, as a Unix timestamp.'),
'type' => 'integer_field', 'type' => 'integer_field',
); );
$fields['block'] = array(
'label' => t('Block'),
'description' => t('Number of items to display in the feed’s block.'),
'type' => 'integer_field',
);
return $fields; return $fields;
} }
......
...@@ -54,12 +54,6 @@ public function form(array $form, array &$form_state) { ...@@ -54,12 +54,6 @@ public function form(array $form, array &$form_state) {
'#options' => $period, '#options' => $period,
'#description' => $this->t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))), '#description' => $this->t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
); );
$form['block'] = array('#type' => 'select',
'#title' => $this->t('News items in block'),
'#default_value' => $feed->block->value,
'#options' => drupal_map_assoc(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
'#description' => $this->t("Drupal can make a block with the most recent news items of this feed. You can <a href=\"@block-admin\">configure blocks</a> to be displayed in the sidebar of your page. This setting lets you configure the number of news items to show in this feed's block. If you choose '0' this feed's block will be disabled.", array('@block-admin' => url('admin/structure/block'))),
);
// Handling of categories. // Handling of categories.
$options = array(); $options = array();
......
...@@ -113,13 +113,6 @@ public function buildForm(array $form, array &$form_state) { ...@@ -113,13 +113,6 @@ public function buildForm(array $form, array &$form_state) {
'#options' => $period, '#options' => $period,
'#description' => $this->t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))), '#description' => $this->t('The length of time between feed updates. Requires a correctly configured <a href="@cron">cron maintenance task</a>.', array('@cron' => url('admin/reports/status'))),
); );
$form['block'] = array(
'#type' => 'select',
'#title' => $this->t('News items in block'),
'#default_value' => 5,
'#options' => drupal_map_assoc(array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)),
'#description' => $this->t("Drupal can make a block with the most recent news items of a feed. You can <a href=\"@block-admin\">configure blocks</a> to be displayed in the sidebar of your page. This setting lets you configure the number of news items to show in a feed's block. If you choose '0' these feeds' blocks will be disabled.", array('@block-admin' => url('admin/structure/block'))),
);
// Handling of categories. // Handling of categories.
$options = array_map('check_plain', $this->database->query("SELECT cid, title FROM {aggregator_category} ORDER BY title")->fetchAllKeyed()); $options = array_map('check_plain', $this->database->query("SELECT cid, title FROM {aggregator_category} ORDER BY title")->fetchAllKeyed());
...@@ -215,7 +208,6 @@ public function submitForm(array &$form, array &$form_state) { ...@@ -215,7 +208,6 @@ public function submitForm(array &$form, array &$form_state) {
'title' => $feed['title'], 'title' => $feed['title'],
'url' => $feed['url'], 'url' => $feed['url'],
'refresh' => $form_state['values']['refresh'], 'refresh' => $form_state['values']['refresh'],
'block' => $form_state['values']['block'],
)); ));
$new_feed->categories = $form_state['values']['category']; $new_feed->categories = $form_state['values']['category'];
$new_feed->save(); $new_feed->save();
......
...@@ -7,20 +7,69 @@ ...@@ -7,20 +7,69 @@
namespace Drupal\aggregator\Plugin\Block; namespace Drupal\aggregator\Plugin\Block;
use Drupal\aggregator\CategoryStorageControllerInterface;
use Drupal\block\BlockBase; use Drupal\block\BlockBase;
use Drupal\block\Annotation\Block; use Drupal\block\Annotation\Block;
use Drupal\Core\Annotation\Translation; use Drupal\Core\Annotation\Translation;
use Drupal\Core\Database\Connection;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/** /**
* Provides an 'Aggregator category' block for the latest items in a category. * Provides an 'Aggregator category' block for the latest items in a category.
* *
* @Block( * @Block(
* id = "aggregator_category_block", * id = "aggregator_category_block",
* admin_label = @Translation("Aggregator category"), * admin_label = @Translation("Aggregator category")
* derivative = "Drupal\aggregator\Plugin\Derivative\AggregatorCategoryBlock"
* ) * )
*/ */
class AggregatorCategoryBlock extends BlockBase { class AggregatorCategoryBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $connection;
/**
* The category storage controller.
*
* @var \Drupal\aggregator\CategoryStorageControllerInterface
*/
protected $categoryStorageController;
/**
* Constructs an AggregatorFeedBlock object.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param array $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Database\Connection $connection
* The database connection.
*/
public function __construct(array $configuration, $plugin_id, array $plugin_definition, Connection $connection, CategoryStorageControllerInterface $category_storage_controller) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->connection = $connection;
$this->categoryStorageController = $category_storage_controller;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('database'),
$container->get('aggregator.category.storage')
);
}
/** /**
* {@inheritdoc} * {@inheritdoc}
...@@ -28,6 +77,7 @@ class AggregatorCategoryBlock extends BlockBase { ...@@ -28,6 +77,7 @@ class AggregatorCategoryBlock extends BlockBase {
public function defaultConfiguration() { public function defaultConfiguration() {
// By default, the block will contain 10 feed items. // By default, the block will contain 10 feed items.
return array( return array(
'cid' => 0,
'block_count' => 10, 'block_count' => 10,
); );
} }
...@@ -44,6 +94,18 @@ public function access() { ...@@ -44,6 +94,18 @@ public function access() {
* Overrides \Drupal\block\BlockBase::blockForm(). * Overrides \Drupal\block\BlockBase::blockForm().
*/ */
public function blockForm($form, &$form_state) { public function blockForm($form, &$form_state) {
$result = $this->connection->query('SELECT cid, title FROM {aggregator_category} ORDER BY title');
$options = array();
foreach ($result as $category) {
$options[$category->cid] = check_plain($category->title);
}
$form['cid'] = array(
'#type' => 'select',
'#title' => t('Select the category that should be displayed'),
'#default_value' => $this->configuration['cid'],
'#options' => $options,
);
$form['block_count'] = array( $form['block_count'] = array(
'#type' => 'select', '#type' => 'select',
'#title' => t('Number of news items in block'), '#title' => t('Number of news items in block'),
...@@ -57,6 +119,7 @@ public function blockForm($form, &$form_state) { ...@@ -57,6 +119,7 @@ public function blockForm($form, &$form_state) {
* Overrides \Drupal\block\BlockBase::blockSubmit(). * Overrides \Drupal\block\BlockBase::blockSubmit().
*/ */
public function blockSubmit($form, &$form_state) { public function blockSubmit($form, &$form_state) {
$this->configuration['cid'] = $form_state['values']['cid'];
$this->configuration['block_count'] = $form_state['values']['block_count']; $this->configuration['block_count'] = $form_state['values']['block_count'];
} }
...@@ -64,9 +127,9 @@ public function blockSubmit($form, &$form_state) { ...@@ -64,9 +127,9 @@ public function blockSubmit($form, &$form_state) {
* {@inheritdoc} * {@inheritdoc}
*/ */
public function build() { public function build() {
$id = $this->getPluginId(); $cid = $this->configuration['cid'];
if ($category = db_query('SELECT cid, title, block FROM {aggregator_category} WHERE cid = :cid', array(':cid' => $id))->fetchObject()) { if ($category = $this->categoryStorageController->load($cid)) {
$result = db_query_range('SELECT i.* FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON ci.iid = i.iid WHERE ci.cid = :cid ORDER BY i.timestamp DESC, i.iid DESC', 0, $this->configuration['block_count'], array(':cid' => $category->cid)); $result = $this->connection->queryRange('SELECT i.* FROM {aggregator_category_item} ci LEFT JOIN {aggregator_item} i ON ci.iid = i.iid WHERE ci.cid = :cid ORDER BY i.timestamp DESC, i.iid DESC', 0, $this->configuration['block_count'], array(':cid' => $category->cid));
$more_link = array( $more_link = array(
'#theme' => 'more_link', '#theme' => 'more_link',
'#url' => 'aggregator/categories/' . $category->cid, '#url' => 'aggregator/categories/' . $category->cid,
......
...@@ -10,17 +10,69 @@ ...@@ -10,17 +10,69 @@
use Drupal\block\BlockBase; use Drupal\block\BlockBase;
use Drupal\block\Annotation\Block; use Drupal\block\Annotation\Block;
use Drupal\Core\Annotation\Translation; use Drupal\Core\Annotation\Translation;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityStorageControllerInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/** /**
* Provides an 'Aggregator feed' block with the latest items from the feed. * Provides an 'Aggregator feed' block with the latest items from the feed.
* *
* @Block( * @Block(
* id = "aggregator_feed_block", * id = "aggregator_feed_block",
* admin_label = @Translation("Aggregator feed"), * admin_label = @Translation("Aggregator feed")
* derivative = "Drupal\aggregator\Plugin\Derivative\AggregatorFeedBlock"
* ) * )
*/ */
class AggregatorFeedBlock extends BlockBase { class AggregatorFeedBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The entity storage controller for feeds.
*
* @var \Drupal\Core\Entity\EntityStorageControllerInterface
*/
protected $storageController;
/**
* The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $connection;
/**
* Constructs an AggregatorFeedBlock object.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param array $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller
* The entity storage controller for feeds.
* @param \Drupal\Core\Database\Connection $connection
* The database connection.
*/
public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityStorageControllerInterface $storage_controller, Connection $connection) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->storageController = $storage_controller;
$this->connection = $connection;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, array $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('plugin.manager.entity')->getStorageController('aggregator_feed'),
$container->get('database')
);
}
/** /**
* {@inheritdoc} * {@inheritdoc}
...@@ -29,6 +81,7 @@ public function defaultConfiguration() { ...@@ -29,6 +81,7 @@ public function defaultConfiguration() {
// By default, the block will contain 10 feed items. // By default, the block will contain 10 feed items.
return array( return array(
'block_count' => 10, 'block_count' => 10,
'feed' => NULL,
); );
} }
...@@ -44,6 +97,17 @@ public function access() { ...@@ -44,6 +97,17 @@ public function access() {
* Overrides \Drupal\block\BlockBase::blockForm(). * Overrides \Drupal\block\BlockBase::blockForm().
*/ */
public function blockForm($form, &$form_state) { public function blockForm($form, &$form_state) {
$feeds = $this->storageController->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,
);
$form['block_count'] = array( $form['block_count'] = array(
'#type' => 'select', '#type' => 'select',
'#title' => t('Number of news items in block'), '#title' => t('Number of news items in block'),
...@@ -58,19 +122,19 @@ public function blockForm($form, &$form_state) { ...@@ -58,19 +122,19 @@ public function blockForm($form, &$form_state) {
*/ */
public function blockSubmit($form, &$form_state) { public function blockSubmit($form, &$form_state) {
$this->configuration['block_count'] = $form_state['values']['block_count']; $this->configuration['block_count'] = $form_state['values']['block_count'];
$this->configuration['feed'] = $form_state['values']['feed'];
} }
/** /**
* {@inheritdoc} * {@inheritdoc}
*/ */
public function build() { public function build() {
// Plugin IDs look something like this: aggregator_feed_block:1. // Load the selected feed.
list(, $id) = explode(':', $this->getPluginId()); if ($feed = $this->storageController->load($this->configuration['feed'])) {
if ($feed = db_query('SELECT fid, title, block FROM {aggregator_feed} WHERE block <> 0 AND fid = :fid', array(':fid' => $id))->fetchObject()) { $result = $this->connection->queryRange("SELECT * FROM {aggregator_item} WHERE fid = :fid ORDER BY timestamp DESC, iid DESC", 0, $this->configuration['block_count'], array(':fid' => $feed->id()));
$result = db_query_range("SELECT * FROM {aggregator_item} WHERE fid = :fid ORDER BY timestamp DESC, iid DESC", 0, $this->configuration['block_count'], array(':fid' => $id));
$more_link = array( $more_link = array(
'#theme' => 'more_link', '#theme' => 'more_link',
'#url' => 'aggregator/sources/' . $feed->fid, '#url' => 'aggregator/sources/' . $feed->id(),
'#title' => t("View this feed's recent news."), '#title' => t("View this feed's recent news."),
); );
$read_more = drupal_render($more_link); $read_more = drupal_render($more_link);
...@@ -91,6 +155,7 @@ public function build() { ...@@ -91,6 +155,7 @@ public function build() {
return array( return array(
'#children' => drupal_render($item_list) . $read_more, '#children' => drupal_render($item_list) . $read_more,
); );
return $build;
} }
} }
} }
......
<?php
/**
* @file
* Contains \Drupal\aggregator\Plugin\Derivative\AggregatorCategoryBlock.
*/
namespace Drupal\aggregator\Plugin\Derivative;
use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides block plugin definitions for aggregator categories.
*
* @see \Drupal\aggregator\Plugin\block\block\AggregatorCategoryBlock
*/
class AggregatorCategoryBlock implements ContainerDerivativeInterface {
/**
* List of derivative definitions.
*
* @var array
*/
protected $derivatives = array();
/**
* The base plugin ID this derivative is for.
*
* @var string
*/
protected $basePluginId;
/**
* The database connection.
*
* @var \Drupal\Core\Database\Connection
*/
protected $connection;
/**
* The translation manager.
*
* @var \Drupal\Core\StringTranslation\TranslationInterface
*/
protected $translationManager;
/**
* Constructs a AggregatorCategoryBlock object.
*
* @param string $base_plugin_id
* The base plugin ID.
* @param \Drupal\Core\Database\Connection $connection
* The database connection.
* @param \Drupal\Core\StringTranslation\TranslationInterface $translation_manager
* The translation manager.
*/
public function __construct($base_plugin_id, Connection $connection, TranslationInterface $translation_manager) {
$this->basePluginId = $base_plugin_id;
$this->connection = $connection;
$this->translationManager = $translation_manager;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, $base_plugin_id) {
return new static(
$base_plugin_id,
$container->get('database'),
$container->get('string_translation')
);
}
/**
* Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinition().
*/
public function getDerivativeDefinition($derivative_id, array $base_plugin_definition) {
if (!empty($this->derivatives) && !empty($this->derivatives[$derivative_id])) {
return $this->derivatives[$derivative_id];
}
$result = $this->connection->query('SELECT cid, title FROM {aggregator_category} ORDER BY title WHERE cid = :cid', array(':cid' => $derivative_id))->fetchObject();
$this->derivatives[$derivative_id] = $base_plugin_definition;
$this->derivatives[$derivative_id]['admin_label'] = $this->t('@title category latest items', array('@title' => $result->title));
return $this->derivatives[$derivative_id];
}
/**
* Implements \Drupal\Component\Plugin\Derivative\DerivativeInterface::getDerivativeDefinitions().
*/
public function getDerivativeDefinitions(array $base_plugin_definition) {
// Provide a block plugin definition for each aggregator category.
$result = $this->connection->query('SELECT cid, title FROM {aggregator_category} ORDER BY title');
foreach ($result as $category) {
$this->derivatives[$category->cid] = $base_plugin_definition;
$this->derivatives[$category->cid]['admin_label'] = $this->t('@title category latest items', array('@title' => $category->title));
}
return $this->derivatives;
}
/**
* Translates a string to the current language or to a given language.
*
* See the t() documentation for details.
*/
protected function t($string, array $args = array(), array $options = array()) {
return $this->translationManager->translate($string, $args, $options);
}
}
<?php
/**
* @file
* Contains \Drupal\aggregator\Plugin\Derivative\AggregatorFeedBlock.
*/
namespace Drupal\aggregator\Plugin\Derivative;
use Drupal\Core\Plugin\Discovery\ContainerDerivativeInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\StringTranslation\TranslationInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides block plugin definitions for aggregator feeds.
*
* @see \Drupal\aggregator\Plugin\block\block\AggregatorFeedBlock
*/
class AggregatorFeedBlock implements ContainerDerivativeInterface {
/**
* List of derivative definitions.
*
* @var array
*/
protected $derivatives = array();
/**
* The base plugin ID this derivative is for.
*
* @var string
*/