diff --git a/lib/Drupal/views/Plugin/views_ui_listing/listing/ViewListing.php b/lib/Drupal/views/ViewListController.php similarity index 77% rename from lib/Drupal/views/Plugin/views_ui_listing/listing/ViewListing.php rename to lib/Drupal/views/ViewListController.php index 4ec9138..badfcef 100644 --- a/lib/Drupal/views/Plugin/views_ui_listing/listing/ViewListing.php +++ b/lib/Drupal/views/ViewListController.php @@ -2,40 +2,36 @@ /** * @file - * Definition of Drupal\views\Plugin\views_ui_listing\listing\ViewListing; + * Definition of Drupal\views\ViewListController. */ -namespace Drupal\views\Plugin\views_ui_listing\listing; +namespace Drupal\views; -use Drupal\views_ui_listing\Plugin\ConfigEntityListingBase; -use Drupal\Core\Annotation\Plugin; -use Drupal\Core\Annotation\Translation; +use Drupal\views_ui_listing\EntityListControllerBase; use Drupal\entity\EntityInterface; /** * Provides a listing of Views. - * - * @Plugin( - * id = "view", - * entity_type = "view", - * path = "admin/structure/views", - * page_title = @Translation("Views"), - * page_description = @Translation("Manage customized lists of content.") - * ) */ -class ViewListing extends ConfigEntityListingBase { +class ViewListController extends EntityListControllerBase { + + public function __construct($entity_type, $entity_info = FALSE) { + parent::__construct($entity_type, $entity_info); + } /** - * Overrides Drupal\config\Plugin\ConfigEntityListingBase::hookMenu(); + * Overrides Drupal\views_ui_listing\EntityListControllerBase::hookMenu(); */ public function hookMenu() { // Find the path and the number of path arguments. - $path = $this->definition['path']; + $path = $this->entityInfo['list path']; $path_count = count(explode('/', $path)); $items = parent::hookMenu(); // Override the access callback. // @todo Probably won't need to specify user access. + $items[$path]['title'] = 'Views'; + $items[$path]['description'] = 'Manage customized lists of content.'; $items[$path]['access callback'] = 'user_access'; $items[$path]['access arguments'] = array('administer views'); @@ -61,7 +57,7 @@ public function hookMenu() { } /** - * Overrides Drupal\config\Plugin\ConfigEntityListingBase::getList(); + * Overrides Drupal\views_ui_listing\EntityListControllerBase::getList(); */ public function getList() { $list = parent::getList(); @@ -77,7 +73,7 @@ public function getList() { } /** - * Overrides Drupal\config\Plugin\ConfigEntityListingBase::getRowData(); + * Overrides Drupal\views_ui_listing\EntityListControllerBase::getRowData(); */ public function getRowData(EntityInterface $view) { $operations = $this->buildActionLinks($view); @@ -96,7 +92,7 @@ public function getRowData(EntityInterface $view) { } /** - * Overrides Drupal\config\Plugin\ConfigEntityListingBase::getRowData(); + * Overrides Drupal\views_ui_listing\EntityListControllerBase::getRowData(); */ public function getHeaderData() { return array( @@ -124,10 +120,10 @@ public function getHeaderData() { } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::defineActionLinks(); + * Implements Drupal\views_ui_listing\Plugin\EntityListControllerInterface::defineActionLinks(); */ public function defineActionLinks(EntityInterface $view) { - $path = $this->definition['path'] . '/view/' . $view->id(); + $path = $this->entityInfo['list path'] . '/view/' . $view->id(); $enabled = $view->isEnabled(); if (!$enabled) { @@ -167,7 +163,7 @@ public function defineActionLinks(EntityInterface $view) { } /** - * Overrides Drupal\config\Plugin\ConfigEntityListingBase::renderList(); + * Overrides Drupal\views_ui_listing\EntityListControllerBase::renderList(); */ public function renderList() { $list = parent::renderList(); diff --git a/views.module b/views.module index fb0bb77..d5c69cd 100644 --- a/views.module +++ b/views.module @@ -89,6 +89,8 @@ function views_entity_info() { 'label' => t('View'), 'entity class' => 'Drupal\views\View', 'controller class' => 'Drupal\views\ViewStorageController', + 'list controller class' => 'Drupal\views\ViewListController', + 'list path' => 'admin/structure/views', 'form controller class' => array( 'default' => 'Drupal\node\NodeFormController', ), diff --git a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingBase.php b/views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerBase.php similarity index 55% rename from views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingBase.php rename to views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerBase.php index 79d79df..c1784e4 100644 --- a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingBase.php +++ b/views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerBase.php @@ -1,87 +1,90 @@ definition = $this->getDefinition(); - $this->controller = entity_get_controller($this->definition['entity_type']); + public function __construct($entity_type, $entity_info = FALSE) { + $this->entityType = $entity_type; + $this->storage = entity_get_controller($entity_type); + if (!$entity_info) { + $entity_info = entity_get_info($entity_type); + } + $this->entityInfo = $entity_info; } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::getList(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::getList(); */ public function getList() { - return $this->controller->load(); + return $this->storage->load(); } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::getController(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::getStorageController(); */ - public function getController() { - return $this->controller; + public function getStorageController() { + return $this->storage; } public function getPath() { - return $this->definition['path']; + return $this->entityInfo['list path']; } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::hookMenu(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::hookMenu(); */ public function hookMenu() { - $definition = $this->definition; - - return array( - $definition['path'] => array( - 'title' => $definition['page_title'], - 'description' => $definition['page_description'], - 'page callback' => 'views_ui_listing_entity_listing_page', - 'page arguments' => array($definition['id']), - // @todo Add a proper access callback here. - 'access callback' => TRUE, - ), + $items = array(); + $items[$this->entityInfo['list path']] = array( + 'page callback' => 'views_ui_listing_entity_listing_page', + 'page arguments' => array($this->entityType), + // @todo Add a proper access callback here. + 'access callback' => TRUE, ); + return $items; } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::getRowData(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::getRowData(); */ public function getRowData(EntityInterface $entity) { $row = array(); @@ -95,7 +98,7 @@ public function getRowData(EntityInterface $entity) { } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::getHeaderData(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::getHeaderData(); */ public function getHeaderData() { $row = array(); @@ -106,7 +109,7 @@ public function getHeaderData() { } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::buildActionLinks(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::buildActionLinks(); */ public function buildActionLinks(EntityInterface $entity) { $links = array(); @@ -136,7 +139,7 @@ public function buildActionLinks(EntityInterface $entity) { } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::renderList(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::renderList(); */ public function renderList() { $rows = array(); @@ -161,7 +164,7 @@ public function renderList() { } /** - * Implements Drupal\config\Plugin\ConfigEntityListingInterface::renderList(); + * Implements Drupal\config\Plugin\EntityListControllerInterface::renderList(); */ public function renderListAJAX() { $list = $this->renderList(); diff --git a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingInterface.php b/views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerInterface.php similarity index 88% rename from views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingInterface.php rename to views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerInterface.php index b631bb0..41bc9dd 100644 --- a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/ConfigEntityListingInterface.php +++ b/views_ui_listing/lib/Drupal/views_ui_listing/EntityListControllerInterface.php @@ -2,17 +2,17 @@ /** * @file - * Definition of Drupal\views_ui_listing\Plugin\ConfigEntityListingInterface. + * Definition of Drupal\views_ui_listing\EntityListControllerInterface. */ -namespace Drupal\views_ui_listing\Plugin; +namespace Drupal\views_ui_listing; use Drupal\entity\EntityInterface; /** * Defines an interface for Configuration entity listing plugins. */ -interface ConfigEntityListingInterface { +interface EntityListControllerInterface { /* * Returns a list of all available config entites of this type. @@ -24,7 +24,7 @@ public function getList(); * * @todo Put in correct namespace and docs here. */ - public function getController(); + public function getStorageController(); /** * Gets the hook_menu array item. diff --git a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/Type/ConfigEntityListingManager.php b/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/Type/ConfigEntityListingManager.php deleted file mode 100644 index f8d4162..0000000 --- a/views_ui_listing/lib/Drupal/views_ui_listing/Plugin/Type/ConfigEntityListingManager.php +++ /dev/null @@ -1,25 +0,0 @@ -discovery = new CacheDecorator(new AnnotatedClassDiscovery('views_ui_listing', 'listing'), 'views:listing', 'cache'); - $this->factory = new DefaultFactory($this); - } - -} diff --git a/views_ui_listing/lib/Drupal/views_ui_listing/Tests/ConfigEntityListingTest.php b/views_ui_listing/lib/Drupal/views_ui_listing/Tests/ConfigEntityListingTest.php index 49b29cc..09e1e7f 100644 --- a/views_ui_listing/lib/Drupal/views_ui_listing/Tests/ConfigEntityListingTest.php +++ b/views_ui_listing/lib/Drupal/views_ui_listing/Tests/ConfigEntityListingTest.php @@ -36,30 +36,10 @@ public static function getInfo() { * Tests basic listing plugin functionilty. */ function testListingPlugin() { - // Test we can get a new manager instance. - $listing_manager = new ConfigEntityListingManager(); - $this->assertTrue($listing_manager instanceof ConfigEntityListingManager, 'ConfigEntityListingManager class created.'); - - // Test the definition data. - $definitions = $listing_manager->getDefinitions(); - - $this->assertTrue(array_key_exists('config_test', $definitions), 'Config test definition exists.'); - - $expected = array( - 'id' => 'config_test', - 'entity_type' => 'config_test', - 'path' => 'config-listing-test', - 'page_title' => 'Config test', - 'page_description' => 'Config test listing page', - 'class' => 'Drupal\\views_ui_listing_test\\Plugin\\views_ui_listing\\listing\\ConfigTestConfigEntityListing', - ); - $this->assertEqual($definitions['config_test'], $expected, 'Plugin definition matches the expected definition.'); - - $instance = $listing_manager->createInstance('config_test'); - $this->assertTrue($instance instanceof ConfigTestConfigEntityListing, 'ConfigTestConfigEntityListing plugin instance created.'); + $controller = views_ui_listing_get_list_controller('config_test'); // Get a list of Config entities. - $list = $instance->getList(); + $list = $controller->getList(); $this->assertEqual(count($list), 1, 'Correct number of plugins found.'); $this->assertTrue(!empty($list['default']), '"Default" config entity key found in list.'); $this->assertTrue($list['default'] instanceof ConfigEntityBase, '"Default" config entity is an instance of ConfigEntityBase'); diff --git a/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/ConfigTestListController.php b/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/ConfigTestListController.php new file mode 100644 index 0000000..05432cf --- /dev/null +++ b/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/ConfigTestListController.php @@ -0,0 +1,55 @@ +entityInfo['list path']; + + $items = parent::hookMenu(); + $items[$path]['title'] = 'Config test'; + $items[$path]['description'] = 'Config test listing page.'; + return $items; + } + + /** + * Implements Drupal\views_ui_listing\EntityListControllerInterface::actionLinkMappings(). + */ + public function defineActionLinks(EntityInterface $entity) { + $id = $entity->id(); + + // @todo Add AJAX link to test. + return array( + 'edit' => array( + 'title' => 'edit', + 'href' => "admin/structure/config_test/manage/$id/edit", + 'ajax' => FALSE, + ), + 'add' => array( + 'title' => 'add', + 'href' => "admin/structure/config_test/add", + 'ajax' => FALSE, + ), + 'delete' => array( + 'title' => 'delete', + 'href' => "admin/structure/config_test/manage/$id/delete", + 'ajax' => FALSE, + ), + ); + } + +} diff --git a/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/Plugin/views_ui_listing/listing/ConfigTestConfigEntityListing.php b/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/Plugin/views_ui_listing/listing/ConfigTestConfigEntityListing.php deleted file mode 100644 index 330a054..0000000 --- a/views_ui_listing/tests/views_ui_listing_test/lib/Drupal/views_ui_listing_test/Plugin/views_ui_listing/listing/ConfigTestConfigEntityListing.php +++ /dev/null @@ -1,56 +0,0 @@ -id(); - - // @todo Add AJAX link to test. - return array( - 'edit' => array( - 'title' => 'edit', - 'href' => "admin/structure/config_test/manage/$id/edit", - 'ajax' => FALSE, - ), - 'add' => array( - 'title' => 'add', - 'href' => "admin/structure/config_test/add", - 'ajax' => FALSE, - ), - 'delete' => array( - 'title' => 'delete', - 'href' => "admin/structure/config_test/manage/$id/delete", - 'ajax' => FALSE, - ), - ); - } - -} diff --git a/views_ui_listing/views_ui_listing.module b/views_ui_listing/views_ui_listing.module index 7f55f5b..a166cb3 100644 --- a/views_ui_listing/views_ui_listing.module +++ b/views_ui_listing/views_ui_listing.module @@ -1,7 +1,6 @@ getDefinitions() as $definition) { - $listing = $listing_manager->createInstance($definition['id']); - $items += $listing->hookMenu(); + foreach (entity_get_info() as $entity_type => $type_info) { + if (isset($type_info['list controller class'])) { + $controller = views_ui_listing_get_list_controller($entity_type); + $items += $controller->hookMenu(); + } } - return $items; } /** - * Page callback: Displays a config listing page. - * - * @param string $plugin_id - * The config entity plugin ID. + * Gets the entity list controller class for an entity type. * - * @return string - * The page markup for the page. + * @return Drupal\entity\EntityListControllerInterface */ -function views_ui_listing_entity_listing_page($plugin_id) { - $listing = views_ui_listing_get_plugin($plugin_id); - return $listing->renderList(); +function views_ui_listing_get_list_controller($entity_type) { + $controllers = &drupal_static(__FUNCTION__, array()); + if (!isset($controllers[$entity_type])) { + $type_info = entity_get_info($entity_type); + $class = $type_info['list controller class']; + $controllers[$entity_type] = new $class($entity_type); + } + return $controllers[$entity_type]; } /** - * Gets an instance of a listing plugin. + * Page callback: Displays a config listing page. * - * @param string $plugin_id - * The config entity plugin ID. + * @param string $entity_id + * The entity type. * - * @return Drupal\config\Plugin\ConfigEntityListingInterface - * @ + * @return string + * The page markup for the page. */ -function views_ui_listing_get_plugin($plugin_id) { - // @todo Add some error handling here, or in the manager class. - $listing_manager = new ConfigEntityListingManager(); - return $listing_manager->createInstance($plugin_id); +function views_ui_listing_entity_listing_page($entity_id) { + $controller = views_ui_listing_get_list_controller($entity_id); + return $controller->renderList(); } /** * Page callback: Calls a method on a config entity and reloads the listing page. * - * @param Drupal\views_ui_listing\Plugin\ConfigEntityListingInterface $listing - * The listing plugin instance for this entity. + * @param Drupal\views_ui_listing\EntityListControllerInterface $controller + * The list controller for this entity. * @param Drupal\config\ConfigEntityInterface $entity * The config entity being acted upon. * @param string $op @@ -63,16 +60,24 @@ function views_ui_listing_get_plugin($plugin_id) { * Either returns the listing page as JSON, or calls drupal_goto() to * redirect back to the listing page. */ -function views_ui_listing_ajax_callback(ConfigEntityListingInterface $listing, ConfigEntityInterface $entity, $op) { +function views_ui_listing_ajax_callback(EntityListControllerInterface $controller, ConfigEntityInterface $entity, $op) { // Perform the operation. $entity->$op(); // If the request is via AJAX, return the rendered list as JSON. if (drupal_container()->get('request')->request->get('js')) { - return $listing->renderListAJAX(); + return $controller->renderListAJAX(); } // Otherwise, redirect back to the page. else { - drupal_goto($listing->getPath()); + drupal_goto($controller->getPath()); } } + +/** + * Implements hook_entity_info_alter(). + */ +function views_ui_listing_entity_info_alter(&$entity_info) { + $entity_info['config_test']['list path'] = 'config-listing-test'; + $entity_info['config_test']['list controller class'] = 'Drupal\views_ui_listing_test\ConfigTestListController'; +}