Сtools, Ajax и изменение ссылки

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

Аватар пользователя mfox mfox 11 февраля 2013 в 6:44

Здравствуйте.
Пытаюсь реализовать выбор данных в отдельных модальных окнах. Города, улица, дом - для примера.
Данные находятся в отдельной базе от 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 ='Город&nbsp;';
  
$out.= ctools_modal_text_button('Не выбрано''test1/city/nojs/0''''ctools-modal-ul_modal city');
  
$out.='<br>Улица&nbsp;';
  
$out.=ctools_modal_text_button('Не выбрано''test1/street/nojs/0/0''''ctools-modal-ul_modal street');  
  
$out.='<br>Дом&nbsp;';
  
$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');
}

?>
ВложениеРазмер
Иконка изображения example.png2.96 КБ

Комментарии