Overwriting code in Drupal Vasile CHINDRIS vasi1186 d.o
Why to overwrite? ● There is no “magic” solution that solves all our problems. ● We are not happy with the existing implementation. ● Wrap the current implementation. ● ... plenty other reasons. ● Good frameworks should (easily) allow overwriting the code. without touching the core!
What to overwrite? ● Classes . ● Functions (possible in a few cases in Drupal). ● Every piece of the framework (ideal case). and again, without touching the core!
Overwriting menu items: D7 hook_menu_alter(&$items)
Overwriting menu items: D8 ● There is no hook_menu_alter() in D8. ● We have to alter the routes defined in the routing.yml file. ● We use an EventSubscriber.
The event subscriber is declared in the utils.services.yml file
In lib\Drupal\utils\Controller\CustomNodeController.php:
Overwriting menu items: real use case We have a hook_menu():
When using a file that is uploaded with ajax. Why?
Overwrite existing hooks: D7 hook_module_implements_alter(&$implementations, $hook)
Use case: remove the hook_user_view() from the user module.
A real use case You have a module called “action” on your site.
Overwriting existing hooks: D8 ● Good news: the same as in D7! ● hook_module_implements_alter() exists also in D8
Overwrite views plugins: D7 ● Views full pager plugin. ● It is a PHP class: views_plugin_pager_full ● Extend the class: class A extends B
How is the B class instantiated in the current implementation? ● hook_views_plugins() ● hook_views_plugins_alter()
Overwrite views handlers: D7 ● How are they created? ● The same as plugins are, in _views_create_handler()
● hook_views_handlers_alter() ● Ooops: there is no hook_views_handlers_alter() ● Make it the hard way: alter the file registry. ● hook_registry_files_alter()
Add to the custom.info file: Copy the entire code from the original file to the new file. Big issue: we are not extending, but cloning core!
Put the original class into a new file and change only the name of the class Add the file to the files array in the .info file: Extend the “new” original class:
● What happens when the module updates? ● Manually update the class. ● Goal 99% achieved: did not change any implementation, only the class name. ● Can be used with any classes in D7.
Overwrite views plugins: D8 ● How are they constructed? ● A bit different than D7. ● But, we have the hook_views_plugins_pager_alter() ● There is an alter hook for every plugin: hook_views_plugin_pluginname_alter()
Overwrite views handlers: D8 ● Same issue as in D7, no alter hook. ● Still to find a way to overwrite them, cannot apply the same solution as in D7. ● The handler class name is stored in the cache_views_info table. ● One alternate solution: hook_views_data_alter().
Conclusions ● Evaluate first the code you want to overwrite. ● Many things in Drupal can be overwritten with alter hooks. ● When extending classes, if possible do not do it the “hard way”.
Overwriting code in Drupal Thank you! Questions?
Recommend
More recommend