cTools: A Deep Dive into Custom Plugin Creation in Drupal 7
cTools is an indispensable Drupal 7 module, forming the foundation for numerous other modules like Views and Panels. Its extensive APIs and functionalities streamline module development by offering features such as object caching, configuration exportability, form wizards, dialogs, and a robust plugin system. This article explores cTools plugins, focusing on the creation of custom plugins. We'll build a module that simplifies Drupal 7 block definition, mirroring the more streamlined approach of Drupal 8.
Key Concepts:
hook_ctools_plugin_type()
, specifying the plugin directory with hook_ctools_plugin_directory()
, and creating individual plugin files.hook_block_info()
and hook_block_view()
implementations.Building the block_plugin
Module:
We'll create a module that transforms Drupal 7's block system into a plugin-based architecture. Begin by creating the block_plugin.info
file:
<code>name = Block Plugin description = Simplifies Drupal 7 block definition using cTools plugins. core = 7.x dependencies[] = ctools</code>
Next, within block_plugin.module
, we define our plugin type using hook_ctools_plugin_type()
:
function block_plugin_ctools_plugin_type() { return array( 'block' => array( 'label' => 'Block', 'use hooks' => FALSE, 'process' => 'block_plugin_process_plugin' ) ); }
The process
callback, block_plugin_process_plugin()
, prepares plugin data:
function block_plugin_process_plugin(&$plugin, $info) { // ... (Code to generate admin title, set 'show title', and define view/configure/save callbacks as shown in the original example) ... }
We also need hook_ctools_plugin_directory()
to tell cTools where to find our plugins:
function block_plugin_ctools_plugin_directory($module, $plugin) { if ($module == 'block_plugin' && in_array($plugin, array_keys(block_plugin_ctools_plugin_type()))) { return 'plugins/' . $plugin; } }
Integrating with the Drupal Block System:
Now, we'll connect our plugin system to Drupal's block system. hook_block_info()
will register our plugins as blocks:
function block_plugin_block_info() { $blocks = array(); $plugins = block_plugin_get_all_plugins(); // Helper function to fetch all plugins foreach ($plugins as $plugin) { $blocks[DELTA_PREFIX . $plugin['name']] = array( 'info' => $plugin['admin title'], ); } return $blocks; } // Helper function to get all plugins function block_plugin_get_all_plugins() { return ctools_get_plugins('block_plugin', 'block'); } define('DELTA_PREFIX', 'block_plugin_');
hook_block_view()
renders the block content:
function block_plugin_block_view($delta = '') { $plugin = block_plugin_plugin_from_delta($delta); // Helper to get plugin from delta if (!$plugin) { return; } $block = array(); if (isset($plugin['title']) && $plugin['show title'] !== FALSE) { $block['subject'] = $plugin['title']; } $block['content'] = $plugin['view']($delta); return $block; } // Helper function to get plugin from delta function block_plugin_plugin_from_delta($delta) { $prefix_length = strlen(DELTA_PREFIX); $name = substr($delta, $prefix_length); $plugin = block_plugin_get_plugin($name); return $plugin ? $plugin : FALSE; } // Helper function to get a single plugin function block_plugin_get_plugin($name) { return ctools_get_plugins('block_plugin', 'block', $name); }
Creating a Block Plugin:
Create a file (e.g., my_block.inc
) in the plugins/block
directory:
<?php $plugin = array( 'title' => t('My Custom Block'), ); function block_plugin_my_block_view($delta) { return array( '#type' => 'markup', '#markup' => 'This is my custom block content!', ); }
After clearing Drupal's cache, your custom block will appear in the block administration interface.
Conclusion:
This enhanced explanation provides a more comprehensive understanding of creating custom cTools plugins in Drupal 7, specifically demonstrating their application in simplifying Drupal block management. Remember to consult the cTools documentation for further details and advanced functionalities.
The above is the detailed content of Building Custom cTools Plugins in Drupal 7. For more information, please follow other related articles on the PHP Chinese website!