Создал форму, но после выбора необходимо перейти на главную страницу

Главные вкладки

Аватар пользователя АлександрБолт АлександрБолт 13 марта 2015 в 15:17

На сайте http://investmama.ru/ создал форму выбора города, вставил ее, все отлично, но как после нажатия Выбор перейти на главную страницу?
Пытался сделать выбор через Аякс, но тогда не обновляется информация на станице, так как форму я вызываю в модальное окно...

<?php

/**
 * Implements hook_menu()
 */

function sityselect_hs_menu() {
  $items['sityselect-hs'] = array(
    'title' => 'sityselect Hierarchical Select',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('sityselect_hs_sityselect_form'),
    'access arguments' => array('access content'),
  );
  return $items;
}

/**
 * Form builder
 */

function sityselect_hs_sityselect_form($form, $form_state) {
  // Враппер для селектов
  $form['terms'] = array(
    '#tree' => TRUE,
    '#prefix' => '<div id="terms">',
    '#suffix' => '</div>',
  );

  // Если сработает AJAX, то в $form_state['values']['terms'] будут выбранные значения селектов
  $terms_values = isset($form_state['values']['terms']) ? $form_state['values']['terms'] : array();
  // Селектов будет генерится на 1 больше чем есть в $form_state['values']['terms']
  $terms_values += array('term' . (count($terms_values) + 1) => 'пусто');
  // В первом селекте будут выводится термины без родителя
  $parent_tid = 0;

  foreach ($terms_values as $input_name => $tid) {
    // Завершаем цикл если в предыдущем селекте ничего не выбрано
    // или у термина нет дочерних терминов
    if ($parent_tid === 'пусто' || !($terms = taxonomy_get_tree(5, $parent_tid, 1))) {
      break;
    }
 
    // Формируем данные для селекта
    $options = array('пусто' => '<пусто>');
    foreach ($terms as $term) {
      $options[$term->tid] = $term->name;
    }

    // Создаём сам селект
    $form['terms'][$input_name] = array(
      '#type' => 'select',
      '#options' => $options,
      '#default_value' => $tid,
      '#ajax' => array(
        'callback' => 'sityselect_hs_sityselect_form_ajax_callback',
        'wrapper' => 'terms',
      ),
    );

    $parent_tid = isset($options[$tid]) ? $tid : 'пусто';
  }
 
  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => 'Выбрать'
        // '#ajax' => array(
      // 'callback' => 'sityselect_hs_sityselect_form_ajax_callback1'
    // ),
  );
 
  return $form;
}

function sityselect_hs_sityselect_form_ajax_callback1($form, $form_state)  {
        return array(
    '#type' => 'ajax',
    '#commands' => array(
      ajax_command_html('#' . $form['#id'], theme('status_messages')),
    ),
        );
       
}

function sityselect_hs_sityselect_form_validate($form, &$form_state){
        if (!isset($form_state['values']['terms']['term2'])) {
                form_set_error('name', t('Не выбран город.'));
        }
        else {
                if ($form_state['values']['terms']['term2']=='пусто') {
                form_set_error('name', t('Не выбран город.'));
                }      
        }
       
}

 
/**
 * AJAX callback
 */

function sityselect_hs_sityselect_form_ajax_callback($form, $form_state) {
  return $form['terms'];
}

/**
 * Submit callback
 */

function sityselect_hs_sityselect_form_submit($form, $form_state) {
  //dsm($form_state);
   
  $tid = $form_state['values']['terms']['term2'];
  $tidregion = $form_state['values']['terms']['term1'];
 
  if ($tid=='пусто') {
          break;
  }
 
  $term = taxonomy_term_load($tid);
  $sity = $term->name;
 
  if ($_SESSION['smart_ip']['location']['city'] != $sity) {
    $_SESSION['smart_ip']['location']['city'] = db_select('taxonomy_term_data', 'terms')
          ->fields('terms', array('name'))
          ->condition('tid', $tid, '=')
          ->execute()->fetchField();
        $_SESSION['smart_ip']['location']['region'] = db_select('taxonomy_term_data', 'terms')
          ->fields('terms', array('name'))
          ->condition('tid', $tidregion, '=')
          ->execute()->fetchField();
    global $user;
    $location = $_SESSION['smart_ip'];
    smart_ip_set_location_data($user, $location);
  }
}

Комментарии

Аватар пользователя dashiwa dashiwa 13 марта 2015 в 16:35

Так много кода.
Может if $form_state условие
и drupal_goto7
или
$form_state['redirect']
Это направление куда можно двигаться

Аватар пользователя АлександрБолт АлександрБолт 13 марта 2015 в 16:56

Добавил

function sityselect_hs_sityselect_form_submit($form, $form_state) {
  //dsm($form_state);
   
  $tid = $form_state['values']['terms']['term2'];
  $tidregion = $form_state['values']['terms']['term1'];
 
  if ($tid=='пусто') {
          break;
  }
 
  $term = taxonomy_term_load($tid);
  $sity = $term->name;
 
  if ($_SESSION['smart_ip']['location']['city'] != $sity) {
    $_SESSION['smart_ip']['location']['city'] = db_select('taxonomy_term_data', 'terms')
          ->fields('terms', array('name'))
          ->condition('tid', $tid, '=')
          ->execute()->fetchField();
        $_SESSION['smart_ip']['location']['region'] = db_select('taxonomy_term_data', 'terms')
          ->fields('terms', array('name'))
          ->condition('tid', $tidregion, '=')
          ->execute()->fetchField();
    global $user;
    $location = $_SESSION['smart_ip'];
    smart_ip_set_location_data($user, $location);
  }
 
  $form_state['redirect'] = 'node/2447';
}

чет не заработало...я бы хотел что бы произошла перезагрузка той станицы на которой открылась эта форма

саму форму я размещаю так
<?php print 'Ваш город: ' . '<a href="' . base_path() . 'node/2441?width=200&height=200"  class="colorbox-node" >' . $_SESSION['smart_ip']['location']['city'] . '</a>'; ?>

после нажатия на сабмит я попадаю на страницу node/2441

вот как сделать что бы перезагрузить страницу с которой открыта форма?

Аватар пользователя t1mm1 t1mm1 13 марта 2015 в 19:27

вы можете передать в модальное окно через get обычный destination как параметр в переменной, в которой указать ссылку, куда в итоге редиректить.
потом в форме принять этот параметр (скажем, через drupal_get_query_parameters) и далее передать параметр как hidden переменную, и потом на сабмите сделать редирект.

ну, или передать через сессию destination.

но лично я бы сделал через get.

Аватар пользователя АлександрБолт АлександрБолт 13 марта 2015 в 20:11

хорошо, я получу на сабмите эту переменную где будет путь страницы с которой запустили форму, но почему когда я вставляю в сабмит $form_state['redirect'] = 'node/2447'; ничего не меняется, редирект не происходит? что я делаю не так?