Здравствуйте.
Пытаюсь реализовать выбор данных в отдельных модальных окнах. Города, улица, дом - для примера.
Данные находятся в отдельной базе от drupal и не связаны с таксономией.
В каждой ссылке созданной с помощью ctools_modal_text_button задаю аргументы для отбора данных (изначально нули). После выбора в модальном окне с помощью ajax_command_invoke меняю адреса ссылок выбранным id.
Т.е: для города $items[sity/%ctools_js/%] где 3 аргумент id города,
для улицы $items[street/%ctools_js/%/%] где 3 аргумент id города, 4 - id улицы.
Например, после выбора одного из городов ссылки примут вид:
до
sity/nojs/0
street/nojs/0/0
на
sity/nojs/12
street/nojs/12/0
Адреса ссылок меняются (видно когда подводишь мышь к статусной строке), но при нажатии на них как будто адрес ссылки не менялся и в callback функции передаются прежние параметры (начальные заданные значения в момент создания ссылки). Это видно в firebug.
Причем попробовал, если вторая ссылка выбора, например, улицы - не ajax, то после ее изменения, нажимая на нее используется измененный адрес.
В чем может быть причина? Как решить проблему?
Вот примерный код модуля:
<?php
function test_get_city(){
return array('Москва','Санкт-Петербург');
}
function
test_get_street($id){
return array('Некрасова','Пушкина');
}
function
test1_form($form, &$form_state) {
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Submit',
);
return $form;
}
function
test1_form_city($form, &$form_state) {
$form = array();
$form['select_city'] = array(
'#type' => 'select',
'#title' => t('Город'),
'#options' => test1_get_city(),
'#size' => 12,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Выбрать',
);
return $form;
}
function
test1_form_street($form, &$form_state) {
//здесь должен передаться id выбранного города
$id=1;
$form = array();
$form['select_street'] = array(
'#type' => 'select',
'#title' => t('Улица'),
'#options' => test1_get_street($id),
'#size' => 12,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Выбрать',
);
return $form;
}
function
test1_menu() {
$items['test1'] = array(
'title' => 'test1',
'description' => '',
'page callback' => 'render_test1_form',
'access arguments' => array('view test1'),
);
$items['test1/city/%ctools_js/%'] = array (
'page callback' => 'test1_callback_city',
'page arguments' => array(2,3),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
$items['test1/street/%ctools_js/%/%'] = array (
'page callback' => 'test1_callback_street',
'page arguments' => array(2,3,4),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function
test1_permission() {
return array(
'view test1' => array(
'title' => 'View test1',
'description' => '',
),
'access select_city_id content' => array(
'title' => 'access select_city_id content',
'description' => '',
),
);
}
function
render_test1_form() {
ctools_include('modal');
ctools_include('ajax');
ctools_modal_add_js();
$out ='Город ';
$out.= ctools_modal_text_button('Не выбрано', 'test1/city/nojs/0', '', 'ctools-modal-ul_modal city');
$out.='<br>Улица ';
$out.=ctools_modal_text_button('Не выбрано', 'test1/street/nojs/0/0', '', 'ctools-modal-ul_modal street');
$out.='<br>Дом ';
$out.=ctools_modal_text_button('Не выбрано', 'test1/street/nojs/0/0', '', 'ctools-modal-ul_modal street');
$out.= '<div id="test1-form-wrapper">';
$out.= drupal_render(drupal_get_form('test1_form'));
$out.= '</div>';
return $out;
}
////////////////////////////////////////////////
function test1_callback_city($js,$id_city) {
ctools_include('modal');
ctools_include('ajax');
ctools_modal_add_js();
ctools_add_js("ajax-responder");
$form_state = array(
'title' => 'Выбор города',
'ajax' => TRUE,
);
$commands = ctools_modal_form_wrapper('test1_form_city', $form_state);
if (!empty($form_state['executed'])) {
$commands = array();
$key=$form_state['values']['select_city'];
$key_str=$form_state['complete form']['select_city']['#options'][$key];
$commands[] = ajax_command_invoke('.city','html', array($key_str));
$commands[] = ajax_command_invoke('.city', 'attr', array('href', 'test1/city/nojs/'.$key));
$commands[] = ajax_command_invoke('.street', 'attr', array('href', 'test1/street/nojs/'.$key.'/0'));
$commands[] = ctools_modal_command_dismiss();
}
print
ajax_render($commands);
exit;
}
function
test1_callback_street($js,$id_city,$id_street){
ctools_include('modal');
ctools_include('ajax');
ctools_modal_add_js();
ctools_add_js("ajax-responder");
$form_state = array(
'title' => 'Выбор улицы',
'ajax' => TRUE,
);
$form_state['build_info']['args'] = array($id_city);
//Здесь ожидаю видеть для выбранного города ID
//print('City'.$id_city.'Strete'.$id_street);
$commands = ctools_modal_form_wrapper('test1_form_street', $form_state);
if (!empty($form_state['executed'])) {
$commands = array();
$key=$form_state['values']['select_street'];
$key_str=$form_state['complete form']['select_street']['#options'][$key];
$commands[] = ajax_command_invoke('.street','html', array($key_str));
$commands[] = ajax_command_invoke('.street', 'attr', array('href', 'test1/street/nojs/'.$id_city.'/'.$key));
$commands[] = ctools_modal_command_dismiss();
}
print ajax_render($commands);
exit;
}
function
test1_init() {
ctools_include('modal');
ctools_include('ajax');
ctools_modal_add_js();
ctools_add_js('ajax-responder');
$modal_style = array(
'ul_test' => array(
'modalSize' => array(
'type' => 'fixed',
'width' => 550,
'height' => 450,
),
'modalOptions' => array(
'opacity' => .5,
'background-color' => '#000',
),
'throbber' => theme('image', array('path' => ctools_image_path('ajax-loader.gif', 'test1'), 'alt' => t('Loading...'), 'title' => t('Loading'))),
),
);
drupal_add_js($modal_style, 'setting');
ctools_add_js('test1', 'test1');
ctools_add_css('test1', 'test1');
}
?>
Вложение | Размер |
---|---|
![]() | 2.96 КБ |
Комментарии
Ответ на свой вопрос нашел здесь