first import
This commit is contained in:
116
sites/all/modules/context/plugins/context_condition_path.inc
Normal file
116
sites/all/modules/context/plugins/context_condition_path.inc
Normal file
@@ -0,0 +1,116 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user