[RESUELTO]CLinkPager y criterios de busqueda

Hola comunidad

tengo un problema

agregue a el clasico "admin" generado por "crud" criterios de busqueda

cuando hago el submit, me retorna los datos filtrados, pero cuando retorna muchos datos y uso el paginador para ir a la siguiente pagina, pierdo el criterio y me retorna todos los datos (porque no hace submit)

mi pregunta es ¿¿¿Como se hace esto???

les paso el codigo para que me puedan entender un poco mejor

Controlador




    public function actionAdmin()

    {

        $this->processAdminCommand();


        $criterios=array('b_dominio'=>'','b_valor'=>'','b_descripcion'=>'','b_cod_sisa'=>'');

                $criteria=new CDbCriteria;


                if  (!empty($_POST['b_dominio'])) {

                    $criteria->condition='dominio like :dominio';

                    $criteria->params=array(':dominio'=>$_POST['b_dominio'].'%');

                    $criterios['b_dominio']=$_POST['b_dominio'];

                }

                if  (!empty($_POST['b_valor'])) {

                    if (empty($criteria->condition))

                             $criteria->condition='valor like :valor';

                    else

                             $criteria->condition=$criteria->condition.' and valor like :valor';

                    $criteria->params=array_merge($criteria->params,array(':valor'=>$_POST['b_valor'].'%'));

                    $criterios['b_valor']=$_POST['b_valor'];

                }


                if  (!empty($_POST['b_descripcion'])) {

                    if (empty($criteria->condition))

                             $criteria->condition='descripcion like :descripcion';

                    else

                             $criteria->condition=$criteria->condition.' and descripcion like :descripcion';

                    $criteria->params=array_merge($criteria->params,array(':descripcion'=>$_POST['b_descripcion'].'%'));

                    $criterios['b_descripcion']=$_POST['b_descripcion'];

                }


                if  (!empty($_POST['b_cod_sisa'])) {

                    if (empty($criteria->condition))

                             $criteria->condition='cod_sisa like :cod_sisa';

                    else

                             $criteria->condition=$criteria->condition.' and cod_sisa like :cod_sisa';

                    $criteria->params=array_merge($criteria->params,array(':cod_sisa'=>$_POST['b_cod_sisa'].'%'));

                    $criterios['b_cod_sisa']=$_POST['b_cod_sisa'];

                }


        $pages=new CPagination(Dominios::model()->count($criteria));

        $pages->pageSize=self::PAGE_SIZE;

        $pages->applyLimit($criteria);


        $sort=new CSort('Dominios');

        $sort->applyOrder($criteria);


        $models=Dominios::model()->findAll($criteria);


        $this->render('admin',array(

            'models'=>$models,

            'pages'=>$pages,

                        'criterios'=>$criterios,

            'sort'=>$sort,

        ));

    }




Vista




<?php echo CHtml::beginForm(); ?>

<h2>Administrar Dominios</h2>


<div class="actionBar">

[<?php echo CHtml::link('Lista de Dominios',array('list')); ?>]

[<?php echo CHtml::link('Nuevo Dominios',array('create')); ?>]

</div>


<table class="dataGrid">

  <thead>

  <tr>

    <th><?php echo $sort->link('idDominio'); ?></th>

    <th><?php echo $sort->link('dominio'); ?></th>

    <th><?php echo $sort->link('valor'); ?></th>

    <th><?php echo $sort->link('descripcion'); ?></th>

    <th><?php echo $sort->link('cod_sisa'); ?></th>

    <th>Actions</th>

  </tr>

  </thead>

  <tbody>

<?php foreach($models as $n=>$model): ?>

  <tr class="<?php echo $n%2?'even':'odd';?>">

    <td><?php echo CHtml::link($model->idDominio,array('show','id'=>$model->idDominio)); ?></td>

    <td><?php echo CHtml::encode($model->dominio); ?></td>

    <td><?php echo CHtml::encode($model->valor); ?></td>

    <td><?php echo CHtml::encode($model->descripcion); ?></td>

    <td><?php echo CHtml::encode($model->cod_sisa); ?></td>

    <td>

      <?php echo CHtml::link('Modificar',array('update','id'=>$model->idDominio)); ?>

      <?php echo CHtml::linkButton('Borrar',array(

            'submit'=>'',

            'params'=>array('command'=>'delete','id'=>$model->idDominio),

            'confirm'=>"Esta seguro de borrar #{$model->idDominio}?")); ?>

    </td>

  </tr>

<?php endforeach; ?>


  <tr>


    <td><?php echo ""?></td>

    <td><?php echo CHtml::TextField('b_dominio',$criterios['b_dominio'],array('size'=>10)); ?></td>

    <td><?php echo CHtml::TextField('b_valor',$criterios['b_valor'],array('size'=>10)); ?></td>

    <td><?php echo CHtml::TextField('b_descripcion',$criterios['b_descripcion'],array('size'=>10)); ?></td>

    <td><?php echo CHtml::TextField('b_cod_sisa',$criterios['b_cod_sisa'],array('size'=>10)); ?></td>

    <td<?php echo  CHtml::submitButton('Buscar'); ?></td>




  </tr>


  </tbody>

</table>

<br/>


<?php $this->widget('CLinkPager',array('pages'=>$pages)); ?>

<?php echo CHtml::endForm(); ?>



mirando el foro del sitio (yiiframework) veo que si funciona

pero la diferencia esta en el url que forma

en mi codigo el CLinkPager genera




<pre id="line189">Ir a página: <<span class="start-tag">ul</span><span class="attribute-name"> id</span>=<span class="attribute-value">"yw0" </span><span class="attribute-name">class</span>=<span class="attribute-value">"yiiPager"</span>><<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"first hidden"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin">/sistemas/index.php?r=comun/dominios/admin</a><span>"</span>>&<span class="entity">lt;</span>&<span class="entity">lt;</span> Primero</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"previous hidden"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin">/sistemas/index.php?r=comun/dominios/admin</a><span>"</span>>&<span class="entity">lt;</span> Anterior</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"page selected"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin">/sistemas/index.php?r=comun/dominios/admin</a><span>"</span>>1</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"page"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin&page=2">/sistemas/index.php?r=comun/dominios/admin&amp;page=2</a><span>"</span>>2</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"page"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin&page=3">/sistemas/index.php?r=comun/dominios/admin&amp;page=3</a><span>"</span>>3</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"page"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin&page=4">/sistemas/index.php?r=comun/dominios/admin&amp;page=4</a><span>"</span>>4</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"next"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin&page=2">/sistemas/index.php?r=comun/dominios/admin&amp;page=2</a><span>"</span>>Siguiente &<span class="entity">gt;</span></<span class="end-tag">a</span>></<span class="end-tag">li</span>>

</pre><pre id="line197"><<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"last hidden"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://10.11.49.2:8080/sistemas/index.php?r=comun/dominios/admin&page=4">/sistemas/index.php?r=comun/dominios/admin&amp;page=4</a><span>"</span>>Último &<span class="entity">gt;</span>&<span class="entity">gt;</span></<span class="end-tag">a</span>></<span class="end-tag">li</span>></<span class="end-tag">ul</span>></<span class="end-tag">form</span>></<span class="end-tag">div</span>><span class="comment"><!-- content --></span>


</pre>



y en el sitio, buscando "Chtml" genera




<pre id="line9"><<span class="start-tag">div</span><span class="attribute-name"> class</span>=<span class="attribute-value">"topic_controls"</span>>

		<<span class="start-tag">ul</span><span class="attribute-name"> class</span>=<span class="attribute-value">"pagination left"</span>>

		<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"total"</span>>(8 Pages)</<span class="end-tag">li</span>>

		<<span class="start-tag">li</span><span class="attribute-name"> id</span>=<span class="attribute-value">"anonymous_element_1" </span><span class="attribute-name">class</span>=<span class="attribute-value">"pagejump clickable pj0091227001"</span>>

			<<span class="start-tag">img</span><span class="attribute-name"> src</span><span>="</span><a href="view-source:http://www.yiiframework.com/forum/public/style_images/master/dropdown.png">http://www.yiiframework.com/forum/public/style_images/master/dropdown.png</a><span>" </span><span class="attribute-name">alt</span>=<span class="attribute-value">"+"</span>>

			<<span class="start-tag">script</span><span class="attribute-name"> type</span>=<span class="attribute-value">"text/javascript"</span>>

				ipb.global.registerPageJump( '0091227001', { url: "http://www.yiiframework.com/forum/index.php?app=core&amp;module=search&amp;do=quick_search&amp;search_sort_by=date&amp;search_sort_order=desc&amp;search_term=CHtml&amp;search_filter_app[forums]=1", stKey: 'st', perPage: 25, totalPages: 8 } );

			</<span class="end-tag">script</span>>

</pre><pre id="line19">		</<span class="end-tag">li</span>>

		

		

		

			

				

					<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"active"</span>>1</<span class="end-tag">li</span>>

				

			


				

					<<span class="start-tag">li</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://www.yiiframework.com/forum/index.php?app=core&module=search&do=quick_search&search_sort_by=date&search_sort_order=desc&search_term=CHtml&search_filter_app[forums]=1&st=25">http://www.yiiframework.com/forum/index.php?app=core&amp;module=search&amp;do=quick_search&amp;search_sort_by=date&amp;search_sort_order=desc&amp;search_term=CHtml&amp;search_filter_app[forums]=1&amp;st=25</a><span>" </span><span class="attribute-name">title</span>=<span class="attribute-value">"2"</span>>2</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

				

			


				

					<<span class="start-tag">li</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://www.yiiframework.com/forum/index.php?app=core&module=search&do=quick_search&search_sort_by=date&search_sort_order=desc&search_term=CHtml&search_filter_app[forums]=1&st=50">http://www.yiiframework.com/forum/index.php?app=core&amp;module=search&amp;do=quick_search&amp;search_sort_by=date&amp;search_sort_order=desc&amp;search_term=CHtml&amp;search_filter_app[forums]=1&amp;st=50</a><span>" </span><span class="attribute-name">title</span>=<span class="attribute-value">"3"</span>>3</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

				

			

		

		

			<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"next"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://www.yiiframework.com/forum/index.php?app=core&module=search&do=quick_search&search_sort_by=date&search_sort_order=desc&search_term=CHtml&search_filter_app[forums]=1&st=25">http://www.yiiframework.com/forum/index.php?app=core&amp;module=search&amp;do=quick_search&amp;search_sort_by=date&amp;search_sort_order=desc&amp;search_term=CHtml&amp;search_filter_app[forums]=1&amp;st=25</a><span>" </span><span class="attribute-name">title</span>=<span class="attribute-value">"Next page" </span><span class="attribute-name">rel</span>=<span class="attribute-value">"next"</span>>→</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

		

		

			<<span class="start-tag">li</span><span class="attribute-name"> class</span>=<span class="attribute-value">"last"</span>><<span class="start-tag">a</span><span class="attribute-name"> href</span><span>="</span><a href="view-source:http://www.yiiframework.com/forum/index.php?app=core&module=search&do=quick_search&search_sort_by=date&search_sort_order=desc&search_term=CHtml&search_filter_app[forums]=1&st=175">http://www.yiiframework.com/forum/index.php?app=core&amp;module=search&amp;do=quick_search&amp;search_sort_by=date&amp;search_sort_order=desc&amp;search_term=CHtml&amp;search_filter_app[forums]=1&amp;st=175</a><span>" </span><span class="attribute-name">title</span>=<span class="attribute-value">"Go to last page" </span><span class="attribute-name">rel</span>=<span class="attribute-value">"last"</span>>Last »</<span class="end-tag">a</span>></<span class="end-tag">li</span>>

</pre><pre id="line44">		

	</<span class="end-tag">ul</span>>

	</<span class="end-tag">div</span>>

</pre>



yo quiero hacer eso

usa otro widget?

saludos

Hola, Horacio!

Lo que se me ocurre es que tal vez el form hace el submit vía POST, entonces pierde el filtro…

O sea que los datos quedan en el request sólo la primera vez.

¿Qué pasa si usás GET?

siempre teniendo en cuenta que soy nuevo en todo esto…me animo a contestarte

al contrario, CLinkPager no usa submit

en cambio cuando uso el boton buscar, si hace submit y retorna los datos correctamente

y si, la solucion seria pasar el criterio por GET(como lo hace el sitio), pero no se como se hace

(siempre usando CLinkPager)

Para enviar el form vía GET tenés que especificarlo en el beginForm, la firma es así




public static function beginForm($action='',$method='post',$htmlOptions=array())



O sea que el segundo argumento es el método, con lo que a vos te quedaría




echo CHtml::beginForm('', 'get');



Ahí mirá qué te genera, y en el controlador tendrías que cambiar $_POST por $_GET…

Perdoná si es muy obvio lo que te estoy diciendo…

Está bueno que estés metiendo mano para ver cómo funciona todo, pero si querés sacarlo rápido me parece que hay una extensión que sirve para ésto.

mi problema es con ClinkPager

genera el siguiente link para ir a la pagina 4

comun/dominios/admin&page=4

y yo necesitaria que

  1. haga un submit (en cuyo caso puedo recuperar los criterios)

o

  1. me deje pasar ademas del nro de pagina, el criterio

comun/dominios/admin&page=4&b_dominio=BP&b_valor=&b_descripcion=&b_cod_sisa=

la idea es que el paginador se comporte como el paginador del sistio

quizas sea otro widget

Tenes que recuperar los parametros get y volver a pasarselos al CLinkPager. (los que queres agregar, ya que los otros los pone automatico)

como le paso parametros a CLinkPager?

Hola Horacio,

Yo modificaría el controlador de la siguiente forma:




public function actionAdmin() {

    $this->processAdminCommand();


    $redirectParams = array();

    if (isset($_POST['b_dominio'])){

        $redirectParams['b_dominio'] = $_POST['b_dominio'];

    }

    if (isset($_POST['b_valor'])){

        $redirectParams['b_valor'] = $_POST['b_valor'];

    }

    if (isset($_POST['b_descripcion'])){

        $redirectParams['b_descripcion'] = $_POST['b_descripcion'];

    }

    if (isset($_POST['b_cod_sisa'])){

        $redirectParams['b_cod_sisa'] = $_POST['b_cod_sisa'];

    }

    if (count($redirectParams)>0){

        $this->redirect(array('admin', $redirectParams));

    }


    $conditions = array();

    $params = array();


    if  (isset($_GET['b_dominio'])) {

        $conditions[] = 'dominio like :dominio';

        $params[':dominio'] = $_GET['b_dominio'].'%';

        $criterios['b_dominio']=$_GET['b_dominio'];

    }

    if  (isset($_GET['b_valor'])) {

        $conditions[] = 'b_valor like :valor';

        $params[':valor'] = $_GET['b_valor'].'%';

        $criterios['b_valor']=$_GET['b_valor'];

    }

    if  (isset($_GET['b_descripcion'])) {

        $conditions[] = 'b_valor like :descripcion';

        $params[':descripcion'] = $_GET['b_descripcion'].'%';

        $criterios['b_descripcion']=$_GET['b_descripcion'];

    }

    if  (isset($_GET['b_cod_sisa'])) {

        $conditions[] = 'cod_sisa like :cod_sisa';

        $params[':cod_sisa'] = $_GET['b_cod_sisa'].'%';

        $criterios['b_cod_sisa']=$_GET['b_cod_sisa'];

    }

    

    $criteria = new CDbCriteria;;

    if (count($conditions)>0){

        $criteria->condition = implode(' AND ', $conditions);

        $criteria->params = $params;

    }


    $pages=new CPagination(Dominios::model()->count($criteria));

    $pages->pageSize=self::PAGE_SIZE;

    $pages->applyLimit($criteria);


    $sort=new CSort('Dominios');

    $sort->applyOrder($criteria);


    $models=Dominios::model()->findAll($criteria);


    $this->render('admin',array(

        'models'=>$models,

        'pages'=>$pages,

        'criterios'=>$criterios,

        'sort'=>$sort,

    ));

    }



Igualmente te recomendaría el uso de un CForm para el formulario y que automáticamente te genere en CDbCriteria y no necesitarías de criterios.

Saludos,

Gracias por el codigo, en mi situacion sirve

espero poder ayudar a otros algun dia

hay un problema

la url que genera despues del submit es algo como

index.php?r=comun/dominios/admin&[b]0=rp

y si la cambio por index.php?r=comun/dominios/admin&b_dominio=rp

funciona ok

que puede ser?

es un bug del redirect?




    public function redirect($url,$terminate=true,$statusCode=302)

    {

        if(is_array($url))

        {

            $route=isset($url[0]) ? $url[0] : '';

            $url=$this->createUrl($route,array_splice($url,1));

        }

        Yii::app()->getRequest()->redirect($url,$terminate,$statusCode);

    }




En cuanto a lo de paginación, encontré esto en el foro: quiza te sirva:

[Solved] problem with different paginations in the same tabview.

Exitos!

El problema esta en el redirect hice el codigo muy rápido.

en vez de ser




$this->redirect(array('admin', $redirectParams));



debe ser




$this->redirect($this->constructUrl(array('admin', $redirectParams)));



ó




$this->redirect(array_merge(array('admin'), $redirectParams));



Gracias por las respuestas

y por la paciencia

saludos

asi quedo




        public function actionAdmin() {

            $this->processAdminCommand();


            if(Yii::app()->request->isPostRequest) {


                $redirectParams = array();

                if (isset($_POST['b_dominio']) and !empty($_POST['b_dominio'])){

                    $redirectParams['b_dominio'] = $_POST['b_dominio'];

                }

                if (isset($_POST['b_valor']) and !empty($_POST['b_valor'])){

                    $redirectParams['b_valor'] = $_POST['b_valor'];

                }

                if (isset($_POST['b_descripcion']) and !empty($_POST['b_descripcion'])){

                    $redirectParams['b_descripcion'] = $_POST['b_descripcion'];

                }

                if (isset($_POST['b_cod_sisa']) and !empty($_POST['b_cod_sisa'])){

                    $redirectParams['b_cod_sisa'] = $_POST['b_cod_sisa'];

                }


                $this->redirect(array_merge(array('admin'), $redirectParams));


            }


            $conditions = array();

            $params = array();


            if  (isset($_GET['b_dominio']) and !empty($_GET['b_dominio'])) {

                $conditions[] = 'dominio like :dominio';

                $params[':dominio'] = $_GET['b_dominio'].'%';

                $criterios['b_dominio']=$_GET['b_dominio'];

            }

            if  (isset($_GET['b_valor']) and !empty($_GET['b_valor'])) {

                $conditions[] = 'valor like :valor';

                $params[':valor'] = $_GET['b_valor'].'%';

                $criterios['b_valor']=$_GET['b_valor'];

            }

            if  (isset($_GET['b_descripcion']) and !empty($_GET['b_descripcion'])) {

                $conditions[] = 'descripcion like :descripcion';

                $params[':descripcion'] = $_GET['b_descripcion'].'%';

                $criterios['b_descripcion']=$_GET['b_descripcion'];

            }

            if  (isset($_GET['b_cod_sisa']) and !empty($_GET['b_cod_sisa'])) {

                $conditions[] = 'cod_sisa like :cod_sisa';

                $params[':cod_sisa'] = $_GET['b_cod_sisa'].'%';

                $criterios['b_cod_sisa']=$_GET['b_cod_sisa'];

            }


            $criteria = new CDbCriteria;;

            if  (count($conditions)>0){

                $criteria->condition = implode(' AND ', $conditions);

                $criteria->params = $params;

            }

            $pages=new CPagination(Dominios::model()->count($criteria));

            $pages->pageSize=self::PAGE_SIZE;

            $pages->applyLimit($criteria);


            $sort=new CSort('Dominios');

            $sort->applyOrder($criteria);


            $models=Dominios::model()->findAll($criteria);


            $this->render('admin',array(

                'models'=>$models,

                'pages'=>$pages,

                'criterios'=>$criterios,

                'sort'=>$sort,

            ));

   }




Hola amigos

aca dejo otra forma de hacerlo

que es con el metodo GET como me dicen Luciano Y PoL

(lo saque del foro,Search GET, es un tip que dejo el master Qiang)




<?php echo CHtml::beginForm('','get');

echo CHtml::hiddenField('r','regprof/rp_profesionales/admin') ;

?>



con esto se evita el codigo




if(Yii::app()->request->isPostRequest) {


                $redirectParams = array();

                if (isset($_POST['b_dominio']) and !empty($_POST['b_dominio'])){

                    $redirectParams['b_dominio'] = $_POST['b_dominio'];

                }

                if (isset($_POST['b_valor']) and !empty($_POST['b_valor'])){

                    $redirectParams['b_valor'] = $_POST['b_valor'];

                }

                if (isset($_POST['b_descripcion']) and !empty($_POST['b_descripcion'])){

                    $redirectParams['b_descripcion'] = $_POST['b_descripcion'];

                }

                if (isset($_POST['b_cod_sisa']) and !empty($_POST['b_cod_sisa'])){

                    $redirectParams['b_cod_sisa'] = $_POST['b_cod_sisa'];

                }


                $this->redirect(array_merge(array('admin'), $redirectParams));


            }




saludos