drupal 7 ctool - не вызывается обработчик пользовательской отправки модальной формы

У меня есть требование, где мне нужно показать веб-форму в моде ctool. Когда пользователь отправляет веб-форму, он должен показать подтверждающее сообщение в том же модале ctool. Эта функциональность используется в моем проекте в нескольких местах, меняется только веб-форма для показа в ctool. Я прогуглил это и нашел это http://drupal.org/node/1196150. Код, который я нашел здесь, помог мне теперь, я могу отображать веб-форму в моде ctool и форма работает очень хорошо, но подтверждающее сообщение не отображается в модале ctool. После отправки он показывает ту же форму в модальном, а не подтверждающем сообщении. Этот код присоединяет пользовательский обработчик отправки с формой в hook_form_alter, и в этом обработчике отправки он устанавливает переменную sessoin. По этой переменной сеанса он принимает решение, показывать ли форму или подтверждающее сообщение.

вот код

function webform_modal_menu() { 
  $items['service-page'] = array(
    'title' => 'Service page',
    'access callback' => TRUE,
    'page callback' => 'webform_modal_page',
    );
  $items['modal/%ctools_js/service-webform'] = array(
    'title' => t("service webform"),
    'page callback' => 'webform_modal_content',
    'file' => 'webform_modal.inc',
    'page arguments' => array(1),
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

  return $items;
}

function webform_modal_page() {
  ctools_include('ajax'); // Module  include the dependence it needs for ajax.
  ctools_include('modal');
  ctools_modal_add_js();

  $output = ctools_modal_text_button(t('Click Here'), 'modal/nojs/service-webform', t('Pop me up'));
  $output .= '<div id="modal-message">&nbsp</div>';
  ctools_include('plugins');
  return $output;
}

function webform_modal_content($js = NULL) {
  define('WEBFORM_NID', 14);
  $webform_nid = WEBFORM_NID; // Your webform $nid
  return ctools_ajax_modal_webform($js, $webform_nid);
}

function webform_modal_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'webform_client_form_14') {
    $form['#submit'][2] = '_custom_webform_submit';
  }

  function _custom_webform_submit($form, &$form_state) {
    $webform_nid = $form['#node']->nid;
    lists_session('webform_client_form_'.$webform_nid, $value =  'submitted');
  }

  function ctools_ajax_modal_webform($js = NULL, $webform_nid = NULL) {
  $node = node_load($webform_nid); // Load webform node
  $submission =  (object) array(); // empty object required by webform

  // React without the modal
  if (!$js) {
    // Webform requires more parameters than standard forms
    return drupal_get_form('webform_client_form_'.$webform_nid, $node, $submission);
  }

  // React with the modal
  // Add modal components
  ctools_include('modal');
  ctools_include('ajax');
  $form_state = array(
    'title' => $node->title,
    'ajax' => TRUE,
    );

  // Emulate ctools_modal_form_wrapper() form modal.inc because webform can not be triggered trough drupal_build_form
  // If it can, I'd be glad to understand how
  $form_state += array(
    're_render' => TRUE,
    'no_redirect' => !empty($form_state['ajax']),
    );
  //drupal_get_form('webform_client_form_'.$webform_nid, $node, $submission);
  $args = array($node, $submission);
  $form_state['build_info']['args'] = $args;
  $output = ctools_modal_form_wrapper('webform_client_form_'.$webform_nid, $form_state);

  if ( isset($_SESSION['lists']['webform_client_form_'.$webform_nid]) && $_SESSION['lists']['webform_client_form_'.$webform_nid] == 'submitted') {
    unset($_SESSION['lists']['webform_client_form_'.$webform_nid]);
    $confirm_message = array("#markup" => '<div> Your request has been submitted</div>');
    $confirmation['#markup'] = 
    '<div class="popups-confirmation-wrapper">'.
    drupal_render($confirm_message).
    '</div>';    
    $output = array(); // Recreate output
    // Oerwrite the form output if it was successful.
    $output[] = ctools_modal_command_display('Confirmation', $confirmation);

  }

  // Render output in modal window
  print ajax_render($output);
  exit;
}

function lists_session($key, $value = NULL) {
  static $storage;
  if ($value) {
    $storage[$key] = $value ;
    $_SESSION['lists'][$key] = $value ;   // I put 'lists' in case some other module uses 'type' in $_SESSION
  }
  else if (empty($storage[$key]) && isset($_SESSION['lists'][$key])) {
    $storage[$key] = $_SESSION['lists'][$key];
  }
  return $storage[$key];
}

Когда кеш очищается, я напрямую обращаюсь к пункту меню modal/nojs/service-webform, он показывает форму и вызывается hook_form_alter. я подтвердил эту печать некоторым сообщением в form_alter после прямого доступа к modal/nojs/service-webform сейчас, если я получаю доступ к этому URL-адресу с помощью кнопки "Нажмите здесь", которую я создал на serice-page, то он также показывает, что вызывается изменение формы и печатает сообщение на консоли (потому что я использую Chromephp для входа.). Но если кэш очищен, и я нажимаю "Нажми здесь", то форма отображается в модальном режиме, но form_alter не вызывается, потому что она не печатает никаких сообщений в консоли. После нажатия на эту кнопку, если я обращаюсь непосредственно к модалу / nojs / service-webform, также не вызывается form_alter. Так что проблема в том, что пользовательский обработчик отправки не вызывается. я подтвердил эту печатную переменную $ form в форме alter. Это может сделать более ясным http://drupal.org/node/1196150 Есть ли проблема с кешем или я делаю какую-то ошибку?

0 ответов

Другие вопросы по тегам