SLIDE 1
Overwriting code in Drupal
Vasile CHINDRIS
vasi1186 d.o
SLIDE 2 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!
SLIDE 3 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!
SLIDE 4
Overwriting menu items: D7
hook_menu_alter(&$items)
SLIDE 5
SLIDE 6
SLIDE 7 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.
SLIDE 8
The event subscriber is declared in the utils.services.yml file
SLIDE 9
SLIDE 10
In lib\Drupal\utils\Controller\CustomNodeController.php:
SLIDE 11
SLIDE 12
Overwriting menu items: real use case
We have a hook_menu():
SLIDE 13
When using a file that is uploaded with ajax. Why?
SLIDE 14
SLIDE 15
Overwrite existing hooks: D7
hook_module_implements_alter(&$implementations, $hook)
SLIDE 16
Use case: remove the hook_user_view() from the user module.
SLIDE 17
SLIDE 18
SLIDE 19
A real use case
You have a module called “action” on your site.
SLIDE 20
SLIDE 21 Overwriting existing hooks: D8
- Good news: the same as in D7!
- hook_module_implements_alter() exists also in D8
SLIDE 22 Overwrite views plugins: D7
- It is a PHP class: views_plugin_pager_full
- Extend the class: class A extends B
- Views full pager plugin.
SLIDE 23
- hook_views_plugins()
- hook_views_plugins_alter()
How is the B class instantiated in the current implementation?
SLIDE 24
SLIDE 25 Overwrite views handlers: D7
- How are they created?
- The same as plugins are, in _views_create_handler()
SLIDE 26
- 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()
SLIDE 27
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!
SLIDE 28 Put the original class into a new file and change only the name
Add the file to the files array in the .info file: Extend the “new” original class:
SLIDE 29
- What happens when the module updates?
- Manually update the class.
- Goal 99% achieved: did not change any implementation,
- nly the class name.
- Can be used with any classes in D7.
SLIDE 30 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()
SLIDE 31 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.
SLIDE 32 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”.
SLIDE 33
Overwriting code in Drupal
Thank you! Questions?