123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- <?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;
- }
- }
|