Problema Con La Paginación De Un Grid

Hola a tod@s!

He programado durante algunos años en .NET, ASP… y he hecho alguna cosilla en php nativo. Soy completamente nuevo en el mundo de los frameworks de php y en el MVC, así que me surgen dudas que posiblemente sean chorradas. Espero que me puedan ayudar.

Estoy implementando un buscador que funciona de la siguiente manera:

En la página principal de mi aplicación tengo 2 dropDownLists dentro de un CActiveForm:




$form=$this->beginWidget('CActiveForm', array(

	'id'=>'buscador-form',

	'action'=>'actividades/buscar',

	'method'=>'post',

	'enableAjaxValidation'=>true,

	'enableClientValidation'=>false));

?>

<div id="buscador">

	<label for="Actividades_Actividad" class="required">Selecciona tu actividad</label>

	<?php echo $form->dropDownList(Actividades::model(), 'IdActividad', CHtml::listData(Actividades::model()->findAll(), 'IdActividad', 'Actividad'), array('options'=>array('42'=>array('selected'=>true)),'name'=>'actividad')); ?>

	<br />

	<br />

	<label for="Municipios_Municipio" class="required">Selecciona tu Municipio</label>

	<?php echo $form->dropDownList(Municipios::model(),	'IdMunicipio', CHtml::listData(Municipios::model()->findAll(" IdIsla = 1 "), 'IdMunicipio', 'Municipio'), array('options'=>array('24'=>array('selected'=>true)),'name'=>'municipio')); ?>	

	<br />

	<br />

	<?php

	$this->widget('ext.EChosen.EChosen', array('target' => 'select', 'useJQuery' => true, 'debug' => true,)); 

	$this->widget('bootstrap.widgets.TbButton', array('buttonType'=>'submit','type'=>'info','label'=>'Encontrar','loadingText'=>'Buscando...','htmlOptions'=>array('id'=>'buttonStateful','style'=>'margin-left:132px')));?>

</div>

<?php

$this->endWidget();

?>



Mediante el action del CActiveForm, envío los parámetros de búsqueda a mi acción "buscar" del controlador "actividades":




	public function actionBuscar($data)

	{

		if(isset($_POST['municipio']) and isset($_POST['actividad'])) {

			$dataProvider=new CActiveDataProvider('Vwactividades', array(

				'criteria'=>array(

					'condition'=>'IdMunicipio = '.$_POST["municipio"].' AND IdActividad = '.$_POST["actividad"]

				)

			));

		}

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

			'dataProvider'=>$dataProvider,

		));

	}



Recibo los valores POST, hago una búsqueda sobre una view de la base de datos, y renderizo la view buscar:




<?php 

$this->widget('zii.widgets.grid.CGridView', array(

	'id'=>'busqueda-grid',

	'dataProvider'=>$dataProvider,

	'filter'=>null,

	'columns'=>array(

		array(

			'name'=>'Nombre',

			'header'=>'Establecimiento',

			'type'=>'raw',

			'value'=>'"<nobr>".$data->Nombre."</nobr>"'

		),

		array(

			'name'=>'Dias',

			'header'=>'Días',

			'type'=>'raw',

			'value'=>array(Dias::model(), 'getDias')	

		),

		'Mensualidad',

		array(

			'name'=>'Valoracion',

			'header'=>'Valoración',

			'type'=>'raw',

			'value'=>array(Clientes::model(), 'getValoracion')		

		),

	),

));  

?>



El problema lo tengo al intentar ordenar el grid haciendo clic en los headers. Me lanza un alert con el error siguiente:

Error 500: <h1>PHP Error [8]</h1> <p>Undefined variable: dataProvider</p>

Entiendo que el problema está en que la paginación vuelve a llamar a la acción "buscar", ya que veo que la url que intentan abrir es así: …/actividades/buscar?Vwactividades_sort=Nombre, y claro… como no recibe nada en $_POST, no puede volver a crear el $dataProvider.

He conseguido solucionarlo temporalmente haciendo que los valores de la búsqueda se envíen por GET, pero me parece poco elegante como solución definitiva. Preferiría que la URL se mantuviera como /actividades/buscar en vez de /actividades/buscar?municipio=24&actividad=42

Alguien me orienta? Tal vez lo estoy haciendo mal desde el principio ::)

Saludos a todos!

Hola michelinho :)

El error está en que la variable $dataProvider SOLO está disponible cuando hay un POST… lo cual genera un error :)

Así que en ese caso, lo mejor es hacer un $dataProvider vacío cuando no haya POST. (Algo como new CActiveDataProvider())

Saludos

Hola! Eso no me vale, porque recarga la página con el dataProvider con todos los datos del modelo, sin filtrar por los valores seleccionados en los dos combos de la página inicial.

Gracias por la respuesta, de todas formas.

Alguna idea? Necesito que se mantenga el mismo dataProvider.