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 libDrupalutilsControllerCustomNodeController.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?

Overwriting code in Drupal

  • 1.
    Overwriting code inDrupal Vasile CHINDRIS vasi1186 d.o
  • 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!
  • 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!
  • 4.
    Overwriting menu items:D7 hook_menu_alter(&$items)
  • 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.
  • 8.
    The event subscriberis declared in the utils.services.yml file
  • 10.
  • 12.
    Overwriting menu items:real use case We have a hook_menu():
  • 13.
    When using afile that is uploaded with ajax. Why?
  • 15.
    Overwrite existing hooks:D7 hook_module_implements_alter(&$implementations, $hook)
  • 16.
    Use case: removethe hook_user_view() from the user module.
  • 19.
    A real usecase You have a module called “action” on your site.
  • 21.
    Overwriting existing hooks:D8 ● Good news: the same as in D7! ● hook_module_implements_alter() exists also in D8
  • 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.
  • 23.
    ● hook_views_plugins() ● hook_views_plugins_alter() Howis the B class instantiated in the current implementation?
  • 25.
    Overwrite views handlers:D7 ● How are they created? ● The same as plugins are, in _views_create_handler()
  • 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()
  • 27.
    Add to thecustom.info file: Copy the entire code from the original file to the new file. Big issue: we are not extending, but cloning core!
  • 28.
    Put the originalclass 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:
  • 29.
    ● What happenswhen 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.
  • 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()
  • 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.
  • 32.
    Conclusions ● Evaluate firstthe 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”.
  • 33.
    Overwriting code inDrupal Thank you! Questions?