diff --git a/core/includes/entity.api.php b/core/includes/entity.api.php index 726d1b1392318477b6b83042409531fdc47fd933..88a801586f57dae8f8a4ee20fb08e87e651aa004 100644 --- a/core/includes/entity.api.php +++ b/core/includes/entity.api.php @@ -451,6 +451,31 @@ function hook_entity_display_alter(\Drupal\entity\Plugin\Core\Entity\EntityDispl } } +/** + * Acts on an entity object about to be shown on an entity form. + * + * This can be typically used to pre-fill entity values or change the form state + * before the entity form is built. It is invoked just once when first building + * the entity form. Rebuilds will not trigger a new invocation. + * + * @param \Drupal\Core\Entity\EntityInterface $entity + * The entity that is about to be shown on the form. + * @param $form_display + * The current form display. + * @param $operation + * The current operation. + * @param array $form_state + * An associative array containing the current state of the form. + * + * @see \Drupal\Core\Entity\EntityFormController::prepareEntity() + */ +function hook_entity_prepare_form(\Drupal\Core\Entity\EntityInterface $entity, $form_display, $operation, array &$form_state) { + if ($operation == 'edit') { + $entity->label->value = 'Altered label'; + $form_state['mymodule']['label_altered'] = TRUE; + } +} + /** * Alters the settings used for displaying an entity form. * diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php index 1100fa8e3793396231d4f186682244189eeedcc9..21532501005a941fc94e75a9657bd2a1de7e9ffc 100644 --- a/core/lib/Drupal/Core/Entity/EntityFormController.php +++ b/core/lib/Drupal/Core/Entity/EntityFormController.php @@ -8,7 +8,9 @@ namespace Drupal\Core\Entity; use Drupal\entity\EntityFormDisplayInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\Language; +use Symfony\Component\DependencyInjection\ContainerInterface; /** * Base class for entity form controllers. @@ -25,6 +27,13 @@ class EntityFormController implements EntityFormControllerInterface { */ protected $operation; + /** + * The module handler service. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected $moduleHandler; + /** * The entity being used by this form. * @@ -35,11 +44,20 @@ class EntityFormController implements EntityFormControllerInterface { /** * Constructs an EntityFormController object. * - * @param string|null $operation - * (optional) The name of the current operation, defaults to NULL. + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. + */ + public function __construct(ModuleHandlerInterface $module_handler) { + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} */ - public function __construct($operation = NULL) { - $this->setOperation($operation); + public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { + return new static( + $container->get('module_handler') + ); } /** @@ -127,6 +145,7 @@ protected function init(array &$form_state) { // Add the controller to the form state so it can be easily accessed by // module-provided form handlers there. $form_state['controller'] = $this; + $this->prepareEntity(); $form_display = entity_get_render_form_display($this->entity, $this->getOperation()); @@ -137,9 +156,13 @@ protected function init(array &$form_state) { 'bundle' => $this->entity->bundle(), 'form_mode' => $this->getOperation(), ); - \Drupal::moduleHandler()->alter('entity_form_display', $form_display, $form_display_context); + $this->moduleHandler->alter('entity_form_display', $form_display, $form_display_context); $this->setFormDisplay($form_display, $form_state); + + // Invoke the prepare form hooks. + $this->prepareInvokeAll('entity_prepare_form', $form_state); + $this->prepareInvokeAll($this->entity->entityType() . '_prepare_form', $form_state); } /** @@ -466,6 +489,7 @@ public function buildEntity(array $form, array &$form_state) { * Implements \Drupal\Core\Entity\EntityFormControllerInterface::getEntity(). */ public function getEntity() { + // @todo Pick the proper translation object based on the form language here. return $this->entity; } @@ -480,8 +504,27 @@ public function setEntity(EntityInterface $entity) { /** * Prepares the entity object before the form is built first. */ - protected function prepareEntity() { - // @todo Perform common prepare operations and add a hook. + protected function prepareEntity() {} + + /** + * Invokes the specified prepare hook variant. + * + * @param string $hook + * The hook variant name. + * @param array $form_state + * An associative array containing the current state of the form. + */ + protected function prepareInvokeAll($hook, array &$form_state) { + $implementations = $this->moduleHandler->getImplementations($hook); + foreach ($implementations as $module) { + $function = $module . '_' . $hook; + if (function_exists($function)) { + // Ensure we pass an updated translation object and form display at + // each invocation, since they depend on form state which is alterable. + $args = array($this->getEntity(), $this->getFormDisplay($form_state), $this->operation, &$form_state); + call_user_func_array($function, $args); + } + } } /** diff --git a/core/lib/Drupal/Core/Entity/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php index c6561b64bb2ed8df622b4d3538776733fe8a01cf..648ec985a90b83c6c55f9058732cb8220e4b25fd 100644 --- a/core/lib/Drupal/Core/Entity/EntityManager.php +++ b/core/lib/Drupal/Core/Entity/EntityManager.php @@ -227,11 +227,11 @@ public function getFormController($entity_type, $operation) { $class = $this->getControllerClass($entity_type, 'form', $operation); if (in_array('Drupal\Core\Entity\EntityControllerInterface', class_implements($class))) { $this->controllers['form'][$operation][$entity_type] = $class::createInstance($this->container, $entity_type, $this->getDefinition($entity_type)); - $this->controllers['form'][$operation][$entity_type]->setOperation($operation); } else { - $this->controllers['form'][$operation][$entity_type] = new $class($operation); + $this->controllers['form'][$operation][$entity_type] = new $class($this->container->get('module_handler')); } + $this->controllers['form'][$operation][$entity_type]->setOperation($operation); } return $this->controllers['form'][$operation][$entity_type]; } diff --git a/core/modules/action/lib/Drupal/action/ActionAddFormController.php b/core/modules/action/lib/Drupal/action/ActionAddFormController.php index 85db8fed8263f8c5687dcf7a9ccddbf73cfdfaa7..56d7bbf6442d704afd1c5d26b4d872d292bda1a5 100644 --- a/core/modules/action/lib/Drupal/action/ActionAddFormController.php +++ b/core/modules/action/lib/Drupal/action/ActionAddFormController.php @@ -11,6 +11,7 @@ use Drupal\Core\Action\ActionManager; use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityStorageControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -28,13 +29,15 @@ class ActionAddFormController extends ActionFormControllerBase implements Entity /** * Constructs a new ActionAddFormController. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller * The action storage controller. * @param \Drupal\Core\Action\ActionManager $action_manager * The action plugin manager. */ - public function __construct(EntityStorageControllerInterface $storage_controller, ActionManager $action_manager) { - parent::__construct($storage_controller); + public function __construct(ModuleHandlerInterface $module_handler, EntityStorageControllerInterface $storage_controller, ActionManager $action_manager) { + parent::__construct($module_handler, $storage_controller); $this->actionManager = $action_manager; } @@ -44,6 +47,7 @@ public function __construct(EntityStorageControllerInterface $storage_controller */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.entity')->getStorageController($entity_type), $container->get('plugin.manager.action') ); diff --git a/core/modules/action/lib/Drupal/action/ActionFormControllerBase.php b/core/modules/action/lib/Drupal/action/ActionFormControllerBase.php index c5d58e6094e54d182a601601931ee00742100a74..d1a916d90938f19fd46439fc2a2de3f7512fbdb8 100644 --- a/core/modules/action/lib/Drupal/action/ActionFormControllerBase.php +++ b/core/modules/action/lib/Drupal/action/ActionFormControllerBase.php @@ -9,6 +9,7 @@ use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityFormController; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Action\ConfigurableActionInterface; use Drupal\Core\Entity\EntityStorageControllerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -35,11 +36,13 @@ abstract class ActionFormControllerBase extends EntityFormController implements /** * Constructs a new action form. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller * The action storage controller. */ - public function __construct(EntityStorageControllerInterface $storage_controller) { - parent::__construct(); + public function __construct(ModuleHandlerInterface $module_handler, EntityStorageControllerInterface $storage_controller) { + parent::__construct($module_handler); $this->storageController = $storage_controller; } @@ -49,6 +52,7 @@ public function __construct(EntityStorageControllerInterface $storage_controller */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.entity')->getStorageController($entity_type) ); } diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php index 2457d9769c9dcc16e015c499dce450c7baae006f..cf872c3b81fdd7eb5fddea3e4ec0799b4d26eae5 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/CustomBlockFormController.php @@ -34,8 +34,6 @@ protected function prepareEntity() { } // Always use the default revision setting. $block->setNewRevision($block_type->revision); - - module_invoke_all('custom_block_prepare', $block); } /** diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php index 9db5b1df7456afd7ea592efed32eccf2314a661c..7e595d21130e068f74262b556a35513eac9afc72 100644 --- a/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php +++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Form/CustomBlockTypeDeleteForm.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityConfirmFormBase; use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\Query\QueryFactory; +use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; @@ -28,10 +29,13 @@ class CustomBlockTypeDeleteForm extends EntityConfirmFormBase implements EntityC /** * Constructs a query factory object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Entity\Query\QueryFactory $query_factory * The entity query object. */ - public function __construct(QueryFactory $query_factory) { + public function __construct(ModuleHandlerInterface $module_handler, QueryFactory $query_factory) { + parent::__construct($module_handler); $this->queryFactory = $query_factory; } @@ -40,6 +44,7 @@ public function __construct(QueryFactory $query_factory) { */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('entity.query') ); } diff --git a/core/modules/book/book.module b/core/modules/book/book.module index 3462abf6f3de8462a87f8a503b381ae12f8e0e81..d577bd3c870f51baa6d61ebfc1a5c5e6d61d6a38 100644 --- a/core/modules/book/book.module +++ b/core/modules/book/book.module @@ -12,6 +12,7 @@ use Drupal\Core\Template\Attribute; use Drupal\menu_link\Plugin\Core\Entity\MenuLink; use Drupal\menu_link\MenuLinkStorageController; +use Drupal\node\NodeInterface; /** * Implements hook_help(). @@ -875,9 +876,9 @@ function book_node_predelete(EntityInterface $node) { } /** - * Implements hook_node_prepare(). + * Implements hook_node_prepare_form(). */ -function book_node_prepare(EntityInterface $node) { +function book_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) { // Prepare defaults for the add/edit form. if (empty($node->book) && (user_access('add content to books') || user_access('administer book outlines'))) { $node->book = array(); diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module index 43b962e6a5cadb0c68770190ab6519615f8c7dd3..e5750c6a3b91cd8bdb1bdcd01dde716cef87898c 100644 --- a/core/modules/comment/comment.module +++ b/core/modules/comment/comment.module @@ -13,6 +13,7 @@ use Drupal\entity\Plugin\Core\Entity\EntityDisplay; use Drupal\file\Plugin\Core\Entity\File; use Drupal\Core\Entity\EntityInterface; +use Drupal\node\NodeInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\HttpKernelInterface; @@ -1158,9 +1159,9 @@ function comment_node_load($nodes, $types) { } /** - * Implements hook_node_prepare(). + * Implements hook_node_prepare_form(). */ -function comment_node_prepare(EntityInterface $node) { +function comment_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) { if (!isset($node->comment)) { $node->comment = variable_get("comment_$node->type", COMMENT_NODE_OPEN); } diff --git a/core/modules/datetime/datetime.module b/core/modules/datetime/datetime.module index e4ef83650bce062c4620fefa77812a58ab6d810e..d2c35dbb9933019224bf34edd588274afe7e0df9 100644 --- a/core/modules/datetime/datetime.module +++ b/core/modules/datetime/datetime.module @@ -1147,9 +1147,9 @@ function datetime_form_node_form_alter(&$form, &$form_state, $form_id) { } /** - * Implements hook_node_prepare(). + * Implements hook_node_prepare_form(). */ -function datetime_node_prepare(NodeInterface $node) { +function datetime_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) { // Prepare the 'Authored on' date to use datetime. $node->date = new DrupalDateTime($node->created); } diff --git a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php index 481cf7c2f964b7bd6d35a254a2c97f4e4f7d08d7..a3ffe5d32c7483425c7172e3d936d2322a37fc93 100644 --- a/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php +++ b/core/modules/field_ui/lib/Drupal/field_ui/Form/FieldDeleteForm.php @@ -10,6 +10,7 @@ use Drupal\Core\Entity\EntityConfirmFormBase; use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityManager; +use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -27,10 +28,13 @@ class FieldDeleteForm extends EntityConfirmFormBase implements EntityControllerI /** * Constructs a new FieldDeleteForm object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Entity\EntityManager $entity_manager * The entity manager. */ - public function __construct(EntityManager $entity_manager) { + public function __construct(ModuleHandlerInterface $module_handler, EntityManager $entity_manager) { + parent::__construct($module_handler); $this->entityManager = $entity_manager; } @@ -39,6 +43,7 @@ public function __construct(EntityManager $entity_manager) { */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.entity') ); } diff --git a/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php b/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php index f9d4965072eec47330ad4f623416386c3fa380a6..98495d528774bc4bb3d790152898d7aee02db011 100644 --- a/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php +++ b/core/modules/filter/lib/Drupal/filter/FilterFormatFormControllerBase.php @@ -11,6 +11,7 @@ use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityFormController; use Drupal\Core\Entity\Query\QueryFactory; +use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -35,12 +36,15 @@ abstract class FilterFormatFormControllerBase extends EntityFormController imple /** * Constructs a new FilterFormatFormControllerBase. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Config\ConfigFactory $config_factory * The config factory. * @param \Drupal\Core\Entity\Query\QueryFactory $query_factory * The entity query factory. */ - public function __construct(ConfigFactory $config_factory, QueryFactory $query_factory) { + public function __construct(ModuleHandlerInterface $module_handler, ConfigFactory $config_factory, QueryFactory $query_factory) { + parent::__construct($module_handler); $this->configFactory = $config_factory; $this->queryFactory = $query_factory; } @@ -50,6 +54,7 @@ public function __construct(ConfigFactory $config_factory, QueryFactory $query_f */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('config.factory'), $container->get('entity.query') ); diff --git a/core/modules/menu/lib/Drupal/menu/Form/MenuDeleteForm.php b/core/modules/menu/lib/Drupal/menu/Form/MenuDeleteForm.php index 60129fafb35898bf5507e40bf1bb4f764a33a697..f605d0aebd4d25917fa3d23dd73b06550138672b 100644 --- a/core/modules/menu/lib/Drupal/menu/Form/MenuDeleteForm.php +++ b/core/modules/menu/lib/Drupal/menu/Form/MenuDeleteForm.php @@ -11,6 +11,7 @@ use Drupal\Core\Entity\EntityConfirmFormBase; use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityStorageControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -35,12 +36,15 @@ class MenuDeleteForm extends EntityConfirmFormBase implements EntityControllerIn /** * Constructs a new MenuDeleteForm. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Entity\EntityStorageControllerInterface $storage_controller * The menu link storage controller. * @param \Drupal\Core\Database\Connection $connection * The database connection. */ - public function __construct(EntityStorageControllerInterface $storage_controller, Connection $connection) { + public function __construct(ModuleHandlerInterface $module_handler, EntityStorageControllerInterface $storage_controller, Connection $connection) { + parent::__construct($module_handler); $this->storageController = $storage_controller; $this->connection = $connection; } @@ -50,6 +54,7 @@ public function __construct(EntityStorageControllerInterface $storage_controller */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.entity')->getStorageController('menu_link'), $container->get('database') ); diff --git a/core/modules/menu/lib/Drupal/menu/MenuFormController.php b/core/modules/menu/lib/Drupal/menu/MenuFormController.php index 62a92ffbf06ee9d730ab4b91218b1207339c7d21..a709d2e9bf4b06d07dc7fb80c1a1db62177e1017 100644 --- a/core/modules/menu/lib/Drupal/menu/MenuFormController.php +++ b/core/modules/menu/lib/Drupal/menu/MenuFormController.php @@ -9,7 +9,6 @@ use Drupal\Core\Entity\EntityControllerInterface; use Drupal\Core\Entity\EntityFormController; -use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Language\Language; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -18,37 +17,6 @@ */ class MenuFormController extends EntityFormController implements EntityControllerInterface { - /** - * The module handler to invoke hooks on. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * {@inheritdoc} - */ - public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info, $operation = NULL) { - return new static( - $operation, - $container->get('module_handler') - ); - } - - /** - * Constructs a new EntityListController object. - * - * @param string $operation - * The name of the current operation. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler to invoke hooks on. - */ - public function __construct($operation, ModuleHandlerInterface $module_handler) { - parent::__construct($operation); - - $this->moduleHandler = $module_handler; - } - /** * Overrides Drupal\Core\Entity\EntityFormController::form(). */ diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module index 18b0ee511716123c1b1d198cb8292a145f1db238..f3dd6c29614edf6b5f9242612d8186ab0d3dc57e 100644 --- a/core/modules/menu/menu.module +++ b/core/modules/menu/menu.module @@ -17,6 +17,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Drupal\menu_link\Plugin\Core\Entity\MenuLink; use Drupal\menu_link\MenuLinkStorageController; +use Drupal\node\NodeInterface; /** * Maximum length of menu name as entered by the user. Database length is 32 @@ -490,9 +491,9 @@ function menu_node_predelete(EntityInterface $node) { } /** - * Implements hook_node_prepare(). + * Implements hook_node_prepare_form(). */ -function menu_node_prepare(EntityInterface $node) { +function menu_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) { if (empty($node->menu)) { // Prepare the node for the edit form so that $node->menu always exists. $menu_name = strtok(variable_get('menu_parent_' . $node->type, 'main:0'), ':'); diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php index b6d3f75acf148c5dd41757bce97dcd77dff44d8f..606410821f09d3c3378120fbefe53ef30232c606 100644 --- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php +++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkFormController.php @@ -42,35 +42,30 @@ class MenuLinkFormController extends EntityFormController implements EntityContr */ protected $urlGenerator; - /** - * The module handler - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - /** * Constructs a new MenuLinkFormController object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Path\AliasManagerInterface $path_alias_manager * The path alias manager. */ - public function __construct(MenuLinkStorageControllerInterface $menu_link_storage_controller, AliasManagerInterface $path_alias_manager, UrlGenerator $url_generator, ModuleHandlerInterface $module_handler) { + public function __construct(ModuleHandlerInterface $module_handler, MenuLinkStorageControllerInterface $menu_link_storage_controller, AliasManagerInterface $path_alias_manager, UrlGenerator $url_generator) { + parent::__construct($module_handler); $this->menuLinkStorageController = $menu_link_storage_controller; $this->pathAliasManager = $path_alias_manager; $this->urlGenerator = $url_generator; - $this->moduleHandler = $module_handler; } /** * {@inheritdoc} */ - public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { + public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info, $operation = NULL) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.entity')->getStorageController('menu_link'), $container->get('path.alias_manager.cached'), - $container->get('url_generator'), - $container->get('module_handler') + $container->get('url_generator') ); } diff --git a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php index 23973c9d18528f8576f0e3a32994531b555489b7..d159b3d1199e20679f9333bf5fcc42712c8f996e 100644 --- a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php +++ b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php @@ -9,6 +9,7 @@ use Drupal\Core\Entity\EntityConfirmFormBase; use Drupal\Core\Entity\EntityControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Database\Connection; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; @@ -28,10 +29,13 @@ class NodeTypeDeleteConfirm extends EntityConfirmFormBase implements EntityContr /** * Constructs a new NodeTypeDeleteConfirm object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\Core\Database\Connection $database * The database connection. */ - public function __construct(Connection $database) { + public function __construct(ModuleHandlerInterface $module_handler, Connection $database) { + parent::__construct($module_handler); $this->database = $database; } @@ -40,6 +44,7 @@ public function __construct(Connection $database) { */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('database') ); } diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php index 2c362b6c302f17e787218220973ef5cdb6ffba56..e55e056638dae76a0d3ea8d37b6b89b9b13fda94 100644 --- a/core/modules/node/lib/Drupal/node/NodeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeFormController.php @@ -25,12 +25,7 @@ class NodeFormController extends EntityFormController { protected $settings; /** - * Prepares the node object. - * - * Fills in a few default values, and then invokes hook_node_prepare() on all - * modules. - * - * Overrides Drupal\Core\Entity\EntityFormController::prepareEntity(). + * {@inheritdoc} */ protected function prepareEntity() { $node = $this->entity; @@ -62,8 +57,6 @@ protected function prepareEntity() { } // Always use the default revision setting. $node->setNewRevision(in_array('revision', $this->settings['options'])); - - module_invoke_all('node_prepare', $node); } /** diff --git a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php index aaa287b2f2650be03a72be88ef5eba1c5f1a0927..ec465e17d76ba5dc367d8bd678382cee65abe7ba 100644 --- a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php +++ b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php @@ -10,43 +10,12 @@ use Drupal\Core\Entity\EntityFormController; use Drupal\Core\Entity\EntityControllerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; -use Drupal\Core\Extension\ModuleHandlerInterface; /** * Form controller for node type forms. */ class NodeTypeFormController extends EntityFormController implements EntityControllerInterface { - /** - * The module handler service. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - - /** - * Constructs a NodeTypeFormController object. - * - * @param string $operation - * The name of the current operation. - * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler - * The module handler to invoke hooks on. - */ - public function __construct($operation, ModuleHandlerInterface $module_handler) { - parent::__construct($operation); - $this->moduleHandler = $module_handler; - } - - /** - * {@inheritdoc} - */ - public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info, $operation = NULL) { - return new static( - $operation, - $container->get('module_handler') - ); - } - /** * {@inheritdoc} */ diff --git a/core/modules/node/node.api.php b/core/modules/node/node.api.php index 3e0cf3ce48ef9b5679c7f96a69232ad1818754c7..51abca3a2fb0b5e4ada9f78fc9677782bb854418 100644 --- a/core/modules/node/node.api.php +++ b/core/modules/node/node.api.php @@ -94,7 +94,8 @@ * - field_attach_delete_revision() * - Preparing a node for editing (calling node_form() - note that if it is an * existing node, it will already be loaded; see the Loading section above): - * - hook_node_prepare() (all) + * - hook_node_prepare_form() (all) + * - hook_entity_prepare_form() (all) * - field_attach_form() * - Validating a node during editing form submit (calling * node_form_validate()): @@ -598,12 +599,18 @@ function hook_node_access($node, $op, $account, $langcode) { * * This hook is invoked from NodeFormController::prepareEntity(). * - * @param \Drupal\Core\Entity\EntityInterface $node - * The node that is about to be shown on the add/edit form. + * @param \Drupal\node\NodeInterface $node + * The node that is about to be shown on the form. + * @param $form_display + * The current form display. + * @param $operation + * The current operation. + * @param array $form_state + * An associative array containing the current state of the form. * * @ingroup node_api_hooks */ -function hook_node_prepare(\Drupal\Core\Entity\EntityInterface $node) { +function hook_node_prepare_form(\Drupal\node\NodeInterface $node, $form_display, $operation, array &$form_state) { if (!isset($node->comment)) { $node->comment = variable_get("comment_$node->type", COMMENT_NODE_OPEN); } diff --git a/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutDeleteForm.php b/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutDeleteForm.php index 296ae9bdc0b9fd350ec37152070bb5c7a107d8d4..aec4a4efd6278c768ee01a79418349e6ee0fdb50 100644 --- a/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutDeleteForm.php +++ b/core/modules/shortcut/lib/Drupal/shortcut/Form/ShortcutDeleteForm.php @@ -9,10 +9,10 @@ use Drupal\Core\Entity\EntityConfirmFormBase; use Drupal\Core\Entity\EntityControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\shortcut\ShortcutStorageControllerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Drupal\Core\Database\Connection; -use Drupal\Core\Extension\ModuleHandlerInterface; use Symfony\Component\HttpFoundation\Request; /** @@ -27,13 +27,6 @@ class ShortcutDeleteForm extends EntityConfirmFormBase implements EntityControll */ protected $database; - /** - * The module handler service. - * - * @var \Drupal\Core\Extension\ModuleHandlerInterface - */ - protected $moduleHandler; - /** * The shortcut storage controller. * @@ -44,9 +37,9 @@ class ShortcutDeleteForm extends EntityConfirmFormBase implements EntityControll /** * Constructs a ShortcutDeleteForm object. */ - public function __construct(Connection $database, ModuleHandlerInterface $module_handler, ShortcutStorageControllerInterface $storage_controller) { + public function __construct(ModuleHandlerInterface $module_handler, Connection $database, ShortcutStorageControllerInterface $storage_controller) { + parent::__construct($module_handler); $this->database = $database; - $this->moduleHandler = $module_handler; $this->storageController = $storage_controller; } @@ -55,8 +48,8 @@ public function __construct(Connection $database, ModuleHandlerInterface $module */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( - $container->get('database'), $container->get('module_handler'), + $container->get('database'), $container->get('plugin.manager.entity')->getStorageController('shortcut') ); } diff --git a/core/modules/translation/translation.module b/core/modules/translation/translation.module index 2d50934638543059ecdc4ce4a8b4e74f11c63622..9c88847243d2e75eb537053a235393d3339f7eae 100644 --- a/core/modules/translation/translation.module +++ b/core/modules/translation/translation.module @@ -20,8 +20,10 @@ */ use Drupal\Core\Entity\EntityInterface; +use Drupal\Core\Entity\EntityFormControllerInterface; use Drupal\Core\Language\Language; use Drupal\entity\Plugin\Core\Entity\EntityDisplay; +use Drupal\node\NodeInterface; /** * Implements hook_help(). @@ -304,9 +306,9 @@ function translation_node_view(EntityInterface $node, EntityDisplay $display, $v } /** - * Implements hook_node_prepare(). + * Implements hook_node_prepare_form(). */ -function translation_node_prepare(EntityInterface $node) { +function translation_node_prepare_form(NodeInterface $node, $form_display, $operation, array &$form_state) { $query = Drupal::request()->query; $translation = $query->get('translation'); $target = $query->get('target'); diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php index 53920b41b4bf6e1b30d1d4c04e3cd8610ad8b5e0..4ad9376a7a09f1c54be2077a0cd1e837a6eb3358 100644 --- a/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php +++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewAddFormController.php @@ -8,6 +8,7 @@ namespace Drupal\views_ui; use Drupal\Core\Entity\EntityControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\views\Plugin\views\wizard\WizardPluginBase; use Drupal\views\Plugin\views\wizard\WizardException; use Drupal\views\Plugin\ViewsPluginManager; @@ -28,10 +29,14 @@ class ViewAddFormController extends ViewFormControllerBase implements EntityCont /** * Constructs a new ViewEditFormController object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\views\Plugin\ViewsPluginManager $wizard_manager * The wizard plugin manager. */ - public function __construct(ViewsPluginManager $wizard_manager) { + public function __construct(ModuleHandlerInterface $module_handler, ViewsPluginManager $wizard_manager) { + parent::__construct($module_handler); + $this->wizardManager = $wizard_manager; } @@ -40,6 +45,7 @@ public function __construct(ViewsPluginManager $wizard_manager) { */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('plugin.manager.views.wizard') ); } diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewEditFormController.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewEditFormController.php index 04dd507032cbe0442460832eaa527547d58e8ae1..e3fa4c63cc5558d84e3738b08470eaf9367dc2a2 100644 --- a/core/modules/views_ui/lib/Drupal/views_ui/ViewEditFormController.php +++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewEditFormController.php @@ -10,6 +10,7 @@ use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\HtmlCommand; use Drupal\Core\Ajax\ReplaceCommand; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Component\Utility\NestedArray; use Drupal\views\ViewExecutable; use Drupal\Core\Entity\EntityControllerInterface; @@ -39,12 +40,16 @@ class ViewEditFormController extends ViewFormControllerBase implements EntityCon /** * Constructs a new ViewEditFormController object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\user\TempStoreFactory $temp_store_factory * The factory for the temp store object. * @param \Symfony\Component\HttpFoundation\Request $request * The request object. */ - public function __construct(TempStoreFactory $temp_store_factory, Request $request) { + public function __construct(ModuleHandlerInterface $module_handler, TempStoreFactory $temp_store_factory, Request $request) { + parent::__construct($module_handler); + $this->tempStore = $temp_store_factory->get('views'); $this->request = $request; } @@ -52,8 +57,9 @@ public function __construct(TempStoreFactory $temp_store_factory, Request $reque /** * {@inheritdoc} */ - public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { + public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info, $operation = NULL) { return new static( + $container->get('module_handler'), $container->get('user.tempstore'), $container->get('request') ); diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php index 555ebac58d59dd50e45f19fecba49702b9e10607..4ac5b8cf504b64a6fd99cbe8ad8ab924304d0411 100644 --- a/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php +++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewPreviewFormController.php @@ -8,6 +8,7 @@ namespace Drupal\views_ui; use Drupal\Core\Entity\EntityControllerInterface; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\user\TempStoreFactory; use Symfony\Component\DependencyInjection\ContainerInterface; @@ -26,10 +27,14 @@ class ViewPreviewFormController extends ViewFormControllerBase implements Entity /** * Constructs a new ViewPreviewFormController object. * + * @param \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler service. * @param \Drupal\user\TempStoreFactory $temp_store_factory * The factory for the temp store object. */ - public function __construct(TempStoreFactory $temp_store_factory) { + public function __construct(ModuleHandlerInterface $module_handler, TempStoreFactory $temp_store_factory) { + parent::__construct($module_handler); + $this->tempStore = $temp_store_factory->get('views'); } @@ -38,6 +43,7 @@ public function __construct(TempStoreFactory $temp_store_factory) { */ public static function createInstance(ContainerInterface $container, $entity_type, array $entity_info) { return new static( + $container->get('module_handler'), $container->get('user.tempstore') ); }