Revert "Issue #2165725 by Xano: Introduce hook_entity_operation()."

This reverts commit 2cf87103b5.
8.0.x
catch 2014-03-26 19:53:12 +01:00
parent 2fe3785c48
commit 24526aedd0
25 changed files with 71 additions and 191 deletions

View File

@ -30,9 +30,8 @@ class ConfigEntityListBuilder extends EntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
/** @var \Drupal\Core\Config\Entity\ConfigEntityInterface $entity */
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if ($this->entityType->hasKey('status')) {
if (!$entity->status() && $entity->hasLinkTemplate('enable')) {

View File

@ -93,25 +93,6 @@ class EntityListBuilder extends EntityControllerBase implements EntityListBuilde
* {@inheritdoc}
*/
public function getOperations(EntityInterface $entity) {
$operations = $this->getDefaultOperations($entity);
$operations += $this->moduleHandler()->invokeAll('entity_operation', array($entity));
$this->moduleHandler->alter('entity_operation', $operations, $entity);
uasort($operations, '\Drupal\Component\Utility\SortArray::sortByWeightElement');
return $operations;
}
/**
* Gets this list's default operations.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity the operations are for.
*
* @return array
* The array structure is identical to the return value of
* self::getOperations().
*/
protected function getDefaultOperations(EntityInterface $entity) {
$operations = array();
if ($entity->access('update') && $entity->hasLinkTemplate('edit-form')) {
$operations['edit'] = array(
@ -170,11 +151,14 @@ class EntityListBuilder extends EntityControllerBase implements EntityListBuilde
* @see \Drupal\Core\Entity\EntityListBuilder::buildRow()
*/
public function buildOperations(EntityInterface $entity) {
// Retrieve and sort operations.
$operations = $this->getOperations($entity);
$this->moduleHandler()->alter('entity_operation', $operations, $entity);
uasort($operations, array('Drupal\Component\Utility\SortArray', 'sortByWeightElement'));
$build = array(
'#type' => 'operations',
'#links' => $this->getOperations($entity),
'#links' => $operations,
);
return $build;
}

View File

@ -101,8 +101,8 @@ class ActionListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = $entity->isConfigurable() ? parent::getDefaultOperations($entity) : array();
public function getOperations(EntityInterface $entity) {
$operations = $entity->isConfigurable() ? parent::getOperations($entity) : array();
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('Configure');
}

View File

@ -36,8 +36,8 @@ class CustomBlockListBuilder extends EntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['query']['destination'] = 'admin/structure/block/custom-blocks';
}

View File

@ -20,8 +20,8 @@ class CustomBlockTypeListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
// Place the edit operation after the operations added by field_ui.module
// which have the weights 15, 20, 25.
if (isset($operations['edit'])) {

View File

@ -378,8 +378,8 @@ class BlockListBuilder extends ConfigEntityListBuilder implements FormInterface
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('Configure');

View File

@ -159,18 +159,15 @@ function config_translation_config_translation_info(&$info) {
}
/**
* Implements hook_entity_operation().
* Implements hook_entity_operation_alter().
*/
function config_translation_entity_operation(EntityInterface $entity) {
$operations = array();
function config_translation_entity_operation_alter(array &$operations, EntityInterface $entity) {
if (\Drupal::currentUser()->hasPermission('translate configuration')) {
$operations['translate'] = array(
'title' => t('Translate'),
'weight' => 50,
) + $entity->urlInfo('drupal:config-translation-overview');
}
return $operations;
}
/**

View File

@ -83,13 +83,13 @@ class ConfigTranslationEntityListBuilder extends EntityListBuilder implements Co
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
foreach (array_keys($operations) as $operation) {
public function buildOperations(EntityInterface $entity) {
$operations = parent::buildOperations($entity);
foreach (array_keys($operations['#links']) as $operation) {
// This is a translation UI for translators. Show the translation
// operation only.
if (!($operation == 'translate')) {
unset($operations[$operation]);
unset($operations['#links'][$operation]);
}
}
return $operations;

View File

@ -23,7 +23,6 @@ use Drupal\field\FieldInstanceConfigInterface;
* id = "field_instance_config",
* label = @Translation("Field instance"),
* controllers = {
* "list_builder" = "\Drupal\Core\Config\Entity\ConfigEntityListBuilder",
* "storage" = "Drupal\field\FieldInstanceConfigStorageController"
* },
* config_prefix = "instance",

View File

@ -172,10 +172,9 @@ function field_ui_form_node_type_form_alter(&$form, $form_state) {
}
/**
* Implements hook_entity_operation().
* Implements hook_entity_operation_alter().
*/
function field_ui_entity_operation(EntityInterface $entity) {
$operations = array();
function field_ui_entity_operation_alter(array &$operations, EntityInterface $entity) {
$info = $entity->getEntityType();
// Add manage fields and display links if this entity type is the bundle
// of another.
@ -199,8 +198,6 @@ function field_ui_entity_operation(EntityInterface $entity) {
) + $entity->urlInfo('field_ui-display');
}
}
return $operations;
}
/**

View File

@ -7,7 +7,6 @@
namespace Drupal\field_ui;
use Drupal\Core\Entity\EntityListBuilderInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Field\FieldTypePluginManagerInterface;
@ -27,6 +26,13 @@ class FieldOverview extends OverviewBase {
*/
protected $fieldTypeManager;
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a new FieldOverview.
*
@ -34,10 +40,13 @@ class FieldOverview extends OverviewBase {
* The entity manager.
* @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager
* The field type manager
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler to invoke hooks on.
*/
public function __construct(EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager) {
public function __construct(EntityManagerInterface $entity_manager, FieldTypePluginManagerInterface $field_type_manager, ModuleHandlerInterface $module_handler) {
parent::__construct($entity_manager);
$this->fieldTypeManager = $field_type_manager;
$this->moduleHandler = $module_handler;
}
/**
@ -46,7 +55,8 @@ class FieldOverview extends OverviewBase {
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity.manager'),
$container->get('plugin.manager.field.field_type')
$container->get('plugin.manager.field.field_type'),
$container->get('module_handler')
);
}
@ -154,9 +164,11 @@ class FieldOverview extends OverviewBase {
'route_parameters' => $route_parameters,
'attributes' => array('title' => $this->t('Delete instance.')),
);
// Allow altering the operations on this entity listing.
$this->moduleHandler->alter('entity_operation', $links, $instance);
$table[$name]['operations']['data'] = array(
'#type' => 'operations',
'#links' => $this->entityManager->getListBuilder('field_instance_config')->getOperations($instance),
'#links' => $links,
);
if (!empty($field->locked)) {

View File

@ -118,8 +118,8 @@ class FilterFormatListBuilder extends DraggableListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('Configure');

View File

@ -74,13 +74,13 @@ class ImageStyleListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
public function getOperations(EntityInterface $entity) {
$flush = array(
'title' => t('Flush'),
'weight' => 200,
) + $entity->urlInfo('flush-form');
return parent::getDefaultOperations($entity) + array('flush' => $flush);
return parent::getOperations($entity) + array('flush' => $flush);
}
/**

View File

@ -44,8 +44,8 @@ class LanguageListBuilder extends DraggableListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
$default = language_default();
// Deleting the site default language is not allowed.

View File

@ -45,8 +45,8 @@ class MenuListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('Edit menu');

View File

@ -124,8 +124,8 @@ class NodeListBuilder extends EntityListBuilder {
/**
* {@inheritdoc}
*/
protected function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
$destination = drupal_get_destination();
foreach ($operations as $key => $operation) {

View File

@ -83,8 +83,8 @@ class NodeTypeListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
// Place the edit operation after the operations added by field_ui.module
// which have the weights 15, 20, 25.
if (isset($operations['edit'])) {

View File

@ -36,8 +36,8 @@ class ResponsiveImageMappingListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
$operations['duplicate'] = array(
'title' => t('Duplicate'),
'weight' => 15,

View File

@ -260,9 +260,9 @@ class SearchPageListBuilder extends DraggableListBuilder implements FormInterfac
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
public function getOperations(EntityInterface $entity) {
/** @var $entity \Drupal\search\SearchPageInterface */
$operations = parent::getDefaultOperations($entity);
$operations = parent::getOperations($entity);
// Prevent the default search from being disabled or deleted.
if ($entity->isDefaultSearch()) {

View File

@ -28,8 +28,8 @@ class ShortcutSetListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('Edit shortcut set');

View File

@ -754,27 +754,6 @@ function hook_entity_bundle_field_info_alter(&$fields, \Drupal\Core\Entity\Entit
}
}
/**
* Declares entity operations.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity on which the linked operations will be performed.
*
* @return array
* An operations array as returned by
* \Drupal\Core\Entity\EntityListBuilderInterface::getOperations().
*/
function hook_entity_operation(\Drupal\Core\Entity\EntityInterface $entity) {
$operations = array();
$operations['translate'] = array(
'title' => t('Translate'),
'route_name' => 'foo_module.entity.translate',
'weight' => 50,
);
return $operations;
}
/**
* Alter entity operations.
*
@ -785,11 +764,10 @@ function hook_entity_operation(\Drupal\Core\Entity\EntityInterface $entity) {
* The entity on which the linked operations will be performed.
*/
function hook_entity_operation_alter(array &$operations, \Drupal\Core\Entity\EntityInterface $entity) {
// Alter the title and weight.
$operations['translate']['title'] = t('Translate @entity_type', array(
'@entity_type' => $entity->getEntityTypeId(),
));
$operations['translate']['weight'] = 99;
$operations['translate'] = array(
'title' => t('Translate'),
'weight' => 50,
) + $entity->urlInfo('my-custom-link-template');
}
/**

View File

@ -32,8 +32,8 @@ class VocabularyListBuilder extends DraggableListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if (isset($operations['edit'])) {
$operations['edit']['title'] = t('edit vocabulary');

View File

@ -43,8 +43,8 @@ class RoleListBuilder extends DraggableListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if ($entity->hasLinkTemplate('edit-permissions-form')) {
$operations['permissions'] = array(

View File

@ -135,8 +135,8 @@ class ViewListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function getDefaultOperations(EntityInterface $entity) {
$operations = parent::getDefaultOperations($entity);
public function getOperations(EntityInterface $entity) {
$operations = parent::getOperations($entity);
if ($entity->hasLinkTemplate('clone')) {
$operations['clone'] = array(

View File

@ -7,9 +7,7 @@
namespace Drupal\Tests\Core\Entity;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityListBuilder;
use Drupal\entity_test\EntityTestListBuilder;
use Drupal\Tests\UnitTestCase;
@ -22,41 +20,6 @@ use Drupal\Tests\UnitTestCase;
*/
class EntityListBuilderTest extends UnitTestCase {
/**
* The entity type used for testing.
*
* @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $entityType;
/**
* The module handler used for testing.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $moduleHandler;
/**
* The translation manager used for testing.
*
* @var \Drupal\Core\StringTranslation\TranslationInterface
*/
protected $translationManager;
/**
* The role storage used for testing.
*
* @var \Drupal\user\RoleStorageControllerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $roleStorage;
/**
* The service container used for testing.
*
* @var \Drupal\Core\DependencyInjection\ContainerBuilder
*/
protected $container;
/**
* The entity used to construct the EntityListBuilder.
*
@ -86,59 +49,10 @@ class EntityListBuilderTest extends UnitTestCase {
parent::setUp();
$this->role = $this->getMock('Drupal\user\RoleInterface');
$this->roleStorage = $this->getMock('\Drupal\user\RoleStorageControllerInterface');
$this->moduleHandler = $this->getMock('\Drupal\Core\Extension\ModuleHandlerInterface');
$this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
$this->translationManager = $this->getMock('\Drupal\Core\StringTranslation\TranslationInterface');
$this->entityListBuilder = new TestEntityListBuilder($this->entityType, $this->roleStorage, $this->moduleHandler);
$this->container = new ContainerBuilder();
\Drupal::setContainer($this->container);
}
/**
* @covers \Drupal\Core\Entity\EntityListBuilder::getOperations
*/
public function testGetOperations() {
$operation_name = $this->randomName();
$operations = array(
$operation_name => array(
'title' => $this->randomName(),
),
);
$this->moduleHandler->expects($this->once())
->method('invokeAll')
->with('entity_operation', array($this->role))
->will($this->returnValue($operations));
$this->moduleHandler->expects($this->once())
->method('alter')
->with('entity_operation');
$this->container->set('module_handler', $this->moduleHandler);
$this->role->expects($this->any())
->method('access')
->will($this->returnValue(TRUE));
$this->role->expects($this->any())
->method('hasLinkTemplate')
->will($this->returnValue(TRUE));
$this->role->expects($this->any())
->method('urlInfo')
->will($this->returnValue(array()));
$list = new EntityListBuilder($this->entityType, $this->roleStorage, $this->moduleHandler);
$list->setTranslationManager($this->translationManager);
$operations = $list->getOperations($this->role);
$this->assertInternalType('array', $operations);
$this->assertArrayHasKey('edit', $operations);
$this->assertInternalType('array', $operations['edit']);
$this->assertArrayHasKey('title', $operations['edit']);
$this->assertArrayHasKey('delete', $operations);
$this->assertInternalType('array', $operations['delete']);
$this->assertArrayHasKey('title', $operations['delete']);
$this->assertArrayHasKey($operation_name, $operations);
$this->assertInternalType('array', $operations[$operation_name]);
$this->assertArrayHasKey('title', $operations[$operation_name]);
$role_storage_controller = $this->getMock('Drupal\user\RoleStorageControllerInterface');
$module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
$entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface');
$this->entityListBuilder = new TestEntityListBuilder($entity_type, $role_storage_controller, $module_handler);
}
/**