MENU_CALLBACK,
'page callback' => '_popups_get_raw_content',
'access callback' => TRUE,
);
$items['popups/submit'] = array(
'type' => MENU_CALLBACK,
'page callback' => '_popups_submit', // /dev/null
'access callback' => TRUE,
);
$items['popups/test'] = array(
'title' => 'Popup Test',
'page callback' => 'popups_test_popups',
'type' => MENU_CALLBACK,
'access callback' => TRUE,
);
$items['popups/test/response'] = array(
'page callback' => 'popups_test_response',
'type' => MENU_CALLBACK,
'access callback' => TRUE,
);
$items['admin/settings/popups'] = array(
'page callback' => 'drupal_get_form',
'page arguments' => array('popups_admin_settings'),
'title' => 'Popups Settings',
);
return $items;
}
function popups_init(){
$popups = popups_get_popups();
if (isset($popups[$_GET['q']])) {
popups_add_popups( $popups[$_GET['q']] );
}
}
/**
* Build the list of popup rules from all modules that implement hook_popups.
*
* @todo - Add some caching so we don't rebuild everytime.
*/
function popups_get_popups() {
static $popups = NULL;
if (!isset($popups)) {
$popups = module_invoke_all('popups');
}
return $popups;
}
/**
* hook_popups
*
* @return - Array of link selectors to apply popup behavior to.
* - Keyed by path or form_id.
*/
function popups_popups() {
return array (
'admin/build/block' => array (
// Add Block, configure, delete.
'div#tabs-wrapper a:eq(1), table#blocks td:nth-child(4) a, table#blocks td:nth-child(5) a,'
),
'admin/build/path' => array (
// Add alias (Todo: Does not work on error message), edit, delete
'div#tabs-wrapper a:eq(1), table td:nth-child(3) a, table td:nth-child(4) a'
),
'admin/content/taxonomy' => array (
// Add vocab, edit vocab, list term (TODO: no d-n-d, fail on submit), add terms
'div#tabs-wrapper a:eq(1), table td:nth-child(4) a, table td:nth-child(5) a, table td:nth-child(6) a'
),
'admin/content/types' => array (
// Add content type (TODO: collapsibles not working), edit, delete (flicker!)
'div#tabs-wrapper a:eq(1), table td:nth-child(4) a, table td:nth-child(5) a'
),
'admin/content/node' => array (
// edit (TODO: collapsible fieldset behavior)
'table td:nth-child(6) a',
'div.left-corner > div:eq(2)'
),
'admin/content/comment' => array (
// view (TODO: popup too small), edit (TODO: what to do about preview button?)
'table td:nth-child(2) a, table td:nth-child(6) a',
'div.left-corner > div:eq(2)' // Might only work in garland.
),
'admin/user/rules' => array (
// Add rule, Check rule, edit, delete
'div#tabs-wrapper a:eq(1), div#tabs-wrapper a:eq(2), table td:nth-child(4) a, table td:nth-child(5) a'
),
'admin/user/user' => array (
//Add user (TODO: better on error handling), view
'div#tabs-wrapper a:eq(1), table td:nth-child(2) a'
),
'menu_overview_form' => array (
// Add Item, Edit menu (TODO: Tricky! does not update Menu name on page), edit, delete
'div#tabs-wrapper a:eq(1), div#tabs-wrapper a:eq(2), table#menu-overview td:nth-child(5) a, table#menu-overview td:nth-child(6) a',
),
);
}
/**
* hook_form_alter
*
* @param form_array $form
* @param array $form_state
* @param str $form_id
*/
function popups_form_alter(&$form, $form_state, $form_id) {
// Add popup behavior to the form if requested.
$popups = popups_get_popups();
if (isset($popups[$form_id])) {
popups_add_popups( $popups[$form_id] );
}
// Redirect the form response to be unthemed.
// The $original value is set in the ajaxForm call.
// SESSION needs to be used, because the $_GET array gets cleared on form submition.
if (isset($_GET['original'])) {
$_SESSION['original'] = $_GET['original'];
// watchdog( "Debug", "popups_form_alter: original = ".$_SESSION['original']);
array_push( $form['#submit'], '_popups_redirect_submit_to_raw' );
}
}
/**
* Remove the theme from the form response.
*
*/
function _popups_redirect_submit_to_raw($form, &$form_state) {
// watchdog( "Debug", "_popups_redirect_submit_to_raw: ". print_r( $form['#submit'], true ));
// drupal_set_message( "_popups_redirect_submit_to_raw: ". $form_state['redirect'] );
$form_state['redirect'] = 'popups/raw';
unset($_REQUEST['destination']); // Prevent the destination param from overpowering redirect.
}
/**
* hook_theme
*
*/
function popups_theme($existing, $type) {
return array(
// 'page' => array(
// 'arguments' => array('content' => NULL, 'show_blocks' => TRUE, 'show_messages' => TRUE),
// 'function' => 'theme_popups_page',
// 'preprocess functions' => array(), // don't add anything new
// ),
'popups_page' => array(
'arguments' => array('content' => NULL),
'function' => 'theme_popups_page',
),
);
}
function theme_popups_page($content) {
// watchdog( "debug", "theme_popups_page: $content" );
// watchdog("popups", "Running: theme_popups_page");
$output = '
';
$output .= '
'. drupal_get_title() .'
';
$output .= '
'. theme('status_messages') .'
';
$output .= '
'. $content .'
';
$output .= '
';
return $output;
}
// **************************************************************************
// UTILITY FUNCTIONS ********************************************************
// **************************************************************************
function _popups_submit() {
// watchdog( "Debug", "_popups_submit" );
// drupal_set_message( "_popups_submit" );
print theme( 'popups_page', 'Congradulations' );
}
/*
* Return the content of a path as html, without the page's theming wrapper
* Used by dialogs.js for a popups with the content of a link
*/
function _popups_get_raw_content() {
// watchdog( "debug", "_popups_get_raw_content1");
global $base_url;
if (isset($_GET['path'])) {
$path = $_GET['path'];
}
elseif (isset($_SESSION['original'])) {
$path = $_SESSION['original'];
unset($_SESSION['original']);
}
else {
print t("No path provided");
}
// drupal_set_message( "_popups_get_raw_content: path: " . $path);
// watchdog( "debug", "_popups_get_raw_content: path: " . $path);
// drupal_set_message( "_popups_get_raw_content: get'path'" . $_GET['path']);
// drupal_set_message( "_popups_get_raw_content: get'original'" . $_GET['original']);
// drupal_set_message( "_popups_get_raw_content: session'original'" . $_SESSION['original']);
$path = substr( $path, strlen($base_url) + 1 );
// On a form submission, menu_execute_active_handler does not return control to this function.
// Instead it redirects to the $form_state['redirect'] path.
$content = menu_execute_active_handler( $path ); // does this tests for access rights?
if($content == MENU_ACCESS_DENIED) {
drupal_access_denied();
}
else {
if( $content == MENU_NOT_FOUND ) {
$content = t("Path not found: "). $path;
}
print theme('popups_page', $content );
}
}
/**
* Attach the popup behavior to the page.
*
* @param array $rule: $rule[0] = popupSelector(required), $rule[1] = contentSelector (optional)
*/
function popups_add_popups($rule=array()) {
static $added = FALSE;
if (!$added) {
drupal_add_css(drupal_get_path('module', 'popups') .'/popups.css');
drupal_add_js(drupal_get_path('module', 'popups') .'/popups.js');
drupal_add_js('misc/jquery.form.js');
if (isset($rule[0])) {
$settings = array( 'popups' => array(
'popupSelector' => $rule[0],
'contentSelector' => isset($rule[1]) ? $rule[1] : variable_get('popups_content_selector', 'div.left-corner > div:eq(3)'),
));
drupal_add_js( $settings, 'setting' );
}
$added = TRUE;
}
}
// **************************************************************************
// ADMIN SETTINGS *********************************************************
// **************************************************************************
function popups_admin_settings() {
drupal_set_title("Popups Settings");
$form = array();
$form['popups_test'] = array(
'#type' => 'textfield',
'#title' => t('Popups Test Value'),
'#default_value' => variable_get('popups_test', ''),
'#description' => t('This value is only used for testing'),
);
$form['popups_title_selector'] = array(
'#type' => 'textfield',
'#title' => t('Title Selector'),
'#default_value' => variable_get('popups_title_selector', 'div.left-corner h2'),
'#description' => t('jQuery selector to define the title on a page. (TODO: per theme).'),
);
$form['popups_content_selector'] = array(
'#type' => 'textfield',
'#title' => t('Content Selector'),
'#default_value' => variable_get('popups_content_selector', 'div.left-corner > div:eq(3)'),
'#description' => t('jQuery selector to define the content area on a page. (TODO: per theme).'),
);
return system_settings_form($form);
}
// **************************************************************************
// TESTING ****************************************************************
// **************************************************************************
function popups_test_popups() {
popups_add_popups();
$output = '';
$output .= l("Pop Me Up", 'popups/test/response', array( 'attributes'=>array('popups'=>TRUE) ) ) ."
";
$output .= l("Swap Me Out",
// 'popups/test/response',
'node/2',
array( 'attributes'=>array(
'swap' => 'div.left-corner h2, div.left-corner div:eq(1)',
)
)) . "
";
$output .= l("AHAH Reload", '/', array('attributes'=>array('onclick'=>"Drupal.popups.reload(); return false;") ) ) .'
';
$output .= l("Settings: ". variable_get('popups_test', ''), 'admin/settings/popups', array( 'attributes'=>array('popups'=>TRUE) ) );
return $output;
}
function popups_test_response() {
drupal_set_title("A Popup Test");
return "Hello World
";
}
// Get the page content without the page theme applied, or the page preprocessing done.
// Should speed up the ajaxForm call conciderably.
// Feels like a big old hack, but it works (as long as the module has -1 weight)
// Potential D7 feature.
// To be called from hook_init
// Not currently used, replaced by (somewhat) simpiler hook_form_alter trick.
/*
original $theme_registry['page'], with garland theme
Array
(
[template] => page
[path] => themes/garland
[type] => theme_engine
[theme path] => themes/garland
[arguments] => Array
(
[content] =>
[show_blocks] => 1
[show_messages] => 1
)
[theme paths] => Array
(
[0] => modules/system
[1] => sites/all/modules/popups
[2] => themes/garland
)
[preprocess functions] => Array
(
[0] => template_preprocess
[1] => template_preprocess_page
[2] => phptemplate_preprocess_page
)
)
*/
function popups_evil_untheme() {
if (isset($_GET['unthemed']) || isset($_SESSION['unthemed']) ) {
unset($_SESSION['unthemed']); // Toggle page theming back on after this render.
// drupal_set_message ("Untheming");
init_theme(); // build the theme registry, then mess with it.
$theme_registry = theme_get_registry();
$theme_registry['page']['type'] = 'module';
$theme_registry['page']['function'] = 'theme_popups_page';
$theme_registry['page']['theme path'] = $theme_registry['page']['theme paths'][1];
unset( $theme_registry['page']['template'] ); // switching to function
unset( $theme_registry['page']['path'] ); // remove themes/garland
unset( $theme_registry['page']['theme paths'][2] ); // remove themes/garland
unset( $theme_registry['page']['preprocess functions'][2] ); // remove phptemplate_preprocess_page
unset( $theme_registry['page']['preprocess functions'][1] ); // remove template_preprocess_page
// print_r($theme_registry['page']);
// print( "Messing with set_registry in popup.
");
_theme_set_registry($theme_registry);
}
}