function ctools_plugin_load_includes

Load plugins from a directory.

Parameters

array $info: The plugin info as returned by ctools_plugin_get_info()

string $filename: The file to load if we're looking for just one particular plugin.

Return value

array A (possibly empty) array of information created for this plugin.

1 call to ctools_plugin_load_includes()
ctools_get_plugins in includes/plugins.inc
Fetch a group of plugins by name.
1 string reference to 'ctools_plugin_load_includes'
ctools_get_plugins_reset in includes/plugins.inc
Reset all static caches that affect the result of ctools_get_plugins().

File

includes/plugins.inc, line 428

Code

function ctools_plugin_load_includes($info, $filename = NULL) {
    // Keep a static array so we don't hit file_scan_directory more than necessary.
    $all_files =& drupal_static(__FUNCTION__, array());
    // Store static of plugin arrays for reference because they can't be
    // reincluded, so there is no point in using drupal_static().
    static $plugin_arrays = array();
    if (!isset($all_files[$info['module']][$info['type']])) {
        $cache = cache_get("ctools_plugin_files:{$info['module']}:{$info['type']}");
        if ($cache) {
            $all_files[$info['module']][$info['type']] = $cache->data;
        }
        elseif (!isset($all_files[$info['module']][$info['type']])) {
            $all_files[$info['module']][$info['type']] = array();
            // Load all our plugins.
            $directories = ctools_plugin_get_directories($info);
            $extension = empty($info['info file']) || $info['extension'] != 'inc' ? $info['extension'] : 'info';
            foreach ($directories as $module => $path) {
                $all_files[$info['module']][$info['type']][$module] = file_scan_directory($path, '/\\.' . $extension . '$/', array(
                    'key' => 'name',
                ));
            }
            cache_set("ctools_plugin_files:{$info['module']}:{$info['type']}", $all_files[$info['module']][$info['type']]);
        }
    }
    $file_list = $all_files[$info['module']][$info['type']];
    $plugins = array();
    // Iterate through all the plugin .inc files, load them and process the hook
    // that should now be available.
    foreach (array_filter($file_list) as $module => $files) {
        if ($filename) {
            $files = isset($files[$filename]) ? array(
                $filename => $files[$filename],
            ) : array();
        }
        foreach ($files as $file) {
            if (!empty($info['info file'])) {
                // Parse a .info file.
                $result = ctools_plugin_process_info($info, $module, $file);
            }
            else {
                // Parse a hook.
                // Ensure that we don't have something leftover from earlier.
                $plugin = NULL;
                if (isset($plugin_arrays[$file->uri])) {
                    $identifier = $plugin_arrays[$file->uri];
                }
                else {
                    include_once DRUPAL_ROOT . '/' . $file->uri;
                    // .inc files have a special format for the hook identifier.
                    // For example, 'foo.inc' in the module 'mogul' using the plugin
                    // whose hook is named 'borg_type' should have a function named
                    // (deep breath) mogul_foo_borg_type().
                    // If, however, the .inc file set the quasi-global $plugin array, we
                    // can use that and not even call a function. Set the $identifier
                    // appropriately and ctools_plugin_process() will handle it.
                    if (isset($plugin)) {
                        $plugin_arrays[$file->uri] = $plugin;
                        $identifier = $plugin;
                    }
                    else {
                        $identifier = $module . '_' . $file->name;
                    }
                }
                $result = ctools_plugin_process($info, $module, $identifier, dirname($file->uri), basename($file->uri), $file->name);
            }
            if (is_array($result)) {
                $plugins = array_merge($plugins, $result);
            }
        }
    }
    return $plugins;
}