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;
}