path.eval.inc

Contains rules integration for the path module needed during evaluation.

File

modules/path.eval.inc

View source
<?php


/**
 * @file
 * Contains rules integration for the path module needed during evaluation.
 *
 * @addtogroup rules
 *
 * @{
 */

/**
 * Action implementation: Path alias.
 */
function rules_action_path_alias($source, $alias, $langcode = LANGUAGE_NONE) {
    if (!$alias) {
        path_delete(array(
            'source' => $source,
            'language' => $langcode,
        ));
    }
    elseif (!$source) {
        path_delete(array(
            'alias' => $alias,
            'language' => $langcode,
        ));
    }
    elseif (!path_load(array(
        'alias' => $alias,
        'language' => $langcode,
    ))) {
        // Update the existing path or create a new one.
        if ($path = path_load(array(
            'source' => $source,
            'language' => $langcode,
        ))) {
            $path['alias'] = $alias;
        }
        else {
            $path = array(
                'source' => $source,
                'alias' => $alias,
                'language' => $langcode,
            );
        }
        path_save($path);
    }
    else {
        rules_log('The configured alias %alias already exists. Aborting.', array(
            '%alias' => $alias,
        ));
    }
}

/**
 * Action Implementation: Set the URL alias for a node.
 */
function rules_action_node_path_alias($node, $alias) {
    $langcode = isset($node->language) ? $node->language : LANGUAGE_NONE;
    // Only set the alias if the alias is not taken yet.
    if (($path = path_load(array(
        'alias' => $alias,
        'language' => $langcode,
    ))) && (empty($node->path['pid']) || $node->path['pid'] != $path['pid'])) {
        rules_log('The configured alias %alias already exists. Aborting.', array(
            '%alias' => $alias,
        ));
        return FALSE;
    }
    $node->path['alias'] = $alias;
}

/**
 * Action Implementation: Set the URL alias for a node.
 */
function rules_action_taxonomy_term_path_alias($term, $alias) {
    // Only set the alias if the alias is not taken yet.
    if (($path = path_load(array(
        'alias' => $alias,
        'language' => LANGUAGE_NONE,
    ))) && (empty($term->path['pid']) || $term->path['pid'] != $path['pid'])) {
        rules_log('The configured alias %alias already exists. Aborting.', array(
            '%alias' => $alias,
        ));
        return FALSE;
    }
    $term->path['alias'] = $alias;
}

/**
 * Condition implementation: Check if the path has an alias.
 */
function rules_condition_path_has_alias($source, $langcode = LANGUAGE_NONE) {
    return (bool) drupal_lookup_path('alias', $source, $langcode);
}

/**
 * Condition implementation: Check if the URL alias exists.
 */
function rules_condition_path_alias_exists($alias, $langcode = LANGUAGE_NONE) {
    return (bool) drupal_lookup_path('source', $alias, $langcode);
}

/**
 * Cleans the given path.
 *
 * A path is cleaned by replacing non ASCII characters in the path with the
 * replacement character.
 *
 * Path cleaning may be customized by overriding the configuration variables:
 * @code rules_clean_path @endcode,
 * @code rules_path_replacement_char @endcode and
 * @code rules_path_transliteration @endcode
 * in the site's settings.php file.
 */
function rules_path_default_cleaning_method($path) {
    $replace = variable_get('rules_path_replacement_char', '-');
    if ($replace) {
        // If the transliteration module is enabled, transliterate the alias first.
        if (module_exists('transliteration') && variable_get('rules_path_transliteration', TRUE)) {
            $path = transliteration_get($path);
        }
        $array = variable_get('rules_clean_path', array(
            '/[^a-zA-Z0-9\\-_]+/',
            $replace,
        ));
        $array[2] = $path;
        // Replace it and remove trailing and leading replacement characters.
        $output = trim(call_user_func_array('preg_replace', $array), $replace);
        if (variable_get('rules_path_lower_case', TRUE)) {
            $output = drupal_strtolower($output);
        }
        return $output;
    }
    else {
        return $path;
    }
}

/**
 * Cleans the given string so it can be used as part of a URL path.
 */
function rules_clean_path($path) {
    $function = variable_get('rules_path_cleaning_callback', 'rules_path_default_cleaning_method');
    if (!function_exists($function)) {
        rules_log('An invalid URL path cleaning callback has been configured. Falling back to the default cleaning method.', array(), RulesLog::WARN);
        $function = 'rules_path_default_cleaning_method';
    }
    return $function($path);
}

/**
 * CTools path cleaning callback.
 *
 * @see rules_admin_settings()
 */
function rules_path_clean_ctools($path) {
    // Make use of the CTools cleanstring implementation.
    ctools_include('cleanstring');
    $settings = array(
        'separator' => variable_get('rules_path_replacement_char', '-'),
        'transliterate' => module_exists('transliteration') && variable_get('rules_path_transliteration', TRUE),
        'lower case' => variable_get('rules_path_lower_case', TRUE),
    );
    return ctools_cleanstring($path, $settings);
}

/**
 * Pathauto path cleaning callback.
 *
 * @see rules_admin_settings()
 */
function rules_path_clean_pathauto($path) {
    module_load_include('inc', 'pathauto');
    return pathauto_cleanstring($path);
}

/**
 * @} End of "addtogroup rules"
 */

Related topics

Functions

Title Deprecated Summary
rules_action_node_path_alias Action Implementation: Set the URL alias for a node.
rules_action_path_alias Action implementation: Path alias.
rules_action_taxonomy_term_path_alias Action Implementation: Set the URL alias for a node.
rules_clean_path Cleans the given string so it can be used as part of a URL path.
rules_condition_path_alias_exists Condition implementation: Check if the URL alias exists.
rules_condition_path_has_alias Condition implementation: Check if the path has an alias.
rules_path_clean_ctools CTools path cleaning callback.
rules_path_clean_pathauto Pathauto path cleaning callback.
rules_path_default_cleaning_method Cleans the given path.