summaryrefslogtreecommitdiff
path: root/sites/all/modules/ctools/includes/registry.inc
diff options
context:
space:
mode:
Diffstat (limited to 'sites/all/modules/ctools/includes/registry.inc')
-rw-r--r--sites/all/modules/ctools/includes/registry.inc77
1 files changed, 77 insertions, 0 deletions
diff --git a/sites/all/modules/ctools/includes/registry.inc b/sites/all/modules/ctools/includes/registry.inc
new file mode 100644
index 000000000..9d4328e69
--- /dev/null
+++ b/sites/all/modules/ctools/includes/registry.inc
@@ -0,0 +1,77 @@
+<?php
+
+/**
+ * @file
+ *
+ * Registry magic. In a separate file to minimize unnecessary code loading.
+ */
+
+/**
+ * Implements (via delegation) hook_registry_files_alter().
+ *
+ * Alter the registry of files to automagically include all classes in
+ * class-based plugins.
+ */
+function _ctools_registry_files_alter(&$files, $indexed_modules) {
+ ctools_include('plugins');
+
+ // Remap the passed indexed modules into a useful format.
+ $modules = array();
+ foreach ($indexed_modules as $module_object) {
+ $modules[$module_object->name] = $module_object;
+ }
+
+ $all_type_info = ctools_plugin_get_plugin_type_info(TRUE);
+ foreach ($all_type_info as $module => $plugin_types) {
+ foreach ($plugin_types as $plugin_type_name => $plugin_type_info) {
+ if (empty($plugin_type_info['classes'])) {
+ // This plugin type does not use classes, so skip it.
+ continue;
+ }
+
+ // Retrieve the full list of plugins of this type.
+ $plugins = ctools_get_plugins($module, $plugin_type_name);
+ foreach ($plugins as $plugin_name => $plugin_definition) {
+ foreach ($plugin_type_info['classes'] as $class_key) {
+ if (empty($plugin_definition[$class_key])) {
+ // Plugin doesn't provide a class for this class key, so skip it.
+ continue;
+ }
+
+ if (is_string($plugin_definition[$class_key])) {
+ // Plugin definition uses the shorthand for defining a class name
+ // and location; look for the containing file by following naming
+ // convention.
+ $path = $plugin_definition['path'] . '/' . $plugin_definition[$class_key] . '.class.php';
+ }
+ else {
+ // Plugin uses the verbose definition to indicate where its class
+ // files are.
+ $class = $plugin_definition[$class_key]['class'];
+ // Use the filename if it's explicitly set, else follow the naming
+ // conventions.
+ $filename = isset($plugin_definition[$class_key]['file']) ? $plugin_definition[$class_key]['file'] : $class . '.class.php';
+ $base_path = isset($plugin_definition[$class_key]['path']) ? $plugin_definition[$class_key]['path'] : $plugin_definition['path'];
+ $path = "$base_path/$filename";
+ }
+
+ if (file_exists($path)) {
+ // If the file exists, add it to the files for registry building.
+ $files[$path] = array('module' => $plugin_definition['module'], 'weight' => $modules[$plugin_definition['module']]->weight);
+ }
+ else {
+ // Else, watchdog that we've got some erroneous plugin info.
+ $args = array(
+ '@plugin' => $plugin_definition['name'],
+ '@owner' => $module,
+ '@type' => $plugin_type_name,
+ '@file' => $path,
+ '@class' => $class_key,
+ );
+ watchdog('ctools', 'Plugin @plugin of plugin type @owner:@type points to nonexistent file @file for class handler @class.', $args);
+ }
+ }
+ }
+ }
+ }
+}