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!