117 lines
3.3 KiB
PHP
117 lines
3.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Expose paths as a context condition.
|
|
*/
|
|
class context_condition_path extends context_condition {
|
|
/**
|
|
* Omit condition values. We will provide a custom input form for our conditions.
|
|
*/
|
|
function condition_values() {
|
|
return array();
|
|
}
|
|
|
|
/**
|
|
* Condition form.
|
|
*/
|
|
function condition_form($context) {
|
|
$form = parent::condition_form($context);
|
|
unset($form['#options']);
|
|
|
|
$form['#type'] = 'textarea';
|
|
$form['#default_value'] = implode("\n", $this->fetch_from_context($context, 'values'));
|
|
return $form;
|
|
}
|
|
|
|
/**
|
|
* Condition form submit handler.
|
|
*/
|
|
function condition_form_submit($values) {
|
|
$parsed = array();
|
|
$items = explode("\n", $values);
|
|
if (!empty($items)) {
|
|
foreach ($items as $v) {
|
|
$v = trim($v);
|
|
if (!empty($v)) {
|
|
$parsed[$v] = $v;
|
|
}
|
|
}
|
|
}
|
|
return $parsed;
|
|
}
|
|
|
|
/**
|
|
* Execute.
|
|
*/
|
|
function execute() {
|
|
if ($this->condition_used()) {
|
|
// Include both the path alias and normal path for matching.
|
|
$current_path = array(drupal_get_path_alias($_GET['q']));
|
|
if ($current_path[0] != $_GET['q']) {
|
|
$current_path[] = $_GET['q'];
|
|
}
|
|
foreach ($this->get_contexts() as $context) {
|
|
$paths = $this->fetch_from_context($context, 'values');
|
|
if ($this->match($current_path, $paths, TRUE)) {
|
|
$this->condition_met($context);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Match the subject against a set of regex patterns.
|
|
* Similar to drupal_match_path() but also handles negation through the use
|
|
* of the ~ character.
|
|
*
|
|
* @param mixed $subject
|
|
* The subject string or an array of strings to be matched.
|
|
* @param array $patterns
|
|
* An array of patterns. Any patterns that begin with ~ are considered
|
|
* negative or excluded conditions.
|
|
* @param boolean $path
|
|
* Whether the given subject should be matched as a Drupal path. If TRUE,
|
|
* '<front>' will be replaced with the site frontpage when matching against
|
|
* $patterns.
|
|
*/
|
|
protected function match($subject, $patterns, $path = FALSE) {
|
|
static $regexps;
|
|
$match = FALSE;
|
|
$positives = $negatives = 0;
|
|
$subject = !is_array($subject) ? array($subject) : $subject;
|
|
foreach ($patterns as $pattern) {
|
|
if (strpos($pattern, '~') === 0) {
|
|
$negate = TRUE;
|
|
$negatives++;
|
|
}
|
|
else {
|
|
$negate = FALSE;
|
|
$positives++;
|
|
}
|
|
$pattern = ltrim($pattern, '~');
|
|
if (!isset($regexps[$pattern])) {
|
|
if ($path) {
|
|
$regexps[$pattern] = '/^(' . preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/', '/(^|\|)\\\\<front\\\\>($|\|)/'), array('|', '.*', '\1' . preg_quote(variable_get('site_frontpage', 'node'), '/') . '\2'), preg_quote($pattern, '/')) . ')$/';
|
|
}
|
|
else {
|
|
$regexps[$pattern] = '/^(' . preg_replace(array('/(\r\n?|\n)/', '/\\\\\*/'), array('|', '.*'), preg_quote($pattern, '/')) . ')$/';
|
|
}
|
|
}
|
|
foreach ($subject as $value) {
|
|
if (preg_match($regexps[$pattern], $value)) {
|
|
if ($negate) {
|
|
return FALSE;
|
|
}
|
|
$match = TRUE;
|
|
}
|
|
}
|
|
}
|
|
// If there are **only** negative conditions and we've gotten this far none
|
|
// we actually have a match.
|
|
if ($positives === 0 && $negatives) {
|
|
return TRUE;
|
|
}
|
|
return $match;
|
|
}
|
|
}
|