diff --git a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php index 299113c..7a39a98 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageController.php @@ -98,4 +98,31 @@ public function isUnique($title, $cid = NULL) { return (empty($rows)); } + /** + * {@inheritdoc} + */ + public function loadByItem($item_id) { + return $this->database->query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = :iid', array(':iid' => $item_id)); + } + + /** + * {@inheritdoc} + */ + public function updateCategoriesForItem($iid, array $cids) { + // Remove all existing category items. + $this->database->delete('aggregator_category_item') + ->condition('iid', $iid) + ->execute(); + + // Insert new category items. + if (!empty($cids)) { + $insert = $this->database->insert('aggregator_category_item') + ->fields(array('iid', 'cid')); + foreach ($cids as $cid) { + $insert->values(array('iid' => $iid, 'cid' => $cid)); + } + $insert->execute(); + } + } + } diff --git a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php index a4ab4db..cd52660 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/CategoryStorageControllerInterface.php @@ -66,5 +66,26 @@ public function delete($cid); */ public function isUnique($title, $cid = NULL); + /** + * Loads aggregator categories for an aggregator item. + * + * @param int $item_id + * The aggregator item ID. + * + * @return array + * An array of objects containing item ID, category ID and title. + */ + public function loadByItem($item_id); + + /** + * Updates the categories for an aggregator item. + * + * @param int $iid + * The aggregator item ID. + * @param array $cids + * The category IDs. + */ + public function updateCategoriesForItem($iid, array $cids); + } diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php b/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php index 74f4347..eaf4e9f 100644 --- a/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php +++ b/core/modules/aggregator/lib/Drupal/aggregator/Form/AggregatorCategorizeFormBase.php @@ -7,11 +7,11 @@ namespace Drupal\aggregator\Form; +use Drupal\aggregator\CategoryStorageControllerInterface; use Drupal\aggregator\FeedInterface; use Drupal\aggregator\ItemStorageControllerInterface; use Drupal\Component\Utility\String; use Drupal\Core\Config\Config; -use Drupal\Core\Database\Connection; use Drupal\Core\Entity\EntityRenderControllerInterface; use Drupal\Core\Form\FormBase; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -36,18 +36,18 @@ protected $config; /** - * The database connection. + * The aggregator item storage controller. * - * @var \Drupal\Core\Database\Connection; + * @var \Drupal\aggregator\ItemStorageControllerInterface */ - protected $database; + protected $aggregatorItemStorage; /** - * The aggregator item storage controller. + * The aggregator category storage controller. * - * @var \Drupal\aggregator\ItemStorageControllerInterface + * @var \Drupal\aggregator\CategoryStorageControllerInterface */ - protected $aggregatorItemStorage; + protected $categoryStorage; /** * The feed to use. @@ -61,18 +61,18 @@ * * @param \Drupal\Core\Entity\EntityRenderControllerInterface $aggregator_item_renderer * The item render controller. - * @param \Drupal\Core\Database\Connection $database - * The database connection. * @param \Drupal\Core\Config\Config $config * The aggregator config. * @param \Drupal\aggregator\ItemStorageControllerInterface $aggregator_item_storage * The aggregator item storage controller. + * @param \Drupal\aggregator\CategoryStorageControllerInterface $category_storage + * The category storage controller. */ - public function __construct(EntityRenderControllerInterface $aggregator_item_renderer, Connection $database, Config $config, ItemStorageControllerInterface $aggregator_item_storage) { + public function __construct(EntityRenderControllerInterface $aggregator_item_renderer, Config $config, ItemStorageControllerInterface $aggregator_item_storage, CategoryStorageControllerInterface $category_storage) { $this->aggregatorItemRenderer = $aggregator_item_renderer; - $this->database = $database; $this->config = $config; $this->aggregatorItemStorage = $aggregator_item_storage; + $this->categoryStorage = $category_storage; } /** @@ -81,9 +81,9 @@ public function __construct(EntityRenderControllerInterface $aggregator_item_ren public static function create(ContainerInterface $container) { return new static( $container->get('plugin.manager.entity')->getRenderController('aggregator_item'), - $container->get('database'), $container->get('config.factory')->get('aggregator.settings'), - $container->get('plugin.manager.entity')->getStorageController('aggregator_item') + $container->get('plugin.manager.entity')->getStorageController('aggregator_item'), + $container->get('aggregator.category.storage') ); } @@ -104,7 +104,7 @@ public function buildForm(array $form, array &$form_state, array $items = NULL) ); if ($items && ($form_items = $this->aggregatorItemRenderer->viewMultiple($items, 'default'))) { foreach (element_children($form_items) as $iid) { - $categories_result = $this->database->query('SELECT c.cid, c.title, ci.iid FROM {aggregator_category} c LEFT JOIN {aggregator_category_item} ci ON c.cid = ci.cid AND ci.iid = :iid', array(':iid' => $iid)); + $categories_result = $this->categoryStorage->loadByItem($iid); $selected = array(); foreach ($categories_result as $category) { @@ -144,25 +144,8 @@ public function buildForm(array $form, array &$form_state, array $items = NULL) */ public function submitForm(array &$form, array &$form_state) { if (!empty($form_state['values']['categories'])) { - foreach ($form_state['values']['categories'] as $iid => $selection) { - $this->database->delete('aggregator_category_item') - ->condition('iid', $iid) - ->execute(); - $insert = $this->database->insert('aggregator_category_item') - ->fields(array('iid', 'cid')); - $has_values = FALSE; - foreach ($selection as $cid) { - if ($cid && $iid) { - $has_values = TRUE; - $insert->values(array( - 'iid' => $iid, - 'cid' => $cid, - )); - } - } - if ($has_values) { - $insert->execute(); - } + foreach ($form_state['values']['categories'] as $iid => $cids) { + $this->categoryStorage->updateCategoriesForItem($iid, $cids); } } drupal_set_message($this->t('The categories have been saved.'));