annotate modules/overlay/overlay.module @ 13:134d4b2e75f6

updated quicktabs and google analytics modules
author danieleb <danielebarchiesi@me.com>
date Tue, 29 Oct 2013 13:48:59 +0000
parents ff03f76ab3fe
children
rev   line source
danielebarchiesi@0 1 <?php
danielebarchiesi@0 2
danielebarchiesi@0 3 /**
danielebarchiesi@0 4 * @file
danielebarchiesi@0 5 * Displays the Drupal administration interface in an overlay.
danielebarchiesi@0 6 */
danielebarchiesi@0 7
danielebarchiesi@0 8 /**
danielebarchiesi@0 9 * Implements hook_help().
danielebarchiesi@0 10 */
danielebarchiesi@0 11 function overlay_help($path, $arg) {
danielebarchiesi@0 12 switch ($path) {
danielebarchiesi@0 13 case 'admin/help#overlay':
danielebarchiesi@0 14 $output = '';
danielebarchiesi@0 15 $output .= '<h3>' . t('About') . '</h3>';
danielebarchiesi@0 16 $output .= '<p>' . t('The Overlay module makes the administration pages on your site display in a JavaScript overlay of the page you were viewing when you clicked the administrative link, instead of replacing the page in your browser window. Use the close link on the overlay to return to the page you were viewing when you clicked the link. For more information, see the online handbook entry for <a href="@overlay">Overlay module</a>.', array('@overlay' => 'http://drupal.org/documentation/modules/overlay')) . '</p>';
danielebarchiesi@0 17 return $output;
danielebarchiesi@0 18 }
danielebarchiesi@0 19 }
danielebarchiesi@0 20
danielebarchiesi@0 21 /**
danielebarchiesi@0 22 * Implements hook_menu().
danielebarchiesi@0 23 */
danielebarchiesi@0 24 function overlay_menu() {
danielebarchiesi@0 25 $items['overlay-ajax/%'] = array(
danielebarchiesi@0 26 'title' => '',
danielebarchiesi@0 27 'page callback' => 'overlay_ajax_render_region',
danielebarchiesi@0 28 'page arguments' => array(1),
danielebarchiesi@0 29 'access arguments' => array('access overlay'),
danielebarchiesi@0 30 'type' => MENU_CALLBACK,
danielebarchiesi@0 31 );
danielebarchiesi@0 32 $items['overlay/dismiss-message'] = array(
danielebarchiesi@0 33 'title' => '',
danielebarchiesi@0 34 'page callback' => 'overlay_user_dismiss_message',
danielebarchiesi@0 35 'access arguments' => array('access overlay'),
danielebarchiesi@0 36 'type' => MENU_CALLBACK,
danielebarchiesi@0 37 );
danielebarchiesi@0 38 return $items;
danielebarchiesi@0 39 }
danielebarchiesi@0 40
danielebarchiesi@0 41 /**
danielebarchiesi@0 42 * Implements hook_admin_paths().
danielebarchiesi@0 43 */
danielebarchiesi@0 44 function overlay_admin_paths() {
danielebarchiesi@0 45 $paths = array(
danielebarchiesi@0 46 // This is marked as an administrative path so that if it is visited from
danielebarchiesi@0 47 // within the overlay, the user will stay within the overlay while the
danielebarchiesi@0 48 // callback is being processed.
danielebarchiesi@0 49 'overlay/dismiss-message' => TRUE,
danielebarchiesi@0 50 );
danielebarchiesi@0 51 return $paths;
danielebarchiesi@0 52 }
danielebarchiesi@0 53
danielebarchiesi@0 54 /**
danielebarchiesi@0 55 * Implements hook_permission().
danielebarchiesi@0 56 */
danielebarchiesi@0 57 function overlay_permission() {
danielebarchiesi@0 58 return array(
danielebarchiesi@0 59 'access overlay' => array(
danielebarchiesi@0 60 'title' => t('Access the administrative overlay'),
danielebarchiesi@0 61 'description' => t('View administrative pages in the overlay.'),
danielebarchiesi@0 62 ),
danielebarchiesi@0 63 );
danielebarchiesi@0 64 }
danielebarchiesi@0 65
danielebarchiesi@0 66 /**
danielebarchiesi@0 67 * Implements hook_theme().
danielebarchiesi@0 68 */
danielebarchiesi@0 69 function overlay_theme() {
danielebarchiesi@0 70 return array(
danielebarchiesi@0 71 'overlay' => array(
danielebarchiesi@0 72 'render element' => 'page',
danielebarchiesi@0 73 'template' => 'overlay',
danielebarchiesi@0 74 ),
danielebarchiesi@0 75 'overlay_disable_message' => array(
danielebarchiesi@0 76 'render element' => 'element',
danielebarchiesi@0 77 ),
danielebarchiesi@0 78 );
danielebarchiesi@0 79 }
danielebarchiesi@0 80
danielebarchiesi@0 81 /**
danielebarchiesi@0 82 * Implements hook_form_FORM_ID_alter().
danielebarchiesi@0 83 */
danielebarchiesi@0 84 function overlay_form_user_profile_form_alter(&$form, &$form_state) {
danielebarchiesi@0 85 if ($form['#user_category'] == 'account') {
danielebarchiesi@0 86 $account = $form['#user'];
danielebarchiesi@0 87 if (user_access('access overlay', $account)) {
danielebarchiesi@0 88 $form['overlay_control'] = array(
danielebarchiesi@0 89 '#type' => 'fieldset',
danielebarchiesi@0 90 '#title' => t('Administrative overlay'),
danielebarchiesi@0 91 '#weight' => 4,
danielebarchiesi@0 92 '#collapsible' => TRUE,
danielebarchiesi@0 93 );
danielebarchiesi@0 94
danielebarchiesi@0 95 $form['overlay_control']['overlay'] = array(
danielebarchiesi@0 96 '#type' => 'checkbox',
danielebarchiesi@0 97 '#title' => t('Use the overlay for administrative pages.'),
danielebarchiesi@0 98 '#description' => t('Show administrative pages on top of the page you started from.'),
danielebarchiesi@0 99 '#default_value' => isset($account->data['overlay']) ? $account->data['overlay'] : 1,
danielebarchiesi@0 100 );
danielebarchiesi@0 101 }
danielebarchiesi@0 102 }
danielebarchiesi@0 103 }
danielebarchiesi@0 104
danielebarchiesi@0 105 /**
danielebarchiesi@0 106 * Implements hook_user_presave().
danielebarchiesi@0 107 */
danielebarchiesi@0 108 function overlay_user_presave(&$edit, $account, $category) {
danielebarchiesi@0 109 if (isset($edit['overlay'])) {
danielebarchiesi@0 110 $edit['data']['overlay'] = $edit['overlay'];
danielebarchiesi@0 111 }
danielebarchiesi@0 112 }
danielebarchiesi@0 113
danielebarchiesi@0 114 /**
danielebarchiesi@0 115 * Implements hook_init().
danielebarchiesi@0 116 *
danielebarchiesi@0 117 * Determine whether the current page request is destined to appear in the
danielebarchiesi@0 118 * parent window or in the overlay window, and format the page accordingly.
danielebarchiesi@0 119 *
danielebarchiesi@0 120 * @see overlay_set_mode()
danielebarchiesi@0 121 */
danielebarchiesi@0 122 function overlay_init() {
danielebarchiesi@0 123 global $user;
danielebarchiesi@0 124
danielebarchiesi@0 125 $mode = overlay_get_mode();
danielebarchiesi@0 126
danielebarchiesi@0 127 // Only act if the user has access to the overlay and a mode was not already
danielebarchiesi@0 128 // set. Other modules can also enable the overlay directly for other uses.
danielebarchiesi@0 129 $use_overlay = !isset($user->data['overlay']) || $user->data['overlay'];
danielebarchiesi@0 130 if (empty($mode) && user_access('access overlay') && $use_overlay) {
danielebarchiesi@0 131 $current_path = current_path();
danielebarchiesi@0 132 // After overlay is enabled on the modules page, redirect to
danielebarchiesi@0 133 // <front>#overlay=admin/modules to actually enable the overlay.
danielebarchiesi@0 134 if (isset($_SESSION['overlay_enable_redirect']) && $_SESSION['overlay_enable_redirect']) {
danielebarchiesi@0 135 unset($_SESSION['overlay_enable_redirect']);
danielebarchiesi@0 136 drupal_goto('<front>', array('fragment' => 'overlay=' . $current_path));
danielebarchiesi@0 137 }
danielebarchiesi@0 138
danielebarchiesi@0 139 if (isset($_GET['render']) && $_GET['render'] == 'overlay') {
danielebarchiesi@0 140 // If a previous page requested that we close the overlay, close it and
danielebarchiesi@0 141 // redirect to the final destination.
danielebarchiesi@0 142 if (isset($_SESSION['overlay_close_dialog'])) {
danielebarchiesi@0 143 call_user_func_array('overlay_close_dialog', $_SESSION['overlay_close_dialog']);
danielebarchiesi@0 144 unset($_SESSION['overlay_close_dialog']);
danielebarchiesi@0 145 }
danielebarchiesi@0 146 // If this page shouldn't be rendered inside the overlay, redirect to the
danielebarchiesi@0 147 // parent.
danielebarchiesi@0 148 elseif (!path_is_admin($current_path)) {
danielebarchiesi@0 149 overlay_close_dialog($current_path, array('query' => drupal_get_query_parameters(NULL, array('q', 'render'))));
danielebarchiesi@0 150 }
danielebarchiesi@0 151
danielebarchiesi@0 152 // Indicate that we are viewing an overlay child page.
danielebarchiesi@0 153 overlay_set_mode('child');
danielebarchiesi@0 154
danielebarchiesi@0 155 // Unset the render parameter to avoid it being included in URLs on the page.
danielebarchiesi@0 156 unset($_GET['render']);
danielebarchiesi@0 157 }
danielebarchiesi@0 158 // Do not enable the overlay if we already are on an admin page.
danielebarchiesi@0 159 elseif (!path_is_admin($current_path)) {
danielebarchiesi@0 160 // Otherwise add overlay parent code and our behavior.
danielebarchiesi@0 161 overlay_set_mode('parent');
danielebarchiesi@0 162 }
danielebarchiesi@0 163 }
danielebarchiesi@0 164 }
danielebarchiesi@0 165
danielebarchiesi@0 166 /**
danielebarchiesi@0 167 * Implements hook_exit().
danielebarchiesi@0 168 *
danielebarchiesi@0 169 * When viewing an overlay child page, check if we need to trigger a refresh of
danielebarchiesi@0 170 * the supplemental regions of the overlay on the next page request.
danielebarchiesi@0 171 */
danielebarchiesi@0 172 function overlay_exit() {
danielebarchiesi@0 173 // Check that we are in an overlay child page. Note that this should never
danielebarchiesi@0 174 // return TRUE on a cached page view, since the child mode is not set until
danielebarchiesi@0 175 // overlay_init() is called.
danielebarchiesi@0 176 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 177 // Load any markup that was stored earlier in the page request, via calls
danielebarchiesi@0 178 // to overlay_store_rendered_content(). If none was stored, this is not a
danielebarchiesi@0 179 // page request where we expect any changes to the overlay supplemental
danielebarchiesi@0 180 // regions to have occurred, so we do not need to proceed any further.
danielebarchiesi@0 181 $original_markup = overlay_get_rendered_content();
danielebarchiesi@0 182 if (!empty($original_markup)) {
danielebarchiesi@0 183 // Compare the original markup to the current markup that we get from
danielebarchiesi@0 184 // rendering each overlay supplemental region now. If they don't match,
danielebarchiesi@0 185 // something must have changed, so we request a refresh of that region
danielebarchiesi@0 186 // within the parent window on the next page request.
danielebarchiesi@0 187 foreach (overlay_supplemental_regions() as $region) {
danielebarchiesi@0 188 if (!isset($original_markup[$region]) || $original_markup[$region] != overlay_render_region($region)) {
danielebarchiesi@0 189 overlay_request_refresh($region);
danielebarchiesi@0 190 }
danielebarchiesi@0 191 }
danielebarchiesi@0 192 }
danielebarchiesi@0 193 }
danielebarchiesi@0 194 }
danielebarchiesi@0 195
danielebarchiesi@0 196 /**
danielebarchiesi@0 197 * Implements hook_library().
danielebarchiesi@0 198 */
danielebarchiesi@0 199 function overlay_library() {
danielebarchiesi@0 200 $module_path = drupal_get_path('module', 'overlay');
danielebarchiesi@0 201
danielebarchiesi@0 202 // Overlay parent.
danielebarchiesi@0 203 $libraries['parent'] = array(
danielebarchiesi@0 204 'title' => 'Overlay: Parent',
danielebarchiesi@0 205 'website' => 'http://drupal.org/documentation/modules/overlay',
danielebarchiesi@0 206 'version' => '1.0',
danielebarchiesi@0 207 'js' => array(
danielebarchiesi@0 208 $module_path . '/overlay-parent.js' => array(),
danielebarchiesi@0 209 ),
danielebarchiesi@0 210 'css' => array(
danielebarchiesi@0 211 $module_path . '/overlay-parent.css' => array(),
danielebarchiesi@0 212 ),
danielebarchiesi@0 213 'dependencies' => array(
danielebarchiesi@0 214 array('system', 'ui'),
danielebarchiesi@0 215 array('system', 'jquery.bbq'),
danielebarchiesi@0 216 ),
danielebarchiesi@0 217 );
danielebarchiesi@0 218 // Overlay child.
danielebarchiesi@0 219 $libraries['child'] = array(
danielebarchiesi@0 220 'title' => 'Overlay: Child',
danielebarchiesi@0 221 'website' => 'http://drupal.org/documentation/modules/overlay',
danielebarchiesi@0 222 'version' => '1.0',
danielebarchiesi@0 223 'js' => array(
danielebarchiesi@0 224 $module_path . '/overlay-child.js' => array(),
danielebarchiesi@0 225 ),
danielebarchiesi@0 226 'css' => array(
danielebarchiesi@0 227 $module_path . '/overlay-child.css' => array(),
danielebarchiesi@0 228 ),
danielebarchiesi@0 229 );
danielebarchiesi@0 230
danielebarchiesi@0 231 return $libraries;
danielebarchiesi@0 232 }
danielebarchiesi@0 233
danielebarchiesi@0 234 /**
danielebarchiesi@0 235 * Implements hook_drupal_goto_alter().
danielebarchiesi@0 236 */
danielebarchiesi@0 237 function overlay_drupal_goto_alter(&$path, &$options, &$http_response_code) {
danielebarchiesi@0 238 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 239 // The authorize.php script bootstraps Drupal to a very low level, where
danielebarchiesi@0 240 // the PHP code that is necessary to close the overlay properly will not be
danielebarchiesi@0 241 // loaded. Therefore, if we are redirecting to authorize.php inside the
danielebarchiesi@0 242 // overlay, instead redirect back to the current page with instructions to
danielebarchiesi@0 243 // close the overlay there before redirecting to the final destination; see
danielebarchiesi@0 244 // overlay_init().
danielebarchiesi@0 245 if ($path == system_authorized_get_url() || $path == system_authorized_batch_processing_url()) {
danielebarchiesi@0 246 $_SESSION['overlay_close_dialog'] = array($path, $options);
danielebarchiesi@0 247 $path = current_path();
danielebarchiesi@0 248 $options = drupal_get_query_parameters();
danielebarchiesi@0 249 }
danielebarchiesi@0 250
danielebarchiesi@0 251 // If the current page request is inside the overlay, add ?render=overlay
danielebarchiesi@0 252 // to the new path, so that it appears correctly inside the overlay.
danielebarchiesi@0 253 if (isset($options['query'])) {
danielebarchiesi@0 254 $options['query'] += array('render' => 'overlay');
danielebarchiesi@0 255 }
danielebarchiesi@0 256 else {
danielebarchiesi@0 257 $options['query'] = array('render' => 'overlay');
danielebarchiesi@0 258 }
danielebarchiesi@0 259 }
danielebarchiesi@0 260 }
danielebarchiesi@0 261
danielebarchiesi@0 262 /**
danielebarchiesi@0 263 * Implements hook_batch_alter().
danielebarchiesi@0 264 *
danielebarchiesi@0 265 * If the current page request is inside the overlay, add ?render=overlay to
danielebarchiesi@0 266 * the success callback URL, so that it appears correctly within the overlay.
danielebarchiesi@0 267 *
danielebarchiesi@0 268 * @see overlay_get_mode()
danielebarchiesi@0 269 */
danielebarchiesi@0 270 function overlay_batch_alter(&$batch) {
danielebarchiesi@0 271 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 272 if (isset($batch['url_options']['query'])) {
danielebarchiesi@0 273 $batch['url_options']['query']['render'] = 'overlay';
danielebarchiesi@0 274 }
danielebarchiesi@0 275 else {
danielebarchiesi@0 276 $batch['url_options']['query'] = array('render' => 'overlay');
danielebarchiesi@0 277 }
danielebarchiesi@0 278 }
danielebarchiesi@0 279 }
danielebarchiesi@0 280
danielebarchiesi@0 281 /**
danielebarchiesi@0 282 * Implements hook_page_alter().
danielebarchiesi@0 283 */
danielebarchiesi@0 284 function overlay_page_alter(&$page) {
danielebarchiesi@0 285 // If we are limiting rendering to a subset of page regions, deny access to
danielebarchiesi@0 286 // all other regions so that they will not be processed.
danielebarchiesi@0 287 if ($regions_to_render = overlay_get_regions_to_render()) {
danielebarchiesi@0 288 $skipped_regions = array_diff(element_children($page), $regions_to_render);
danielebarchiesi@0 289 foreach ($skipped_regions as $skipped_region) {
danielebarchiesi@0 290 $page[$skipped_region]['#access'] = FALSE;
danielebarchiesi@0 291 }
danielebarchiesi@0 292 }
danielebarchiesi@0 293
danielebarchiesi@0 294 $mode = overlay_get_mode();
danielebarchiesi@0 295 if ($mode == 'child') {
danielebarchiesi@0 296 // Add the overlay wrapper before the html wrapper.
danielebarchiesi@0 297 array_unshift($page['#theme_wrappers'], 'overlay');
danielebarchiesi@0 298 }
danielebarchiesi@0 299 elseif ($mode == 'parent' && ($message = overlay_disable_message())) {
danielebarchiesi@0 300 $page['page_top']['disable_overlay'] = $message;
danielebarchiesi@0 301 }
danielebarchiesi@0 302 }
danielebarchiesi@0 303
danielebarchiesi@0 304 /**
danielebarchiesi@0 305 * Page callback: Dismisses the overlay accessibility message for this user.
danielebarchiesi@0 306 *
danielebarchiesi@0 307 * @return
danielebarchiesi@0 308 * A render array for a page containing a list of content.
danielebarchiesi@0 309 */
danielebarchiesi@0 310 function overlay_user_dismiss_message() {
danielebarchiesi@0 311 global $user;
danielebarchiesi@0 312 // It's unlikely, but possible that "access overlay" permission is granted to
danielebarchiesi@0 313 // the anonymous role. In this case, we do not display the message to disable
danielebarchiesi@0 314 // the overlay, so there is nothing to dismiss. Also, protect against
danielebarchiesi@0 315 // cross-site request forgeries by validating a token.
danielebarchiesi@0 316 if (empty($user->uid) || !isset($_GET['token']) || !drupal_valid_token($_GET['token'], 'overlay')) {
danielebarchiesi@0 317 return MENU_ACCESS_DENIED;
danielebarchiesi@0 318 }
danielebarchiesi@0 319 else {
danielebarchiesi@0 320 user_save(user_load($user->uid), array('data' => array('overlay_message_dismissed' => 1)));
danielebarchiesi@0 321 drupal_set_message(t('The message has been dismissed. You can change your overlay settings at any time by visiting your profile page.'));
danielebarchiesi@0 322 // Destination is normally given. Go to the user profile as a fallback.
danielebarchiesi@0 323 drupal_goto('user/' . $user->uid . '/edit');
danielebarchiesi@0 324 }
danielebarchiesi@0 325 }
danielebarchiesi@0 326
danielebarchiesi@0 327 /**
danielebarchiesi@0 328 * Returns a renderable array representing a message for disabling the overlay.
danielebarchiesi@0 329 *
danielebarchiesi@0 330 * If the current user can access the overlay and has not previously indicated
danielebarchiesi@0 331 * that this message should be dismissed, this function returns a message
danielebarchiesi@0 332 * containing a link to disable the overlay. Nothing is returned for anonymous
danielebarchiesi@0 333 * users, because the links control per-user settings. Because some screen
danielebarchiesi@0 334 * readers are unable to properly read overlay contents, site builders are
danielebarchiesi@0 335 * discouraged from granting the "access overlay" permission to the anonymous
danielebarchiesi@0 336 * role.
danielebarchiesi@0 337 *
danielebarchiesi@0 338 * @see http://drupal.org/node/890284
danielebarchiesi@0 339 */
danielebarchiesi@0 340 function overlay_disable_message() {
danielebarchiesi@0 341 global $user;
danielebarchiesi@0 342
danielebarchiesi@0 343 if (!empty($user->uid) && empty($user->data['overlay_message_dismissed']) && (!isset($user->data['overlay']) || $user->data['overlay']) && user_access('access overlay')) {
danielebarchiesi@0 344 $build = array(
danielebarchiesi@0 345 '#theme' => 'overlay_disable_message',
danielebarchiesi@0 346 '#weight' => -99,
danielebarchiesi@0 347 // Link to the user's profile page, where the overlay can be disabled.
danielebarchiesi@0 348 'profile_link' => array(
danielebarchiesi@0 349 '#type' => 'link',
danielebarchiesi@0 350 '#title' => t('If you have problems accessing administrative pages on this site, disable the overlay on your profile page.'),
danielebarchiesi@0 351 '#href' => 'user/' . $user->uid . '/edit',
danielebarchiesi@0 352 '#options' => array(
danielebarchiesi@0 353 'query' => drupal_get_destination(),
danielebarchiesi@0 354 'fragment' => 'edit-overlay-control',
danielebarchiesi@0 355 'attributes' => array(
danielebarchiesi@0 356 'id' => 'overlay-profile-link',
danielebarchiesi@0 357 // Prevent the target page from being opened in the overlay.
danielebarchiesi@0 358 'class' => array('overlay-exclude'),
danielebarchiesi@0 359 ),
danielebarchiesi@0 360 ),
danielebarchiesi@0 361 ),
danielebarchiesi@0 362 // Link to a menu callback that allows this message to be permanently
danielebarchiesi@0 363 // dismissed for the current user.
danielebarchiesi@0 364 'dismiss_message_link' => array(
danielebarchiesi@0 365 '#type' => 'link',
danielebarchiesi@0 366 '#title' => t('Dismiss this message.'),
danielebarchiesi@0 367 '#href' => 'overlay/dismiss-message',
danielebarchiesi@0 368 '#options' => array(
danielebarchiesi@0 369 'query' => drupal_get_destination() + array(
danielebarchiesi@0 370 // Add a token to protect against cross-site request forgeries.
danielebarchiesi@0 371 'token' => drupal_get_token('overlay'),
danielebarchiesi@0 372 ),
danielebarchiesi@0 373 'attributes' => array(
danielebarchiesi@0 374 'id' => 'overlay-dismiss-message',
danielebarchiesi@0 375 // If this message is being displayed outside the overlay, prevent
danielebarchiesi@0 376 // this link from opening the overlay.
danielebarchiesi@0 377 'class' => (overlay_get_mode() == 'parent') ? array('overlay-exclude') : array(),
danielebarchiesi@0 378 ),
danielebarchiesi@0 379 ),
danielebarchiesi@0 380 )
danielebarchiesi@0 381 );
danielebarchiesi@0 382 }
danielebarchiesi@0 383 else {
danielebarchiesi@0 384 $build = array();
danielebarchiesi@0 385 }
danielebarchiesi@0 386
danielebarchiesi@0 387 return $build;
danielebarchiesi@0 388 }
danielebarchiesi@0 389
danielebarchiesi@0 390 /**
danielebarchiesi@0 391 * Returns the HTML for the message about how to disable the overlay.
danielebarchiesi@0 392 *
danielebarchiesi@0 393 * @param $variables
danielebarchiesi@0 394 * An associative array with an 'element' element, which itself is an
danielebarchiesi@0 395 * associative array containing:
danielebarchiesi@0 396 * - profile_link: The link to this user's account.
danielebarchiesi@0 397 * - dismiss_message_link: The link to dismiss the overlay.
danielebarchiesi@0 398 *
danielebarchiesi@0 399 * @ingroup themeable
danielebarchiesi@0 400 */
danielebarchiesi@0 401 function theme_overlay_disable_message($variables) {
danielebarchiesi@0 402 $element = $variables['element'];
danielebarchiesi@0 403
danielebarchiesi@0 404 // Add CSS classes to hide the links from most sighted users, while keeping
danielebarchiesi@0 405 // them accessible to screen-reader users and keyboard-only users. To assist
danielebarchiesi@0 406 // screen-reader users, this message appears in both the parent and child
danielebarchiesi@0 407 // documents, but only the one in the child document is part of the tab order.
danielebarchiesi@0 408 foreach (array('profile_link', 'dismiss_message_link') as $key) {
danielebarchiesi@0 409 $element[$key]['#options']['attributes']['class'][] = 'element-invisible';
danielebarchiesi@0 410 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 411 $element[$key]['#options']['attributes']['class'][] = 'element-focusable';
danielebarchiesi@0 412 }
danielebarchiesi@0 413 }
danielebarchiesi@0 414
danielebarchiesi@0 415 // Render the links.
danielebarchiesi@0 416 $output = drupal_render($element['profile_link']) . ' ' . drupal_render($element['dismiss_message_link']);
danielebarchiesi@0 417
danielebarchiesi@0 418 // Add a heading for screen-reader users. The heading doesn't need to be seen
danielebarchiesi@0 419 // by sighted users.
danielebarchiesi@0 420 $output = '<h3 class="element-invisible">' . t('Options for the administrative overlay') . '</h3>' . $output;
danielebarchiesi@0 421
danielebarchiesi@0 422 // Wrap in a container for styling.
danielebarchiesi@0 423 $output = '<div id="overlay-disable-message" class="clearfix">' . $output . '</div>';
danielebarchiesi@0 424
danielebarchiesi@0 425 return $output;
danielebarchiesi@0 426 }
danielebarchiesi@0 427
danielebarchiesi@0 428 /**
danielebarchiesi@0 429 * Implements hook_block_list_alter().
danielebarchiesi@0 430 */
danielebarchiesi@0 431 function overlay_block_list_alter(&$blocks) {
danielebarchiesi@0 432 // If we are limiting rendering to a subset of page regions, hide all blocks
danielebarchiesi@0 433 // which appear in regions not on that list. Note that overlay_page_alter()
danielebarchiesi@0 434 // does a more comprehensive job of preventing unwanted regions from being
danielebarchiesi@0 435 // displayed (regardless of whether they contain blocks or not), but the
danielebarchiesi@0 436 // reason for duplicating effort here is performance; we do not even want
danielebarchiesi@0 437 // these blocks to be built if they are not going to be displayed.
danielebarchiesi@0 438 if ($regions_to_render = overlay_get_regions_to_render()) {
danielebarchiesi@0 439 foreach ($blocks as $bid => $block) {
danielebarchiesi@0 440 if (!in_array($block->region, $regions_to_render)) {
danielebarchiesi@0 441 unset($blocks[$bid]);
danielebarchiesi@0 442 }
danielebarchiesi@0 443 }
danielebarchiesi@0 444 }
danielebarchiesi@0 445 }
danielebarchiesi@0 446
danielebarchiesi@0 447 /**
danielebarchiesi@0 448 * Implements hook_system_info_alter().
danielebarchiesi@0 449 *
danielebarchiesi@0 450 * Add default regions for the overlay.
danielebarchiesi@0 451 */
danielebarchiesi@0 452 function overlay_system_info_alter(&$info, $file, $type) {
danielebarchiesi@0 453 if ($type == 'theme') {
danielebarchiesi@0 454 $info['overlay_regions'][] = 'content';
danielebarchiesi@0 455 $info['overlay_regions'][] = 'help';
danielebarchiesi@0 456 }
danielebarchiesi@0 457 }
danielebarchiesi@0 458
danielebarchiesi@0 459 /**
danielebarchiesi@0 460 * Implements hook_preprocess_html().
danielebarchiesi@0 461 *
danielebarchiesi@0 462 * If the current page request is inside the overlay, add appropriate classes
danielebarchiesi@0 463 * to the <body> element, and simplify the page title.
danielebarchiesi@0 464 *
danielebarchiesi@0 465 * @see overlay_get_mode()
danielebarchiesi@0 466 */
danielebarchiesi@0 467 function overlay_preprocess_html(&$variables) {
danielebarchiesi@0 468 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 469 // Add overlay class, so themes can react to being displayed in the overlay.
danielebarchiesi@0 470 $variables['classes_array'][] = 'overlay';
danielebarchiesi@0 471 }
danielebarchiesi@0 472 }
danielebarchiesi@0 473
danielebarchiesi@0 474 /**
danielebarchiesi@0 475 * Implements hook_preprocess_maintenance_page().
danielebarchiesi@0 476 *
danielebarchiesi@0 477 * If the current page request is inside the overlay, add appropriate classes
danielebarchiesi@0 478 * to the <body> element, and simplify the page title.
danielebarchiesi@0 479 *
danielebarchiesi@0 480 * @see overlay_preprocess_maintenance_page()
danielebarchiesi@0 481 */
danielebarchiesi@0 482 function overlay_preprocess_maintenance_page(&$variables) {
danielebarchiesi@0 483 overlay_preprocess_html($variables);
danielebarchiesi@0 484 }
danielebarchiesi@0 485
danielebarchiesi@0 486 /**
danielebarchiesi@0 487 * Implements template_preprocess_HOOK() for overlay.tpl.php
danielebarchiesi@0 488 *
danielebarchiesi@0 489 * If the current page request is inside the overlay, add appropriate classes
danielebarchiesi@0 490 * to the <body> element, and simplify the page title.
danielebarchiesi@0 491 *
danielebarchiesi@0 492 * @see template_process_overlay()
danielebarchiesi@0 493 * @see overlay.tpl.php
danielebarchiesi@0 494 */
danielebarchiesi@0 495 function template_preprocess_overlay(&$variables) {
danielebarchiesi@0 496 $variables['tabs'] = menu_primary_local_tasks();
danielebarchiesi@0 497 $variables['title'] = drupal_get_title();
danielebarchiesi@0 498 $variables['disable_overlay'] = overlay_disable_message();
danielebarchiesi@0 499 $variables['content_attributes_array']['class'][] = 'clearfix';
danielebarchiesi@0 500 }
danielebarchiesi@0 501
danielebarchiesi@0 502 /**
danielebarchiesi@0 503 * Implements template_process_HOOK() for overlay.tpl.php
danielebarchiesi@0 504 *
danielebarchiesi@0 505 * Places the rendered HTML for the page body into a top level variable.
danielebarchiesi@0 506 *
danielebarchiesi@0 507 * @see template_preprocess_overlay()
danielebarchiesi@0 508 * @see overlay.tpl.php
danielebarchiesi@0 509 */
danielebarchiesi@0 510 function template_process_overlay(&$variables) {
danielebarchiesi@0 511 $variables['page'] = $variables['page']['#children'];
danielebarchiesi@0 512 }
danielebarchiesi@0 513
danielebarchiesi@0 514 /**
danielebarchiesi@0 515 * Implements hook_preprocess_page().
danielebarchiesi@0 516 *
danielebarchiesi@0 517 * If the current page request is inside the overlay, hide the tabs.
danielebarchiesi@0 518 *
danielebarchiesi@0 519 * @see overlay_get_mode()
danielebarchiesi@0 520 */
danielebarchiesi@0 521 function overlay_preprocess_page(&$variables) {
danielebarchiesi@0 522 if (overlay_get_mode() == 'child') {
danielebarchiesi@0 523 unset($variables['tabs']['#primary']);
danielebarchiesi@0 524 }
danielebarchiesi@0 525 }
danielebarchiesi@0 526
danielebarchiesi@0 527 /**
danielebarchiesi@0 528 * Stores and returns whether an empty page override is needed.
danielebarchiesi@0 529 *
danielebarchiesi@0 530 * This is used to prevent a page request which closes the overlay (for
danielebarchiesi@0 531 * example, a form submission) from being fully re-rendered before the overlay
danielebarchiesi@0 532 * is closed. Instead, we store a variable which will cause the page to be
danielebarchiesi@0 533 * rendered by a delivery callback function that does not actually print
danielebarchiesi@0 534 * visible HTML (but rather only the bare minimum scripts and styles necessary
danielebarchiesi@0 535 * to trigger the overlay to close), thereby allowing the dialog to be closed
danielebarchiesi@0 536 * faster and with less interruption, and also allowing the display of messages
danielebarchiesi@0 537 * to be deferred to the parent window (rather than displaying them in the
danielebarchiesi@0 538 * child window, which will close before the user has had a chance to read
danielebarchiesi@0 539 * them).
danielebarchiesi@0 540 *
danielebarchiesi@0 541 * @param $value
danielebarchiesi@0 542 * By default, an empty page will not be displayed. Set to TRUE to request
danielebarchiesi@0 543 * an empty page display, or FALSE to disable the empty page display (if it
danielebarchiesi@0 544 * was previously enabled on this page request).
danielebarchiesi@0 545 *
danielebarchiesi@0 546 * @return
danielebarchiesi@0 547 * TRUE if the current behavior is to display an empty page, or FALSE if not.
danielebarchiesi@0 548 *
danielebarchiesi@0 549 * @see overlay_page_delivery_callback_alter()
danielebarchiesi@0 550 */
danielebarchiesi@0 551 function overlay_display_empty_page($value = NULL) {
danielebarchiesi@0 552 $display_empty_page = &drupal_static(__FUNCTION__, FALSE);
danielebarchiesi@0 553 if (isset($value)) {
danielebarchiesi@0 554 $display_empty_page = $value;
danielebarchiesi@0 555 }
danielebarchiesi@0 556 return $display_empty_page;
danielebarchiesi@0 557 }
danielebarchiesi@0 558
danielebarchiesi@0 559 /**
danielebarchiesi@0 560 * Implements hook_page_delivery_callback_alter().
danielebarchiesi@0 561 */
danielebarchiesi@0 562 function overlay_page_delivery_callback_alter(&$callback) {
danielebarchiesi@0 563 if (overlay_display_empty_page()) {
danielebarchiesi@0 564 $callback = 'overlay_deliver_empty_page';
danielebarchiesi@0 565 }
danielebarchiesi@0 566 }
danielebarchiesi@0 567
danielebarchiesi@0 568 /**
danielebarchiesi@0 569 * Prints an empty page.
danielebarchiesi@0 570 *
danielebarchiesi@0 571 * This function is used to print out a bare minimum empty page which still has
danielebarchiesi@0 572 * the scripts and styles necessary in order to trigger the overlay to close.
danielebarchiesi@0 573 */
danielebarchiesi@0 574 function overlay_deliver_empty_page() {
danielebarchiesi@0 575 $empty_page = '<html><head><title></title>' . drupal_get_css() . drupal_get_js() . '</head><body class="overlay"></body></html>';
danielebarchiesi@0 576 print $empty_page;
danielebarchiesi@0 577 drupal_exit();
danielebarchiesi@0 578 }
danielebarchiesi@0 579
danielebarchiesi@0 580 /**
danielebarchiesi@0 581 * Gets the current overlay mode.
danielebarchiesi@0 582 *
danielebarchiesi@0 583 * @see overlay_set_mode()
danielebarchiesi@0 584 */
danielebarchiesi@0 585 function overlay_get_mode() {
danielebarchiesi@0 586 return overlay_set_mode(NULL);
danielebarchiesi@0 587 }
danielebarchiesi@0 588
danielebarchiesi@0 589 /**
danielebarchiesi@0 590 * Sets the overlay mode and adds proper JavaScript and styles to the page.
danielebarchiesi@0 591 *
danielebarchiesi@0 592 * Note that since setting the overlay mode triggers a variety of behaviors
danielebarchiesi@0 593 * (including hooks being invoked), it can only be done once per page request.
danielebarchiesi@0 594 * Therefore, the first call to this function which passes along a value of the
danielebarchiesi@0 595 * $mode parameter controls the overlay mode that will be used.
danielebarchiesi@0 596 *
danielebarchiesi@0 597 * @param $mode
danielebarchiesi@0 598 * To set the mode, pass in one of the following values:
danielebarchiesi@0 599 * - 'parent': This is used in the context of a parent window (a regular
danielebarchiesi@0 600 * browser window). If set, JavaScript is added so that administrative
danielebarchiesi@0 601 * links in the parent window will open in an overlay.
danielebarchiesi@0 602 * - 'child': This is used in the context of the child overlay window (the
danielebarchiesi@0 603 * page actually appearing within the overlay iframe). If set, JavaScript
danielebarchiesi@0 604 * and CSS are added so that Drupal behaves nicely from within the overlay.
danielebarchiesi@0 605 * - 'none': This is used to avoid adding any overlay-related code to the
danielebarchiesi@0 606 * page at all. Modules can set this to explicitly prevent the overlay from
danielebarchiesi@0 607 * being used. For example, since the overlay module itself sets the mode
danielebarchiesi@0 608 * to 'parent' or 'child' in overlay_init() when certain conditions are
danielebarchiesi@0 609 * met, other modules which want to override that behavior can do so by
danielebarchiesi@0 610 * setting the mode to 'none' earlier in the page request - e.g., in their
danielebarchiesi@0 611 * own hook_init() implementations, if they have a lower weight.
danielebarchiesi@0 612 * This parameter is optional, and if omitted, the current mode will be
danielebarchiesi@0 613 * returned with no action taken.
danielebarchiesi@0 614 *
danielebarchiesi@0 615 * @return
danielebarchiesi@0 616 * The current mode, if any has been set, or NULL if no mode has been set.
danielebarchiesi@0 617 *
danielebarchiesi@0 618 * @ingroup overlay_api
danielebarchiesi@0 619 * @see overlay_init()
danielebarchiesi@0 620 */
danielebarchiesi@0 621 function overlay_set_mode($mode = NULL) {
danielebarchiesi@0 622 global $base_path;
danielebarchiesi@0 623 $overlay_mode = &drupal_static(__FUNCTION__);
danielebarchiesi@0 624
danielebarchiesi@0 625 // Make sure external resources are not included more than once. Also return
danielebarchiesi@0 626 // the current mode, if no mode was specified.
danielebarchiesi@0 627 if (isset($overlay_mode) || !isset($mode)) {
danielebarchiesi@0 628 return $overlay_mode;
danielebarchiesi@0 629 }
danielebarchiesi@0 630 $overlay_mode = $mode;
danielebarchiesi@0 631
danielebarchiesi@0 632 switch ($overlay_mode) {
danielebarchiesi@0 633 case 'parent':
danielebarchiesi@0 634 drupal_add_library('overlay', 'parent');
danielebarchiesi@0 635
danielebarchiesi@0 636 // Allow modules to act upon overlay events.
danielebarchiesi@0 637 module_invoke_all('overlay_parent_initialize');
danielebarchiesi@0 638 break;
danielebarchiesi@0 639
danielebarchiesi@0 640 case 'child':
danielebarchiesi@0 641 drupal_add_library('overlay', 'child');
danielebarchiesi@0 642
danielebarchiesi@0 643 // Allow modules to act upon overlay events.
danielebarchiesi@0 644 module_invoke_all('overlay_child_initialize');
danielebarchiesi@0 645 break;
danielebarchiesi@0 646 }
danielebarchiesi@0 647 return $overlay_mode;
danielebarchiesi@0 648 }
danielebarchiesi@0 649
danielebarchiesi@0 650 /**
danielebarchiesi@0 651 * Implements hook_overlay_parent_initialize().
danielebarchiesi@0 652 */
danielebarchiesi@0 653 function overlay_overlay_parent_initialize() {
danielebarchiesi@0 654 // Let the client side know which paths are administrative.
danielebarchiesi@0 655 $paths = path_get_admin_paths();
danielebarchiesi@0 656 foreach ($paths as &$type) {
danielebarchiesi@0 657 $type = str_replace('<front>', variable_get('site_frontpage', 'node'), $type);
danielebarchiesi@0 658 }
danielebarchiesi@0 659 drupal_add_js(array('overlay' => array('paths' => $paths)), 'setting');
danielebarchiesi@0 660 $path_prefixes = array();
danielebarchiesi@0 661 if (module_exists('locale') && variable_get('locale_language_negotiation_url_part', LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) == LOCALE_LANGUAGE_NEGOTIATION_URL_PREFIX) {
danielebarchiesi@0 662 // Get languages grouped by status and select only the enabled ones.
danielebarchiesi@0 663 $languages = language_list('enabled');
danielebarchiesi@0 664 $languages = $languages[1];
danielebarchiesi@0 665
danielebarchiesi@0 666 $path_prefixes = array();
danielebarchiesi@0 667 foreach ($languages as $language) {
danielebarchiesi@0 668 if ($language->prefix) {
danielebarchiesi@0 669 $path_prefixes[] = $language->prefix;
danielebarchiesi@0 670 }
danielebarchiesi@0 671 }
danielebarchiesi@0 672 }
danielebarchiesi@0 673 drupal_add_js(array('overlay' => array('pathPrefixes' => $path_prefixes)), 'setting');
danielebarchiesi@0 674 // Pass along the Ajax callback for rerendering sections of the parent window.
danielebarchiesi@0 675 drupal_add_js(array('overlay' => array('ajaxCallback' => 'overlay-ajax')), 'setting');
danielebarchiesi@0 676 }
danielebarchiesi@0 677
danielebarchiesi@0 678 /**
danielebarchiesi@0 679 * Implements hook_overlay_child_initialize().
danielebarchiesi@0 680 */
danielebarchiesi@0 681 function overlay_overlay_child_initialize() {
danielebarchiesi@0 682 // Check if the parent window needs to refresh any page regions on this page
danielebarchiesi@0 683 // request.
danielebarchiesi@0 684 overlay_trigger_refresh();
danielebarchiesi@0 685 // If this is a POST request, or a GET request with a token parameter, we
danielebarchiesi@0 686 // have an indication that something in the supplemental regions of the
danielebarchiesi@0 687 // overlay might change during the current page request. We therefore store
danielebarchiesi@0 688 // the initial rendered content of those regions here, so that we can compare
danielebarchiesi@0 689 // it to the same content rendered in overlay_exit(), at the end of the page
danielebarchiesi@0 690 // request. This allows us to check if anything actually did change, and, if
danielebarchiesi@0 691 // so, trigger an immediate Ajax refresh of the parent window.
danielebarchiesi@0 692 if (!empty($_POST) || isset($_GET['token'])) {
danielebarchiesi@0 693 foreach (overlay_supplemental_regions() as $region) {
danielebarchiesi@0 694 overlay_store_rendered_content($region, overlay_render_region($region));
danielebarchiesi@0 695 }
danielebarchiesi@0 696 // In addition, notify the parent window that when the overlay closes,
danielebarchiesi@0 697 // the entire parent window should be refreshed.
danielebarchiesi@0 698 overlay_request_page_refresh();
danielebarchiesi@0 699 }
danielebarchiesi@0 700 // Indicate that when the main page rendering occurs later in the page
danielebarchiesi@0 701 // request, only the regions that appear within the overlay should be
danielebarchiesi@0 702 // rendered.
danielebarchiesi@0 703 overlay_set_regions_to_render(overlay_regions());
danielebarchiesi@0 704 }
danielebarchiesi@0 705
danielebarchiesi@0 706 /**
danielebarchiesi@0 707 * Requests that the overlay closes when the page is displayed.
danielebarchiesi@0 708 *
danielebarchiesi@0 709 * @param $redirect
danielebarchiesi@0 710 * (optional) The path that should open in the parent window after the
danielebarchiesi@0 711 * overlay closes. If not set, no redirect will be performed on the parent
danielebarchiesi@0 712 * window.
danielebarchiesi@0 713 *
danielebarchiesi@0 714 * @param $redirect_options
danielebarchiesi@0 715 * (optional) An associative array of options to use when generating the
danielebarchiesi@0 716 * redirect URL.
danielebarchiesi@0 717 */
danielebarchiesi@0 718 function overlay_close_dialog($redirect = NULL, $redirect_options = array()) {
danielebarchiesi@0 719 $settings = array(
danielebarchiesi@0 720 'overlayChild' => array(
danielebarchiesi@0 721 'closeOverlay' => TRUE,
danielebarchiesi@0 722 ),
danielebarchiesi@0 723 );
danielebarchiesi@0 724
danielebarchiesi@0 725 // Tell the child window to perform the redirection when requested to.
danielebarchiesi@0 726 if (isset($redirect)) {
danielebarchiesi@0 727 $settings['overlayChild']['redirect'] = url($redirect, $redirect_options);
danielebarchiesi@0 728 }
danielebarchiesi@0 729
danielebarchiesi@0 730 drupal_add_js($settings, array('type' => 'setting'));
danielebarchiesi@0 731
danielebarchiesi@0 732 // Since we are closing the overlay as soon as the page is displayed, we do
danielebarchiesi@0 733 // not want to show any of the page's actual content.
danielebarchiesi@0 734 overlay_display_empty_page(TRUE);
danielebarchiesi@0 735 }
danielebarchiesi@0 736
danielebarchiesi@0 737 /**
danielebarchiesi@0 738 * Returns a list of page regions that appear in the overlay.
danielebarchiesi@0 739 *
danielebarchiesi@0 740 * Overlay regions correspond to the entire contents of the overlay child
danielebarchiesi@0 741 * window and are refreshed each time a new page request is made within the
danielebarchiesi@0 742 * overlay.
danielebarchiesi@0 743 *
danielebarchiesi@0 744 * @return
danielebarchiesi@0 745 * An array of region names that correspond to those which appear in the
danielebarchiesi@0 746 * overlay, within the theme that is being used to display the current page.
danielebarchiesi@0 747 *
danielebarchiesi@0 748 * @see overlay_supplemental_regions()
danielebarchiesi@0 749 */
danielebarchiesi@0 750 function overlay_regions() {
danielebarchiesi@0 751 return _overlay_region_list('overlay_regions');
danielebarchiesi@0 752 }
danielebarchiesi@0 753
danielebarchiesi@0 754 /**
danielebarchiesi@0 755 * Returns a list of supplemental page regions for the overlay.
danielebarchiesi@0 756 *
danielebarchiesi@0 757 * Supplemental overlay regions are those which are technically part of the
danielebarchiesi@0 758 * parent window, but appear to the user as being related to the overlay
danielebarchiesi@0 759 * (usually because they are displayed next to, rather than underneath, the
danielebarchiesi@0 760 * main overlay regions) and therefore need to be dynamically refreshed if any
danielebarchiesi@0 761 * administrative actions taken within the overlay change their contents.
danielebarchiesi@0 762 *
danielebarchiesi@0 763 * An example of a typical overlay supplemental region would be the 'page_top'
danielebarchiesi@0 764 * region, in the case where a toolbar is being displayed there.
danielebarchiesi@0 765 *
danielebarchiesi@0 766 * @return
danielebarchiesi@0 767 * An array of region names that correspond to supplemental overlay regions,
danielebarchiesi@0 768 * within the theme that is being used to display the current page.
danielebarchiesi@0 769 *
danielebarchiesi@0 770 * @see overlay_regions()
danielebarchiesi@0 771 */
danielebarchiesi@0 772 function overlay_supplemental_regions() {
danielebarchiesi@0 773 return _overlay_region_list('overlay_supplemental_regions');
danielebarchiesi@0 774 }
danielebarchiesi@0 775
danielebarchiesi@0 776 /**
danielebarchiesi@0 777 * Returns a list of page regions related to the overlay.
danielebarchiesi@0 778 *
danielebarchiesi@0 779 * @param $type
danielebarchiesi@0 780 * The type of regions to return. This can either be 'overlay_regions' or
danielebarchiesi@0 781 * 'overlay_supplemental_regions'.
danielebarchiesi@0 782 *
danielebarchiesi@0 783 * @return
danielebarchiesi@0 784 * An array of region names of the given type, within the theme that is being
danielebarchiesi@0 785 * used to display the current page.
danielebarchiesi@0 786 *
danielebarchiesi@0 787 * @see overlay_regions()
danielebarchiesi@0 788 * @see overlay_supplemental_regions()
danielebarchiesi@0 789 */
danielebarchiesi@0 790 function _overlay_region_list($type) {
danielebarchiesi@0 791 // Obtain the current theme. We need to first make sure the theme system is
danielebarchiesi@0 792 // initialized, since this function can be called early in the page request.
danielebarchiesi@0 793 drupal_theme_initialize();
danielebarchiesi@0 794 $themes = list_themes();
danielebarchiesi@0 795 $theme = $themes[$GLOBALS['theme']];
danielebarchiesi@0 796 // Return the list of regions stored within the theme's info array, or an
danielebarchiesi@0 797 // empty array if no regions of the appropriate type are defined.
danielebarchiesi@0 798 return !empty($theme->info[$type]) ? $theme->info[$type] : array();
danielebarchiesi@0 799 }
danielebarchiesi@0 800
danielebarchiesi@0 801 /**
danielebarchiesi@0 802 * Returns a list of page regions that rendering should be limited to.
danielebarchiesi@0 803 *
danielebarchiesi@0 804 * @return
danielebarchiesi@0 805 * An array containing the names of the regions that will be rendered when
danielebarchiesi@0 806 * drupal_render_page() is called. If empty, then no limits will be imposed,
danielebarchiesi@0 807 * and all regions of the page will be rendered.
danielebarchiesi@0 808 *
danielebarchiesi@0 809 * @see overlay_page_alter()
danielebarchiesi@0 810 * @see overlay_block_list_alter()
danielebarchiesi@0 811 * @see overlay_set_regions_to_render()
danielebarchiesi@0 812 */
danielebarchiesi@0 813 function overlay_get_regions_to_render() {
danielebarchiesi@0 814 return overlay_set_regions_to_render();
danielebarchiesi@0 815 }
danielebarchiesi@0 816
danielebarchiesi@0 817 /**
danielebarchiesi@0 818 * Sets the regions of the page that rendering will be limited to.
danielebarchiesi@0 819 *
danielebarchiesi@0 820 * @param $regions
danielebarchiesi@0 821 * (Optional) An array containing the names of the regions that should be
danielebarchiesi@0 822 * rendered when drupal_render_page() is called. Pass in an empty array to
danielebarchiesi@0 823 * remove all limits and cause drupal_render_page() to render all page
danielebarchiesi@0 824 * regions (the default behavior). If this parameter is omitted, no change
danielebarchiesi@0 825 * will be made to the current list of regions to render.
danielebarchiesi@0 826 *
danielebarchiesi@0 827 * @return
danielebarchiesi@0 828 * The current list of regions to render, or an empty array if the regions
danielebarchiesi@0 829 * are not being limited.
danielebarchiesi@0 830 *
danielebarchiesi@0 831 * @see overlay_page_alter()
danielebarchiesi@0 832 * @see overlay_block_list_alter()
danielebarchiesi@0 833 * @see overlay_get_regions_to_render()
danielebarchiesi@0 834 */
danielebarchiesi@0 835 function overlay_set_regions_to_render($regions = NULL) {
danielebarchiesi@0 836 $regions_to_render = &drupal_static(__FUNCTION__, array());
danielebarchiesi@0 837 if (isset($regions)) {
danielebarchiesi@0 838 $regions_to_render = $regions;
danielebarchiesi@0 839 }
danielebarchiesi@0 840 return $regions_to_render;
danielebarchiesi@0 841 }
danielebarchiesi@0 842
danielebarchiesi@0 843 /**
danielebarchiesi@0 844 * Renders an individual page region.
danielebarchiesi@0 845 *
danielebarchiesi@0 846 * This function is primarily intended to be used for checking the content of
danielebarchiesi@0 847 * supplemental overlay regions (e.g., a region containing a toolbar). Passing
danielebarchiesi@0 848 * in a region that is intended to display the main page content is not
danielebarchiesi@0 849 * supported; the region will be rendered by this function, but the main page
danielebarchiesi@0 850 * content will not appear in it. In addition, although this function returns
danielebarchiesi@0 851 * the rendered HTML for the provided region, it does not place it on the final
danielebarchiesi@0 852 * page, nor add any of its associated JavaScript or CSS to the page.
danielebarchiesi@0 853 *
danielebarchiesi@0 854 * @param $region
danielebarchiesi@0 855 * The name of the page region that should be rendered.
danielebarchiesi@0 856 *
danielebarchiesi@0 857 * @return
danielebarchiesi@0 858 * The rendered HTML of the provided region.
danielebarchiesi@0 859 */
danielebarchiesi@0 860 function overlay_render_region($region) {
danielebarchiesi@0 861 // Indicate the region that we will be rendering, so that other regions will
danielebarchiesi@0 862 // be hidden by overlay_page_alter() and overlay_block_list_alter().
danielebarchiesi@0 863 overlay_set_regions_to_render(array($region));
danielebarchiesi@0 864 // Do what is necessary to force drupal_render_page() to only display HTML
danielebarchiesi@0 865 // from the requested region. Specifically, declare that the main page
danielebarchiesi@0 866 // content does not need to automatically be added to the page, and pass in
danielebarchiesi@0 867 // a page array that has all theme functions removed (so that overall HTML
danielebarchiesi@0 868 // for the page will not be added either).
danielebarchiesi@0 869 $system_main_content_added = &drupal_static('system_main_content_added');
danielebarchiesi@0 870 $system_main_content_added = TRUE;
danielebarchiesi@0 871 $page = array(
danielebarchiesi@0 872 '#type' => 'page',
danielebarchiesi@0 873 '#theme' => NULL,
danielebarchiesi@0 874 '#theme_wrappers' => array(),
danielebarchiesi@0 875 );
danielebarchiesi@0 876 // Render the region, but do not cache any JavaScript or CSS associated with
danielebarchiesi@0 877 // it. This region might not be included the next time drupal_render_page()
danielebarchiesi@0 878 // is called, and we do not want its JavaScript or CSS to erroneously appear
danielebarchiesi@0 879 // on the final rendered page.
danielebarchiesi@0 880 $original_js = drupal_add_js();
danielebarchiesi@0 881 $original_css = drupal_add_css();
danielebarchiesi@0 882 $original_libraries = drupal_static('drupal_add_library');
danielebarchiesi@0 883 $js = &drupal_static('drupal_add_js');
danielebarchiesi@0 884 $css = &drupal_static('drupal_add_css');
danielebarchiesi@0 885 $libraries = &drupal_static('drupal_add_library');
danielebarchiesi@0 886 $markup = drupal_render_page($page);
danielebarchiesi@0 887 $js = $original_js;
danielebarchiesi@0 888 $css = $original_css;
danielebarchiesi@0 889 $libraries = $original_libraries;
danielebarchiesi@0 890 // Indicate that the main page content has not, in fact, been displayed, so
danielebarchiesi@0 891 // that future calls to drupal_render_page() will be able to render it
danielebarchiesi@0 892 // correctly.
danielebarchiesi@0 893 $system_main_content_added = FALSE;
danielebarchiesi@0 894 // Restore the original behavior of rendering all regions for the next time
danielebarchiesi@0 895 // drupal_render_page() is called.
danielebarchiesi@0 896 overlay_set_regions_to_render(array());
danielebarchiesi@0 897 return $markup;
danielebarchiesi@0 898 }
danielebarchiesi@0 899
danielebarchiesi@0 900 /**
danielebarchiesi@0 901 * Returns any rendered content that was stored earlier in the page request.
danielebarchiesi@0 902 *
danielebarchiesi@0 903 * @return
danielebarchiesi@0 904 * An array of all rendered HTML that was stored earlier in the page request,
danielebarchiesi@0 905 * keyed by the identifier with which it was stored. If no content was
danielebarchiesi@0 906 * stored, an empty array is returned.
danielebarchiesi@0 907 *
danielebarchiesi@0 908 * @see overlay_store_rendered_content()
danielebarchiesi@0 909 */
danielebarchiesi@0 910 function overlay_get_rendered_content() {
danielebarchiesi@0 911 return overlay_store_rendered_content();
danielebarchiesi@0 912 }
danielebarchiesi@0 913
danielebarchiesi@0 914 /**
danielebarchiesi@0 915 * Stores strings representing rendered HTML content.
danielebarchiesi@0 916 *
danielebarchiesi@0 917 * This function is used to keep a static cache of rendered content that can be
danielebarchiesi@0 918 * referred to later in the page request.
danielebarchiesi@0 919 *
danielebarchiesi@0 920 * @param $id
danielebarchiesi@0 921 * (Optional) An identifier for the content which is being stored, which will
danielebarchiesi@0 922 * be used as an array key in the returned array. If omitted, no change will
danielebarchiesi@0 923 * be made to the current stored data.
danielebarchiesi@0 924 * @param $content
danielebarchiesi@0 925 * (Optional) A string representing the rendered data to store. This only has
danielebarchiesi@0 926 * an effect if $id is also provided.
danielebarchiesi@0 927 *
danielebarchiesi@0 928 * @return
danielebarchiesi@0 929 * An array representing all data that is currently being stored, or an empty
danielebarchiesi@0 930 * array if there is none.
danielebarchiesi@0 931 *
danielebarchiesi@0 932 * @see overlay_get_rendered_content()
danielebarchiesi@0 933 */
danielebarchiesi@0 934 function overlay_store_rendered_content($id = NULL, $content = NULL) {
danielebarchiesi@0 935 $rendered_content = &drupal_static(__FUNCTION__, array());
danielebarchiesi@0 936 if (isset($id)) {
danielebarchiesi@0 937 $rendered_content[$id] = $content;
danielebarchiesi@0 938 }
danielebarchiesi@0 939 return $rendered_content;
danielebarchiesi@0 940 }
danielebarchiesi@0 941
danielebarchiesi@0 942 /**
danielebarchiesi@0 943 * Requests that the parent window refreshes a particular page region.
danielebarchiesi@0 944 *
danielebarchiesi@0 945 * @param $region
danielebarchiesi@0 946 * The name of the page region to refresh. The parent window will trigger a
danielebarchiesi@0 947 * refresh of this region on the next page load.
danielebarchiesi@0 948 *
danielebarchiesi@0 949 * @see overlay_trigger_refresh()
danielebarchiesi@0 950 * @see Drupal.overlay.refreshRegions()
danielebarchiesi@0 951 */
danielebarchiesi@0 952 function overlay_request_refresh($region) {
danielebarchiesi@0 953 $class = drupal_region_class($region);
danielebarchiesi@0 954 $_SESSION['overlay_regions_to_refresh'][] = array($class => $region);
danielebarchiesi@0 955 }
danielebarchiesi@0 956
danielebarchiesi@0 957 /**
danielebarchiesi@0 958 * Requests that the entire parent window is reloaded when the overlay closes.
danielebarchiesi@0 959 *
danielebarchiesi@0 960 * @see overlay_trigger_refresh()
danielebarchiesi@0 961 */
danielebarchiesi@0 962 function overlay_request_page_refresh() {
danielebarchiesi@0 963 $_SESSION['overlay_refresh_parent'] = TRUE;
danielebarchiesi@0 964 }
danielebarchiesi@0 965
danielebarchiesi@0 966 /**
danielebarchiesi@0 967 * Checks if the parent window needs to be refreshed on this page load.
danielebarchiesi@0 968 *
danielebarchiesi@0 969 * If the previous page load requested that any page regions be refreshed, or
danielebarchiesi@0 970 * if it requested that the entire page be refreshed when the overlay closes,
danielebarchiesi@0 971 * pass that request via JavaScript to the child window, so it can in turn pass
danielebarchiesi@0 972 * the request to the parent window.
danielebarchiesi@0 973 *
danielebarchiesi@0 974 * @see overlay_request_refresh()
danielebarchiesi@0 975 * @see overlay_request_page_refresh()
danielebarchiesi@0 976 * @see Drupal.overlay.refreshRegions()
danielebarchiesi@0 977 */
danielebarchiesi@0 978 function overlay_trigger_refresh() {
danielebarchiesi@0 979 if (!empty($_SESSION['overlay_regions_to_refresh'])) {
danielebarchiesi@0 980 $settings = array(
danielebarchiesi@0 981 'overlayChild' => array(
danielebarchiesi@0 982 'refreshRegions' => $_SESSION['overlay_regions_to_refresh'],
danielebarchiesi@0 983 ),
danielebarchiesi@0 984 );
danielebarchiesi@0 985 drupal_add_js($settings, array('type' => 'setting'));
danielebarchiesi@0 986 unset($_SESSION['overlay_regions_to_refresh']);
danielebarchiesi@0 987 }
danielebarchiesi@0 988 if (!empty($_SESSION['overlay_refresh_parent'])) {
danielebarchiesi@0 989 drupal_add_js(array('overlayChild' => array('refreshPage' => TRUE)), array('type' => 'setting'));
danielebarchiesi@0 990 unset($_SESSION['overlay_refresh_parent']);
danielebarchiesi@0 991 }
danielebarchiesi@0 992 }
danielebarchiesi@0 993
danielebarchiesi@0 994 /**
danielebarchiesi@0 995 * Prints the markup obtained by rendering a single region of the page.
danielebarchiesi@0 996 *
danielebarchiesi@0 997 * This function is intended to be called via Ajax.
danielebarchiesi@0 998 *
danielebarchiesi@0 999 * @param $region
danielebarchiesi@0 1000 * The name of the page region to render.
danielebarchiesi@0 1001 *
danielebarchiesi@0 1002 * @see Drupal.overlay.refreshRegions()
danielebarchiesi@0 1003 */
danielebarchiesi@0 1004 function overlay_ajax_render_region($region) {
danielebarchiesi@0 1005 print overlay_render_region($region);
danielebarchiesi@0 1006 }