123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- <?php
- /**
- * Implements hook_menu().
- */
- function ajax_register_menu() {
- $items['ajax_register/%/%ctools_js'] = array(
- 'page callback' => 'ajax_register_page_callback',
- 'page arguments' => array(1, 2),
- 'access callback' => 'ajax_register_page_access',
- 'access arguments' => array(1, 2),
- 'delivery callback' => 'ajax_deliver',
- 'theme callback' => 'ajax_base_page_theme',
- 'type' => MENU_CALLBACK,
- 'file' => 'ajax_register.pages.inc',
- );
- $items['admin/config/user-interface/ajax_register'] = array(
- 'title' => 'Ajax Register',
- 'page callback' => 'drupal_get_form',
- 'page arguments' => array('ajax_register_admin_form'),
- 'access arguments' => array('administer site configuration'),
- 'file' => 'ajax_register.admin.inc',
- );
- return $items;
- }
- /**
- * Check access to ajax page callback.
- */
- function ajax_register_page_access($form, $type) {
- $allowed_forms = array('login', 'register', 'password');
- $allowed_types = array('ajax', 'nojs');
- if (in_array($form, $allowed_forms) && in_array($type, $allowed_types) && user_is_anonymous()) {
- return TRUE;
- }
- return FALSE;
- }
- /**
- * Implements hook_block_info().
- */
- function ajax_register_block_info() {
- // Block with three links (login, register, restore password).
- $blocks['ajax_register_block'] = array(
- 'info' => t('Ajax Register links'),
- 'cache' => DRUPAL_CACHE_GLOBAL,
- );
- return $blocks;
- }
- /**
- * Implements hook_block_configure().
- */
- function ajax_register_block_configure() {
- // User allowed to disable ajax links.
- $form['ajax_register_enabled_links'] = array(
- '#type' => 'checkboxes',
- '#title' => t('Enabled links'),
- '#options' => array(
- 'login' => t('Login'),
- 'register' => t('Create new account'),
- 'password' => t('Request new password'),
- ),
- '#default_value' => variable_get('ajax_register_enabled_links', array('login', 'register', 'password')),
- );
- $form['ajax_register_show_links_inline'] = array(
- '#type' => 'checkbox',
- '#title' => t('Display links inline'),
- '#default_value' => variable_get('ajax_register_show_links_inline', TRUE),
- );
- return $form;
- }
- /**
- * Implements hook_block_save().
- */
- function ajax_register_block_save($delta = '', $edit = array()) {
- // Remove empty elements from array.
- $links = $edit['ajax_register_enabled_links'];
- foreach ($links as $key => $link) {
- if (!$link) {
- unset($links[$key]);
- }
- }
- // Save variables to database.
- variable_set('ajax_register_enabled_links', $links);
- variable_set('ajax_register_show_links_inline', $edit['ajax_register_show_links_inline']);
- }
- /**
- * Implements hook_block_view().
- */
- function ajax_register_block_view() {
- // Show links only to anonymous users.
- if (user_is_anonymous()) {
- // Get enabled ajax links.
- $enabled_links = variable_get('ajax_register_enabled_links', array('login', 'register', 'password'));
- if (!$enabled_links) {
- // Hide block if user didn't choose at least one link.
- return FALSE;
- }
- // Include css and js for modal dialog.
- _ajax_register_include_modal();
- // Add a links to the block.
- $block['content'] = array(
- '#theme' => 'item_list',
- '#items' => _ajax_register_ajax_links($enabled_links),
- '#attributes' => array('class' => array('ajax-register-links'))
- );
- // Display links inline.
- if (variable_get('ajax_register_show_links_inline', TRUE)) {
- $block['content']['#attributes']['class'][] = 'inline';
- }
- return $block;
- }
- }
- /**
- * Implements hook_menu_site_status_alter().
- */
- function ajax_register_menu_site_status_alter(&$menu_site_status, $path) {
- // Disable offline mode for ajax response for User Login and User Pass forms'.
- if ($menu_site_status == MENU_SITE_OFFLINE) {
- if (user_is_anonymous()) {
- switch ($path) {
- case 'system/ajax':
- if (isset($_POST['form_id']) && in_array($_POST['form_id'], array('user_login', 'user_pass'))) {
- $menu_site_status = MENU_SITE_ONLINE;
- break;
- }
- }
- }
- }
- }
- /**
- * Implements hook_form_alter().
- */
- function ajax_register_form_alter(&$form, &$form_state, $form_id) {
- // Create array with enabled ajax links.
- $enabled_links = array('login', 'register', 'password');
- switch ($form_id) {
- case 'user_login_block':
- // Add links processed with CTools modal.
- $form['links'] = array(
- '#theme' => 'item_list',
- '#items' => _ajax_register_ajax_links($enabled_links, $form_id),
- '#attributes' => array('class' => array('ajax-register-links')),
- );
- // Add html wrapper to form and #ajax to form submit.
- _ajax_register_add_ajax($form, $form_id);
- // Do not add to the user login block anything more.
- break;
- case 'user_login':
- case 'user_pass':
- case 'user_register_form':
- // Do not process form with AJAX that should be processed with CTools modal.
- $modal_links_enabled = variable_get('ajax_register_form_enable_modal_links', TRUE);
- if (!empty($form_state['ajax']) && $modal_links_enabled) {
- // Add links processed with CTools modal.
- $form['links'] = array(
- '#theme' => 'item_list',
- '#items' => _ajax_register_ajax_links($enabled_links, $form_id),
- '#attributes' => array('class' => array('ajax-register-links', 'inline')),
- '#weight' => -200,
- '#prefix' => '<div class="ajax-register-links-wrapper">',
- '#suffix' => '</div>',
- );
- // Unset captcha from modal form.
- $hide_captcha = variable_get('ajax_register_hide_captcha', FALSE);
- if ($hide_captcha) {
- unset($form['captcha']);
- }
- }
- else {
- // Add html wrapper to form and #ajax to form submit.
- _ajax_register_add_ajax($form, $form_id);
- }
- }
- }
- /**
- * Add form wrapper and #ajax attribute to forms.
- */
- function _ajax_register_add_ajax(&$form, $type) {
- // Add ajax wrapper to form.
- $html_id = 'ajax-register-' . str_replace('_', '-', $type) . '-wrapper';
- // Save previos form prefix if it is exists.
- if (!empty($form['#prefix'])) {
- $form['#prefix'] .= '<div id="' . $html_id . '">';
- }
- else {
- $form['#prefix'] = '<div id="' . $html_id . '">';
- }
- // Save previos form suffix if it is exists.
- if (!empty($form['#suffix'])) {
- $form['#suffix'] = '</div>' . $form['#suffix'];
- }
- else {
- $form['#suffix'] = '</div>';
- }
- // User login block and user login form have same ajax callback;
- if ($type == 'user_login_block') {
- $type = 'user_login';
- }
- // Add ajax functionality to form submit button.
- $form['actions']['submit']['#ajax'] = array(
- 'callback' => 'ajax_register_' . $type . '_ajax_callback',
- 'wrapper' => $html_id,
- 'event' => 'click',
- );
- // Add ctools modal style.
- $form['actions']['submit']['#attributes']['class'][] = 'ctools-modal-ctools-ajax-register-style';
- }
- /**
- * Ajax callback for USER LOGIN form.
- */
- function ajax_register_user_login_ajax_callback($form, $form_state) {
- if (!form_get_errors()) {
- $commands = _ajax_register_execute_form('login', $form_state);
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- // Reload form if it didn't pass validation.
- return $form;
- }
- /**
- * Ajax callback for USER PASS form.
- */
- function ajax_register_user_pass_ajax_callback($form, $form_state) {
- if (!form_get_errors()) {
- $commands = _ajax_register_execute_form('password', $form_state);
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- // Reload form if it didn't pass validation.
- return $form;
- }
- /**
- * Ajax callback for USER REGISTER form.
- */
- function ajax_register_user_register_form_ajax_callback($form, $form_state) {
- if (!form_get_errors()) {
- $commands = _ajax_register_execute_form('register', $form_state);
- return array('#type' => 'ajax', '#commands' => $commands);
- }
- // Reload form if it didn't pass validation.
- return $form;
- }
- /**
- * Executes form.
- */
- function _ajax_register_execute_form($form_type, $form_state) {
- // Include additinal ajax commands.
- ctools_include('ajax');
- ctools_include('modal');
- $redirect_behavior = variable_get('ajax_register_' . $form_type . '_redirect_behavior', 'default');
- $redirect_url = variable_get('ajax_register_' . $form_type . '_redirect_url', '');
- // Use the form state's redirect url for default behavior.
- if ($redirect_behavior == 'default' && !empty($form_state['redirect'])) {
- if (is_array($form_state['redirect'])) {
- $redirect_url = call_user_func_array('url', $form_state['redirect']);
- // Remove leading slash from the url.
- $redirect_url = drupal_substr($redirect_url, 1);
- }
- else {
- $redirect_url = $form_state['redirect'];
- }
- }
- elseif (($redirect_behavior == 'custom' && !empty($redirect_url)) || $redirect_behavior == 'none') {
- // Do nothing other than preventing the fallback.
- }
- // Refresh the page as a fallback redirect behavior.
- // This can happen if the form state does not have a redirect.
- else {
- $redirect_behavior = 'refresh';
- }
- // Provide additional logic and titles for different form types.
- switch ($form_type) {
- case 'password':
- $title = t('Successful password request');
- break;
- case 'register':
- $title = t('Successful registration');
- break;
- case 'login':
- $title = t('Successful login');
- $message = 'Login was successful. ';
- if ($redirect_behavior == 'refresh') {
- $message .= 'Page will now be reloaded.';
- }
- elseif ($redirect_behavior == 'default' || $redirect_behavior == 'custom') {
- $message .= 'Page will now be redirected.';
- }
- drupal_set_message(check_plain(t($message)));
- $commands[] = ctools_modal_command_display($title, theme('status_messages'));
- break;
- }
- // Send ajax command to modal based on redirect behavior.
- switch ($redirect_behavior) {
- case 'none':
- $commands[] = ctools_modal_command_display($title, theme('status_messages'));
- break;
- case 'refresh':
- $commands[] = ctools_ajax_command_reload();
- break;
- default:
- // Redirect to URL supplied from default or custom redirect behavior.
- $commands[] = ctools_ajax_command_redirect($redirect_url);
- break;
- }
- return $commands;
- }
- /**
- * Return ajax links for user login, register or password request.
- *
- * @param $links_enabled
- * Array with possible links could be enabled ('login', 'register', 'password).
- * @param null $form_id
- * Form where this links are builded.
- * @return array
- * List of ajax links.
- */
- function _ajax_register_ajax_links($links_enabled, $form_id = NULL) {
- // Include css and js for modal dialog.
- _ajax_register_include_modal();
- $links = array();
- // Build classes for ajax modal link.
- $classes = array();
- $classes[] = 'ctools-use-modal';
- $classes[] = 'ctools-modal-ctools-ajax-register-style';
- // Provide default options for ajax modal link.
- $options = array(
- 'attributes' => array(
- 'class' => $classes,
- 'rel' => 'nofollow',
- )
- );
- // Add login button.
- if (in_array('login', $links_enabled) && (stripos($form_id, 'user_login') === FALSE)) {
- $options['attributes']['title'] = t('Login');
- $links[] = l(t('Login'), 'ajax_register/login/nojs', $options);
- }
- // Add register button.
- if (in_array('register', $links_enabled) && $form_id != 'user_register_form') {
- $options['attributes']['title'] = t('Create new account');
- $links[] = l(t('Create new account'), 'ajax_register/register/nojs', $options);
- }
- // Add request password button.
- if (in_array('password', $links_enabled) && $form_id != 'user_pass') {
- $options['attributes']['title'] = t('Request new password');
- $links[] = l(t('Request new password'), 'ajax_register/password/nojs', $options);
- }
- return $links;
- }
- /**
- * Add css and javascript for modal dialog.
- */
- function _ajax_register_include_modal() {
- static $added = FALSE;
- if ($added == FALSE) {
- // Do not add css and scripts again.
- $added = TRUE;
- // Include the CTools tools that we need.
- ctools_include('modal');
- ctools_include('ajax');
- ctools_modal_add_js();
- // Create our own javascript that will be used to theme a modal.
- $ajax_register_style = array(
- 'ctools-ajax-register-style' => array(
- 'modalSize' => array(
- 'type' => 'fixed',
- 'width' => (int) trim(variable_get('ajax_register_modal_width', 550)),
- 'height' => 140,
- 'contentRight' => 30,
- 'contentBottom' => 0,
- ),
- 'modalOptions' => array(
- 'opacity' => (float) variable_get('ajax_register_modal_background_opacity', '0.8'),
- 'background-color' => '#' . variable_get('ajax_register_modal_background_color', '000000'),
- ),
- 'closeText' => '',
- 'throbber' => theme('image', array('path' => ctools_image_path('ajax-loader.gif', 'ajax_register'))),
- 'animation' => 'fadeIn',
- 'animationSpeed' => 'fast',
- ),
- );
- drupal_add_js($ajax_register_style, 'setting');
- // Add module css and js.
- ctools_add_css('ajax-register', 'ajax_register');
- ctools_add_js('ajax-register', 'ajax_register');
- }
- }
|