overwriting code in drupal

Post on 08-May-2015

2.909 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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.

TRANSCRIPT

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?

top related