function _rules_discover_module

Determines the module providing the given class.

Parameters

string $class: The name of the class or interface plugins to discover.

Return value

string|false The path of the class, relative to the Drupal installation root, or FALSE if not discovered.

1 call to _rules_discover_module()
rules_discover_plugins in ./rules.module
Discover plugin implementations.

File

./rules.module, line 344

Code

function _rules_discover_module($class) {
    static $symlink_bases = array();
    $paths =& drupal_static(__FUNCTION__);
    if (!isset($paths)) {
        // Build up a map of modules keyed by their directory.
        foreach (system_list('module_enabled') as $name => $module_info) {
            $paths[dirname($module_info->filename)] = $name;
        }
    }
    // Retrieve the class file and convert its absolute path to a regular Drupal
    // path relative to the installation root.
    $drupal_root = realpath(DRUPAL_ROOT) . DIRECTORY_SEPARATOR;
    $reflection = new ReflectionClass($class);
    $file_path = realpath($reflection->getFileName());
    // Check if the class file lives outside of the Drupal root. If so, we have
    // to assume that this is a symlink. Symlinks are then resolved to fit to the
    // Drupal structure again. Don't use realpath() with the symlinks as this will
    // resolve the symlink again.
    if (stristr(realpath(DRUPAL_ROOT), realpath(dirname($file_path))) === FALSE) {
        // Check if this matches a resolved symlink.
        if ($symlink_bases) {
            // Cutting the $file_path means just one iteration left below.
            $file_path = str_replace($symlink_bases, '', $file_path);
        }
        // Split the file path in parts and attempt to find where the parts start
        // to match the drupal file structure again.
        $parts = explode(DIRECTORY_SEPARATOR, $file_path);
        do {
            $path = implode(DIRECTORY_SEPARATOR, $parts);
            $symlink_path = $drupal_root . $path;
            $symlink_base = str_replace($path, '', $file_path);
        } while (file_exists($symlink_path) === FALSE && array_shift($parts));
        if (file_exists($symlink_path)) {
            $file_path = $symlink_path;
            $symlink_bases[$symlink_base] = $symlink_base;
        }
    }
    $path = str_replace($drupal_root, '', dirname($file_path));
    $path = DIRECTORY_SEPARATOR != '/' ? str_replace(DIRECTORY_SEPARATOR, '/', $path) : $path;
    // Go up the path until we match a module.
    $parts = explode('/', $path);
    while (!isset($paths[$path]) && array_pop($parts)) {
        $path = dirname($path);
    }
    return isset($paths[$path]) ? $paths[$path] : FALSE;
}