View source
<?php
class context_condition_path extends context_condition {
function condition_values() {
return array();
}
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;
}
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;
}
function execute() {
if ($this
->condition_used()) {
$current_path = array(
drupal_get_path_alias($_GET['q']),
);
if ($current_path != $_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);
}
}
}
}
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 ($positives === 0 && $negatives) {
return TRUE;
}
return $match;
}
}