На сайте http://investmama.ru/ создал форму выбора города, вставил ее, все отлично, но как после нажатия Выбор перейти на главную страницу?
Пытался сделать выбор через Аякс, но тогда не обновляется информация на станице, так как форму я вызываю в модальное окно...
/**
* 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);
}
}
Комментарии
Так много кода.
Может if $form_state условие
и drupal_goto7
или
$form_state['redirect']
Это направление куда можно двигаться
Добавил
//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
вот как сделать что бы перезагрузить страницу с которой открыта форма?
вы можете передать в модальное окно через get обычный destination как параметр в переменной, в которой указать ссылку, куда в итоге редиректить.
потом в форме принять этот параметр (скажем, через drupal_get_query_parameters) и далее передать параметр как hidden переменную, и потом на сабмите сделать редирект.
ну, или передать через сессию destination.
но лично я бы сделал через get.
хорошо, я получу на сабмите эту переменную где будет путь страницы с которой запустили форму, но почему когда я вставляю в сабмит
$form_state['redirect'] = 'node/2447';
ничего не меняется, редирект не происходит? что я делаю не так?не меняется. и не должно меняться.
сделайте через goto и все.
вообще, как-то слишком сложно у вас.
https://www.drupal.org/node/1074616
вот тут подробно написано,почему не редиректит.