TbActiveForm->radioButtonListInlineRow() и ajax

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

Делаю следующее во вьюхе:

Код: Выделить всё

    <?php echo $form->radioButtonListInlineRow($model,'sex',
          array('3'=>'Женщина', '1'=>'Мужчина' ),
); ?>
тут $form - TbActiveForm
Все в порядке, все работает. Добавляю аджакс запрос:

Код: Выделить всё


    <?php echo $form->radioButtonListInlineRow($model,'sex',
          array('3'=>'Женщина', '1'=>'Мужчина' ),
          array(
            'ajax'=>array(
              'type'=>'POST', //request type
              'url'=>CController::createUrl('order/dynamicWorkingDays'),
              'success'=>'function(data) {
                                var md = eval("(" + data + ")");
                                $("#Order_day").html(md.wdays);
                                $("#checkboxList_id").html(md.services);
                              }',
            )
  )); ?>
Запрос вызывается, джаскрипт функция отрабатывает правильно, все хорошо за исключением того, что сам радиобаттон не переключается. То есть значение по умолчанию - женщина, ткнул в мужчину, аджакс запрос и джаваскрипт отработали, изменения в форме есть, но выбран радиобатон женщина. Если аджакс запрос убрать, то радиобаттон начинает работать нормально.
Небольшой момент: в опере иногда выбранный радиобаттон меняется, а иногда нет. В файрфоксе и хроме - никогда.
В чем причина и как лечить?
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение flashimage »

а можно увидеть console.log(md)? для чего var md = eval("(" + data + ")");?
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

eval нужен потому, что data отдается из пхп вот так:

Код: Выделить всё

    $res = CJSON::encode(array(
      'wdays'=>$resDays,
      'services'=>$services,
    ));
    echo $res;
 
Таким образом после eval имеем джаваскрипт объект, из которого получаем данные. Смотрите код в первом посте.
Кстати, без eval - это не работает.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение flashimage »

tolyan писал(а):eval нужен потому, что data отдается из пхп вот так:

Код: Выделить всё

    $res = CJSON::encode(array(
      'wdays'=>$resDays,
      'services'=>$services,
    ));
    echo $res;
Таким образом после eval имеем джаваскрипт объект, из которого получаем данные. Смотрите код в первом посте.
Кстати, без eval - это не работает.
Смотрю на свой код

Код: Выделить всё

$outArray = array(
              'status' => 'updateSuccess',
              'model' => $model,
              'action' => 'update', 
              );
echo CJSON::encode($outArray);

Код: Выделить всё

function(data){
 $('.doc'+data.model.id).html(data.model.name);
...
}
и думаю - мож я какой то особенный ))

Ну так что пришлете console.log(data) ?
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

Это не вы, это я особенный. Во всех примерах никакого eval не было. Увидев ошибки работы джаваскриптовой function(data) я этот eval методом интуитивной дедукции вставил, и помогло.
Вот что выдается по console.log(data)

Код: Выделить всё

{"wdays":"<option value=\"\"><\/option><option value=\"20130828\">28\/08, \u0421\u0440\u0435\u0434\u0430<\/option><option value=\"20130829\">29\/08, \u0427\u0435\u0442\u0432\u0435\u0440\u0433<\/option><option value=\"20130830\">30\/08, \u041f\u044f\u0442\u043d\u0438\u0446\u0430<\/option><option value=\"20130901\">01\/09, \u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435<\/option><option value=\"20130904\">04\/09, \u0421\u0440\u0435\u0434\u0430<\/option><option value=\"20130905\">05\/09, \u0427\u0435\u0442\u0432\u0435\u0440\u0433<\/option><option value=\"20130906\">06\/09, \u041f\u044f\u0442\u043d\u0438\u0446\u0430<\/option><option value=\"20130908\">08\/09, \u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435<\/option>","services":"<input id=\"ytOrder_services\" type=\"hidden\" value=\"\" name=\"Order[services]\" \/><span id=\"Order_services\"><\/span>"}
ну и после eval (console.log(md)):

Код: Выделить всё

Object { wdays="<option value=""></opti...9, Воскресенье</option>", services="<input id="ytOrder_serv...Order_services"></span>"}
развернуто:

Код: Выделить всё

    
services
    "<input id="ytOrder_services" type="hidden" value="" name="Order[services]" /><span id="Order_services"></span>"
    
wdays
    "<option value=""></option><option value="20130828">28/08, Среда</option><option value="20130829">29/08, Четверг</option><option value="20130830">30/08, Пятница</option><option value="20130901">01/09, Воскресенье</option><option value="20130904">04/09, Среда</option><option value="20130905">05/09, Четверг</option><option value="20130906">06/09, Пятница</option><option value="20130908">08/09, Воскресенье</option>"
UPD: Не понятно, как у вас и в примерах ajax без eval работает. Потому что в любом случае в джаваскриптовую function(data) data - передается строкой. Это и в описании JSON написано, и в примерах JSON eval везде есть (надо же как то объект джаваскрипт из строки получить). А вот в Yii ajax примерах eval нету, и каким образом тут у нас (у вас) строка data в объект джаваскрипт преобразуется - мне не понятно.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение flashimage »

'dataType'=>'json', - это для нормальной передачи объекта
да и $("#checkboxList_id").html(md.services); - здесь же наверно нужно id чекбокса вставить
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

flashimage писал(а):'dataType'=>'json', - это для нормальной передачи объекта
То есть должно быть так, если я правильно понял:

Код: Выделить всё

$res = CJSON::encode(array(
      'dataType'=>'json'
      'wdays'=>$resDays,
      'services'=>$services,
    ));
    echo $res;
 
да и $("#checkboxList_id").html(md.services); - здесь же наверно нужно id чекбокса вставить
А это и есть ид чекбокса. Говорю же, джаваскрипт код работает отлично, ошибок в консоль не валит.
Но как то мы с темы съехали... Если убрать из джаваскипт кода eval - то при клике по не выбранному радиобаттону он все равно выбранным не становится.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение flashimage »

tolyan писал(а):
flashimage писал(а):'dataType'=>'json', - это для нормальной передачи объекта
То есть должно быть так, если я правильно понял:

Код: Выделить всё

$res = CJSON::encode(array(
      'dataType'=>'json'
      'wdays'=>$resDays,
      'services'=>$services,
    ));
    echo $res;
 
Нет должно быть так

Код: Выделить всё

 'ajax'=>array(
              'dataType'=>'json',
              'type'=>'POST', //request type
              'url'=>CController::createUrl('order/dynamicWorkingDays'),
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

Добавил

Код: Выделить всё

'dataType'=>'json',
 
и это позволило убрать eval из джаваскрипт кода. Но проблемы, описанной в первом посте это не решило.
Если так:

Код: Выделить всё

    <?php echo $form->radioButtonListInlineRow($model,'sex',
          array('3'=>'Женщина', '1'=>'Мужчина' ),
          array(
            'ajax'=>array(
              'dataType'=>'json',
              'type'=>'POST', 
              'url'=>CController::createUrl('order/dynamicWorkingDays'),
              'success'=>'function(data) {
                                $("#Order_day").html(data.wdays);
                                $("#checkboxList_id").html(data.services);
                              }',
            )
  )); ?>
то не меняется выбранный радиобаттон при клике по нему. Если закомментить весь 'ajax'=>array(...) - то все нормально, только, естественно, никаких аджакс запросов не посылается. Более того, если сделать тело function(data) {} пустым - то активность радиобаттона тоже не меняется

UPD:
вылечил так:

Код: Выделить всё

    <?php  echo $form->radioButtonListInlineRow($model,'sex',
          array('3'=>'Женщина', '1'=>'Мужчина' ),
          array('class'=>'radioSex',
  )); ?>
и добавил джаваскрипт файл:

Код: Выделить всё

/*<![CDATA[*/
jQuery(function($) {
jQuery('body').on('change','.radioSex',function(){jQuery.ajax(
  {'type':'POST','dataType':'json','url':'/order/dynamicWorkingDays','success':function(data) {
                                $("#Order_time").html(data.times);
                                $("#checkboxList_id").html(data.services);
                              },'cache':false,'data':jQuery(this).parents("form").serialize()});return false;});
jQuery('body').tooltip({'selector':'a[rel=tooltip]'});
jQuery('body').popover({'selector':'a[rel=popover]'});
jQuery('#yii_bootstrap_collapse_0').collapse({'parent':false,'toggle':false});
jQuery('#yw4 .alert').alert();
});
/*]]>*/
Это помогло.
Выходит, во фреймворке косяк? Если нет, то не пойму, что я не так делал.
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение flashimage »

Да не, в фреймфорке все красиво

Код: Выделить всё

if(isset($htmlOptions['ajax']))
        $handler.=self::ajax($htmlOptions['ajax'])."{$return};";

   if($live)
        $cs->registerScript('Yii.CHtml.#' . $id,"jQuery('body').on('$event','#$id',function(){{$handler}});");
    else
        $cs->registerScript('Yii.CHtml.#' . $id,"jQuery('#$id').on('$event', function(){{$handler}});"); 
Попробуйте использовать обычный радиоинпут (activeForm), а не booster.
Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
tolyan
Сообщения: 61
Зарегистрирован: 2012.05.19, 02:29

Re: TbActiveForm->radioButtonListInlineRow() и ajax

Сообщение tolyan »

Я же отписался в UPD предыдущего своего сообщения: вылечилось вынесением джаваскрипт кода в отдельный файл, а формирование радиобаттонов так и осталось radioButtonListInlineRow
И еще момент: обычный Chtml::radioButtonList($name, $select, $data) вроде не понимает ajax в htmlOptions. Или я не прав?
Ответить