CGridView AJAX-url pagination

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Ivan Ozercov
Сообщения: 53
Зарегистрирован: 2012.03.21, 15:53
Откуда: Минск

CGridView AJAX-url pagination

Сообщение Ivan Ozercov »

Битый час бьюсь над реализацией следующей задачи, мне надо что бы после редактирования человека не редиретило с 30 страницы на 1
код грида

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

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'site-subcategory-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    //'ajaxUrl'=>Yii::app()->createUrl('/admin/siteSubcategory/admin'),
    // 'ajaxUrl'=>Yii::app()->createUrl('/admin/siteSubcategory/admin'),
    //'ajaxUrl'=>Yii::app()->createUrl('/admin/siteSubcategory/admin',array('page'=>$this->grid->dataProvider->pagination->currentPage+1)),
    //  'ajaxUrl'=>'Yii::app()->controller->createUrl("admin/siteSubcategory/admin/", array("SiteSubcategory_page" => $this->grid->dataProvider->pagination->currentPage+1))',
    //'ajaxUrl'=>array($dataProvider->pagination->route),
    'selectableRows'=>2,
    'columns'=>array(
        array(
        'class'=>'CCheckBoxColumn'
    ),
        array(
            'name'=>'name',
            'type'=>'raw',
            //'value'=>'CHtml::link(CHtml::encode($data->name), array("update", "id"=>$data->id))',
            'value'=> '($data->name)?CHtml::link(Helper::truncateString($data->name, 30, " ", " ..."), array("update", "id"=>$data->id), array("title"=>$data->name)):""',
        ),
        array(
            'name' => 'category_id',
            'filter' => CHtml::listData(SiteCategory::model()->findAll(), 'id', 'name'),
            'type'=>'html',
            'value'=> '($data->category->name)?CHtml::link(Helper::truncateString($data->category->name, 30, " ", " ..."), array("siteCategory/update", "id"=>$data->category_id), array("title"=>$data->category->name)):""',
           // 'value' => 'CHtml::link(CHtml::encode($data->category->name), array("siteCategory/update", "id"=>$data->category_id))',
        ),
        array(
            'name'=>'featured',
            'type'=>'raw',
            'value'=>'CHtml::image(ImageHelper::getPathToImage($data->featured),$data->featured,
                array(
                    "class"=>"FeaturedForChange",
                    "id"=>$data->id,
                    "title"=>"click to change",
                    "featured"=>$data->featured,
                    ))',
            'filter'=>false,
            'htmlOptions'=>array('class'=>'tdForImage')
        ),
        array(
            'name'=>'photo',
            'type'=>'image',
            'value'=>'$data->getImageSrc($data->photo,100,100)',
            'filter'=>false
        ),
        /*array(
            'class'=>'CButtonColumn',
        ),*/
        array(
        'class' => 'ext.RButtonColumn',
        'template' => '{listings} {update} {delete}',
        'header'=>CHtml::dropDownList('pageSize',$pageSize,array(5=>5,10=>10,20=>20,50=>50,100=>100),array(
            // change 'user-grid' to the actual id of your grid!!
            'onchange'=>"$.fn.yiiGridView.update('site-subcategory-grid',{ data:{pageSize: $(this).val() }})",
        )),
        'buttons'=>array
          (
              'listings' => array(
                  'label'=>'Business Listings',
                  'imageUrl'=>Yii::app()->baseUrl .'/images/icons/i_blog.png',
                  'url'=>'Yii::app()->createUrl("admin/business?Business[subcategory_id]=".$data->id)',
              ),
          ),
    ),
    ),
)); ?>

если отключить этот параметр,тогда не происходит ридирект с 30 на первую, но тогда не работает фильтры после пагинации не работают

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

    'ajaxUrl'=>Yii::app()->createUrl('/admin/siteSubcategory/admin'),

 
Надо, что бы человека не редиректило с 30 на 1 страницу при редактировании значения, и чтобы фильтры после пагинации работали.
Аватара пользователя
kosenka
Сообщения: 677
Зарегистрирован: 2009.09.26, 12:41
Откуда: москва
Контактная информация:

Re: CGridView AJAX-url pagination

Сообщение kosenka »

Ivan Ozercov писал(а):Надо, что бы человека не редиректило с 30 на 1 страницу при редактировании значения, и чтобы фильтры после пагинации работали.
У меня это реализовано так (смотри коммент в коде):

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

                        array(
                            'class'=>'CButtonColumn',
                            'template'=>'{update}&nbsp;{delete}',
                            'htmlOptions' => array('style' => 'width:10px;text-align:center;'),
                            'buttons'=>array(
                                'update'=>array(
                                    'label'=>'Редактировать',
                                    'url'=>'array("admin/usersEdit","uid"=>$data->uid,"referer"=>$_GET)',//ВОТ ТУТ получаем referer
                                ),
                                'delete'=>array(
                                    'label'=>'Удалить',
                                    'url'=>'array("admin/usersDelete","uid"=>$data->uid)',
                                    'click'=>'function(){return confirm("'.Yii::t('lan','Удалить ?').'");}',
                                    'visible'=>'$data->user->role!=User::ROLE_ADMIN',
                                ),
                            ),
                        ),
и дальше в контроллере:

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

                                if(!empty($_GET['referer']) and is_array($_GET['referer']))//если на дали "реферер" и он массив
                                {
                                        unset($_GET['referer']['ajax']);//удаляем признак того, что это ajax
                                        $_GET['referer']=array_unique($_GET['referer']);//удаляем дублирующиеся элементы
                                        if(is_array($_GET['referer']['UserDetails']))//если "детали юзера" массив
                                        {
                                                $empty_elements=array_keys($_GET['referer']['UserDetails'],"");//получаем пустые "ключи"
                                                foreach ($empty_elements as $e) unset($_GET['referer']['UserDetails'][$e]);//пробегаемся по массиву и удаляем пустые элменты
                                        }
                                        $url=$url.'?'.http_build_query($_GET['referer']);
                                }
                                $this->controller->redirect($url);
Как то так.
Аватара пользователя
Ivan Ozercov
Сообщения: 53
Зарегистрирован: 2012.03.21, 15:53
Откуда: Минск

Re: CGridView AJAX-url pagination

Сообщение Ivan Ozercov »

Спасибо за совет, сделал немного по другому. При изменении столбеца Featured значение в котором либо 1 либо 0, меняются по клику (пользователь остаётся на текущей странице).

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

Yii::app()->clientScript->registerScript('changeFeatured','
   $("img.FeaturedForChange[id]").live("click",
        function(e){
            var a=($(this).attr("featured")==1)?"featured=0":"featured=1";
            $.ajax({
                url: "/admin/SiteSubcategory/ChangeFeatured",
                type: "post",
                data :a+"&id="+$(this).attr("id"),
                success :
                    function(data){
                        var CurrentUrl=$("#site-subcategory-grid").children(".keys").attr("title");
                        var to = CurrentUrl.search(/(\?|\&)ajax=site-subcategory-grid/);
                        var SaveUrl=CurrentUrl.substring(0,to);
                        $.fn.yiiGridView.update("site-subcategory-grid",{
                            url:SaveUrl,
                        });
                    },
                error : function(data){$.fn.yiiGridView.update("site-subcategory-grid");},
                dataType: "html"
                });
            return false;
        });
',CClientScript::POS_HEAD);
 
т.е я если аякс успешно отработал то получаю запрос

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

  var CurrentUrl=$("#site-subcategory-grid").children(".keys").attr("title");
 

и обрезаю ajax=site-subcategory-grid/

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

    var to = CurrentUrl.search(/(\?|\&)ajax=site-subcategory-grid/);
 
затем полученный адрес засовываю в url функции $.fn.yiiGridView.update

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

     $.fn.yiiGridView.update("site-subcategory-grid",{
         url:SaveUrl,
      });
 
Не знаю на сколько это правильно, но все работает.
Ответить