Mercurial > hg > rr-repo
diff sites/all/modules/ctools/plugins/access/path_visibility.inc @ 0:ff03f76ab3fe
initial version
author | danieleb <danielebarchiesi@me.com> |
---|---|
date | Wed, 21 Aug 2013 18:51:11 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sites/all/modules/ctools/plugins/access/path_visibility.inc Wed Aug 21 18:51:11 2013 +0100 @@ -0,0 +1,88 @@ +<?php + +/** + * @file + * Plugin to provide access control/visibility based on path. + */ + +$plugin = array( + 'title' => t('String: URL path'), + 'description' => t('Control access by the current path.'), + 'callback' => 'ctools_path_visibility_ctools_access_check', + 'settings form' => 'ctools_path_visibility_ctools_access_settings', + 'summary' => 'ctools_path_visibility_ctools_access_summary', + 'required context' => new ctools_context_optional(t('Path'), 'string'), + 'default' => array('visibility_setting' => 1, 'paths' => ''), +); + +/** + * Settings form + */ +function ctools_path_visibility_ctools_access_settings($form, &$form_state, $conf) { + $form['settings']['note'] = array( + '#value' => '<div class="description">' . t('Note: if no context is chosen, the current page path will be used.') . '</div>', + ); + + $form['settings']['visibility_setting'] = array( + '#type' => 'radios', + '#options' => array( + 1 => t('Allow access on the following pages'), + 0 => t('Allow access on all pages except the following pages'), + ), + '#default_value' => $conf['visibility_setting'], + ); + + $form['settings']['paths'] = array( + '#type' => 'textarea', + '#title' => t('Paths'), + '#default_value' => $conf['paths'], + '#description' => t("Enter one page per line as Drupal paths. The '*' character is a wildcard. Example paths are %blog for the blog page and %blog-wildcard for every personal blog. %front is the front page.", array('%blog' => 'blog', '%blog-wildcard' => 'blog/*', '%front' => '<front>')), + ); + return $form; +} + +/** + * Check for access. + */ +function ctools_path_visibility_ctools_access_check($conf, $context) { + if (isset($context->data)) { + $base_path = $context->data; + } + else { + $base_path = $_GET['q']; + } + + $path = drupal_get_path_alias($base_path); + $page_match = drupal_match_path($path, $conf['paths']); + + // If there's a path alias, we may still be at the un-aliased path + // so check that as well. + if (!isset($context->data) && $path != $base_path) { + $page_match = $page_match || drupal_match_path($base_path, $conf['paths']); + } + + // When $conf['visibility_setting'] has a value of 0, the block is displayed + // on all pages except those listed in $block->pages. When set to 1, it + // is displayed only on those pages listed in $block->pages. + $page_match = !($conf['visibility_setting'] xor $page_match); + + return $page_match; +} + +/** + * Provide a summary description. + */ +function ctools_path_visibility_ctools_access_summary($conf, $context) { + $paths = array(); + foreach (explode("\n", $conf['paths']) as $path) { + $paths[] = check_plain($path); + } + + $identifier = $context->type == 'any' ? t('Current path') : $context->identifier; + if ($conf['visibility_setting']) { + return format_plural(count($paths), '@identifier is "@paths"', '@identifier type is one of "@paths"', array('@paths' => implode(', ', $paths), '@identifier' => $identifier)); + } + else { + return format_plural(count($paths), '@identifier is not "@paths"', '@identifier type is not one of "@paths"', array('@paths' => implode(', ', $paths), '@identifier' => $identifier)); + } +}