Top Banner
Overwriting code in Drupal Vasile CHINDRIS vasi1186 d.o
33

Overwriting code in Drupal

May 08, 2015

Download

Technology

Amazee Labs

This session is supposed to present various ways to overwrite the default behaviour of the drupal core and some of the well-known contributed modules (like views or panels). The focus will be on Drupal 7, but each case will also have the Drupal 8 correspondent. This will go beyond the things that can be overwrite with alter hooks, and will try to present cases when some specific behavior of a class or small pieces of code have to be overwritten. The attendees should be familiar with Drupal and should have developed at least a few modules before.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Overwriting code in Drupal

Overwriting code in Drupal

Vasile CHINDRIS

vasi1186 d.o

Page 2: Overwriting code in Drupal

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!

Page 3: Overwriting code in Drupal

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!

Page 4: Overwriting code in Drupal

Overwriting menu items: D7

hook_menu_alter(&$items)

Page 5: Overwriting code in Drupal
Page 6: Overwriting code in Drupal
Page 7: Overwriting code in Drupal

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.

Page 8: Overwriting code in Drupal

The event subscriber is declared in the utils.services.yml file

Page 9: Overwriting code in Drupal
Page 10: Overwriting code in Drupal

In lib\Drupal\utils\Controller\CustomNodeController.php:

Page 11: Overwriting code in Drupal
Page 12: Overwriting code in Drupal

Overwriting menu items: real use case

We have a hook_menu():

Page 13: Overwriting code in Drupal

When using a file that is uploaded with ajax.

Why?

Page 14: Overwriting code in Drupal
Page 15: Overwriting code in Drupal

Overwrite existing hooks: D7

hook_module_implements_alter(&$implementations, $hook)

Page 16: Overwriting code in Drupal

Use case: remove the hook_user_view() from the user module.

Page 17: Overwriting code in Drupal
Page 18: Overwriting code in Drupal
Page 19: Overwriting code in Drupal

A real use case

You have a module called “action” on your site.

Page 20: Overwriting code in Drupal
Page 21: Overwriting code in Drupal

Overwriting existing hooks: D8

● Good news: the same as in D7!

● hook_module_implements_alter() exists also in D8

Page 22: Overwriting code in Drupal

Overwrite views plugins: D7

● It is a PHP class: views_plugin_pager_full

● Extend the class: class A extends B

● Views full pager plugin.

Page 23: Overwriting code in Drupal

● hook_views_plugins()

● hook_views_plugins_alter()

How is the B class instantiated in the current implementation?

Page 24: Overwriting code in Drupal
Page 25: Overwriting code in Drupal

Overwrite views handlers: D7

● How are they created?

● The same as plugins are, in _views_create_handler()

Page 26: Overwriting code in Drupal

● 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()

Page 27: Overwriting code in Drupal

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!

Page 28: Overwriting code in Drupal

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:

Page 29: Overwriting code in Drupal

● 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.

Page 30: Overwriting code in Drupal

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()

Page 31: Overwriting code in Drupal

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.

Page 32: Overwriting code in Drupal

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”.

Page 33: Overwriting code in Drupal

Overwriting code in Drupal

Thank you!

Questions?