Overwriting code in Drupal Vasile CHINDRIS vasi1186 d.o
May 08, 2015
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
● It is a PHP class: views_plugin_pager_full
● Extend the class: class A extends B
● Views full pager plugin.
● hook_views_plugins()
● hook_views_plugins_alter()
How is the B class instantiated in the current implementation?
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.
● One alternate solution: hook_views_data_alter().
● The handler class name is stored in the cache_views_info table.
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?