- Patch #658720 by casey, David_Rothstein: clean up overlay_close_dialog() and related code.

merge-requests/26/head
Dries Buytaert 2010-04-24 07:14:29 +00:00
parent 9f8de06ce5
commit cf76edd3df
3 changed files with 50 additions and 96 deletions

View File

@ -37,7 +37,7 @@ Drupal.behaviors.overlayChild = {
// We need to store the parent variable locally because it will // We need to store the parent variable locally because it will
// disappear as soon as we close the iframe. // disappear as soon as we close the iframe.
var p = parent; var p = parent;
p.Drupal.overlay.close(settings.args, settings.statusMessages); p.Drupal.overlay.close();
if (typeof settings.redirect == 'string') { if (typeof settings.redirect == 'string') {
p.Drupal.overlay.redirect(settings.redirect); p.Drupal.overlay.redirect(settings.redirect);
} }

View File

@ -39,9 +39,6 @@ Drupal.overlay = Drupal.overlay || {
isClosing: false, isClosing: false,
isLoading: false, isLoading: false,
onOverlayCloseArgs: null,
onOverlayCloseStatusMessages: null,
resizeTimeoutID: null, resizeTimeoutID: null,
lastHeight: 0, lastHeight: 0,
@ -220,10 +217,8 @@ Drupal.overlay.create = function () {
self.lastHeight = 0; self.lastHeight = 0;
if ($.isFunction(self.options.onOverlayClose)) { if ($.isFunction(self.options.onOverlayClose)) {
self.options.onOverlayClose(self.onOverlayCloseArgs, self.onOverlayCloseStatusMessages); self.options.onOverlayClose();
} }
self.onOverlayCloseArgs = null;
self.onOverlayCloseStatusMessages = null;
}; };
// Default jQuery UI Dialog options. // Default jQuery UI Dialog options.
@ -358,13 +353,8 @@ Drupal.overlay.load = function (url) {
/** /**
* Close the overlay and remove markup related to it from the document. * Close the overlay and remove markup related to it from the document.
*/ */
Drupal.overlay.close = function (args, statusMessages) { Drupal.overlay.close = function () {
var self = this; return this.$container.dialog('close');
self.onOverlayCloseArgs = args;
self.onOverlayCloseStatusMessages = statusMessages;
return self.$container.dialog('close');
}; };
/** /**

View File

@ -59,17 +59,18 @@ function overlay_init() {
// Only act if the user has access to administration pages. Other modules can // Only act if the user has access to administration pages. Other modules can
// also enable the overlay directly for other uses of the JavaScript. // also enable the overlay directly for other uses of the JavaScript.
if (user_access('access overlay')) { if (user_access('access overlay')) {
$current_path = current_path();
// After overlay is enabled on the modules page, redirect to // After overlay is enabled on the modules page, redirect to
// <front>#overlay=admin/modules to actually enable the overlay. // <front>#overlay=admin/modules to actually enable the overlay.
if (isset($_SESSION['overlay_enable_redirect']) && $_SESSION['overlay_enable_redirect']) { if (isset($_SESSION['overlay_enable_redirect']) && $_SESSION['overlay_enable_redirect']) {
unset($_SESSION['overlay_enable_redirect']); unset($_SESSION['overlay_enable_redirect']);
drupal_goto('<front>', array('fragment' => 'overlay=' . current_path())); drupal_goto('<front>', array('fragment' => 'overlay=' . $current_path));
} }
if (isset($_GET['render']) && $_GET['render'] == 'overlay') { if (isset($_GET['render']) && $_GET['render'] == 'overlay') {
// If this page shouldn't be rendered here, redirect to the parent. // If this page shouldn't be rendered here, redirect to the parent.
if (!path_is_admin($_GET['q'])) { if (!path_is_admin($current_path)) {
overlay_close_dialog(); overlay_close_dialog($current_path);
} }
// If system module did not switch the theme yet (i.e. this is not an // If system module did not switch the theme yet (i.e. this is not an
// admin page, per se), we should switch the theme here. // admin page, per se), we should switch the theme here.
@ -85,7 +86,7 @@ function overlay_init() {
unset($_GET['render']); unset($_GET['render']);
} }
// Do not enable the overlay if we already are on an admin page. // Do not enable the overlay if we already are on an admin page.
else if (!path_is_admin(current_path())) { else if (!path_is_admin($current_path)) {
// Otherwise add overlay parent code and our behavior. // Otherwise add overlay parent code and our behavior.
overlay_set_mode('parent'); overlay_set_mode('parent');
} }
@ -337,31 +338,15 @@ function overlay_form_after_build($form, &$form_state) {
* Generic form submit handler. * Generic form submit handler.
* *
* When we are requested to close an overlay, we don't want Form API to * When we are requested to close an overlay, we don't want Form API to
* perform any redirection once the submitted form has been processed. * perform any redirection once the submitted form has been processed. Instead,
* * we set $form_state['redirect'] to FALSE so that Form API will simply
* When $form_state['redirect'] is set to FALSE, then Form API will simply * re-render the current page, and pass the redirect information on to the
* re-render the current page. This is all we need in order to output the * overlay JavaScript so that the redirection can be performed there.
* JavaScript that will tell the parent window to close the child dialog, so
* we store a variable which will cause the page to be rendered by a delivery
* callback function that does not actually print visible HTML, thereby
* allowing the dialog to be closed faster and with less interruption.
* *
* @see overlay_get_mode() * @see overlay_get_mode()
* @see overlay_page_delivery_callback_alter()
* @ingroup forms * @ingroup forms
*/ */
function overlay_form_submit($form, &$form_state) { function overlay_form_submit($form, &$form_state) {
$settings = &drupal_static(__FUNCTION__);
// Check if we have a request to close the overlay.
$args = overlay_request_dialog_close();
// Close the overlay if the overlay module has been disabled
if (!module_exists('overlay')) {
$args = overlay_request_dialog_close(TRUE);
}
// If there is a form redirect to a non-admin page, close the overlay.
if (isset($form_state['redirect'])) { if (isset($form_state['redirect'])) {
// A destination set in the URL trumps $form_state['redirect']. // A destination set in the URL trumps $form_state['redirect'].
if (isset($_GET['destination'])) { if (isset($_GET['destination'])) {
@ -376,40 +361,30 @@ function overlay_form_submit($form, &$form_state) {
$url = $form_state['redirect']; $url = $form_state['redirect'];
$url_settings = array(); $url_settings = array();
} }
if (!path_is_admin($url)) { // Close the overlay if we are redirecting to a non-admin page or if the
$args = overlay_request_dialog_close(TRUE); // overlay module has just been disabled.
} if (!path_is_admin($url) || !module_exists('overlay')) {
} overlay_close_dialog($url, $url_settings);
// Tell FAPI to stay on the same page after all submit callbacks have
// If the overlay is to be closed, pass that information through JavaScript. // been processed.
if ($args !== FALSE) {
if (!isset($settings)) {
$settings = array(
'overlayChild' => array(
'closeOverlay' => TRUE,
'statusMessages' => theme('status_messages'),
'args' => $args,
),
);
// Tell the child window to perform the redirection when requested to.
if (!empty($form_state['redirect'])) {
$settings['overlayChild']['redirect'] = url($url, $settings);
}
drupal_add_js($settings, array('type' => 'setting'));
}
// Request that an empty page be displayed.
overlay_display_empty_page(TRUE);
// Tell FAPI to stay on the same page after all submit callbacks have been
// processed.
$form_state['redirect'] = FALSE; $form_state['redirect'] = FALSE;
} }
}
} }
/** /**
* Callback to request that the overlay display an empty page. * Callback to request that the overlay display an empty page.
* *
* This is used to prevent a submitted form which closes the overlay from being * This is used to prevent a page request which closes the overlay (for
* fully re-rendered before the overlay is closed. * example, a form submission) from being fully re-rendered before the overlay
* is closed. Instead, we store a variable which will cause the page to be
* rendered by a delivery callback function that does not actually print
* visible HTML (but rather only the bare minimum scripts and styles necessary
* to trigger the overlay to close), thereby allowing the dialog to be closed
* faster and with less interruption, and also allowing the display of messages
* to be deferred to the parent window (rather than displaying them in the
* child window, which will close before the user has had a chance to read
* them).
* *
* @param $value * @param $value
* By default, an empty page will not be displayed. Set to TRUE to request * By default, an empty page will not be displayed. Set to TRUE to request
@ -418,6 +393,8 @@ function overlay_form_submit($form, &$form_state) {
* *
* @return * @return
* TRUE if the current behavior is to display an empty page, or FALSE if not. * TRUE if the current behavior is to display an empty page, or FALSE if not.
*
* @see overlay_page_delivery_callback_alter()
*/ */
function overlay_display_empty_page($value = NULL) { function overlay_display_empty_page($value = NULL) {
$display_empty_page = &drupal_static(__FUNCTION__, FALSE); $display_empty_page = &drupal_static(__FUNCTION__, FALSE);
@ -551,46 +528,33 @@ function overlay_overlay_child_initialize() {
} }
/** /**
* Callback to request that the overlay close on the next page load. * Callback to request that the overlay close as soon as the page is displayed.
*
* @param $value
* By default, the dialog will not close. Set to TRUE or a value evaluating to
* TRUE to request the dialog to close. Use FALSE to disable closing the
* dialog (if it was previously enabled). The value passed will be forwarded
* to the onOverlayClose callback of the overlay.
*
* @return
* The current overlay close dialog mode, a value evaluating to TRUE if the
* overlay should close or FALSE if it should not (default).
*/
function overlay_request_dialog_close($value = NULL) {
$close = &drupal_static(__FUNCTION__, FALSE);
if (isset($value)) {
$close = $value;
}
return $close;
}
/**
* Close the overlay and redirect the parent window to a new path.
* *
* @param $redirect * @param $redirect
* The path that should open in the parent window after the overlay closes. * (optional) The path that should open in the parent window after the
* overlay closes. If not set, no redirect will be performed on the parent
* window.
* @param $redirect_options
* (optional) An associative array of options to use when generating the
* redirect URL.
*/ */
function overlay_close_dialog($redirect = NULL) { function overlay_close_dialog($redirect = NULL, $redirect_options = array()) {
if (!isset($redirect)) {
$redirect = current_path();
}
$settings = array( $settings = array(
'overlayChild' => array( 'overlayChild' => array(
'closeOverlay' => TRUE, 'closeOverlay' => TRUE,
'statusMessages' => theme('status_messages'),
'args' => $args,
'redirect' => url($redirect),
), ),
); );
// Tell the child window to perform the redirection when requested to.
if (isset($redirect)) {
$settings['overlayChild']['redirect'] = url($redirect, $redirect_options);
}
drupal_add_js($settings, array('type' => 'setting')); drupal_add_js($settings, array('type' => 'setting'));
return $settings;
// Since we are closing the overlay as soon as the page is displayed, we do
// not want to show any of the page's actual content.
overlay_display_empty_page(TRUE);
} }
/** /**