//Nota: el siguiente ej. es parte de un sistema de registro de actividades
en el action:
public function executeIndex(sfWebRequest $request) { $query = Doctrine_Core::getTable('Actividad') ->createQuery('a'); $this->filtro = new ActividadFormFilter(); if($request->isMethod('post')) { $this->filtro->bind($request->getParameter($this->filtro->getName())); if ($this->filtro->isValid()){ $query = $this->filtro->buildQuery($this->filtro->getValues()); } } $this->pager = new sfDoctrinePager('Actividad',sfConfig::get('app_nb_results_per_page')); $this->pager->setQuery($query); $this->pager->setPage($request->getParameter('page', 1)); $this->pager->init(); }app_nb_results_per_page se define en proy/apps/app/config/app.yml de la siguiente manera
all: nb_results_per_page: 50en el template lo que sigue...
formulario del filtro:
Script:
vinculos del paginador:
<?php if ($pager->haveToPaginate()): ?><?php foreach ($pager->getLinks() as $page): ?> <?php if ($page == $pager->getPage()): ?> <?php echo $page ?> <?php else: ?> <?php echo $page ?> <?php endif; ?> <?php endforeach; ?><?php endif; ?>Páginas :<?php echo $pager->getPage() ?> / <?php echo $pager->getLastPage()?>
Total de registros :<?php echo $pager->getNbResults() ?>
y para finalizar ajusto los widgets que necestio:
class ActividadFormFilter extends BaseActividadFormFilter { public function configure() { //lista de widgets que quieres mostrar $this->wantedFields = array( 'usuario_list', 'fecha_inicio', 'fecha_fin', 'estatus_id', 'centro_id',); foreach ($this as $fieldName => $widget){ if (!in_array($fieldName, $this->wantedFields)){ //unset a los widgets que no estan en el arreglo unset($this->widgetSchema[$fieldName]); unset($this->validatorSchema[$fieldName]); } } $years = range(date('Y'), 2010 ); $this->widgetSchema['fecha_inicio'] = new sfWidgetFormFilterDate(array( 'from_date' =>new sfWidgetFormI18nDate(array('years' => array_combine($years, $years), 'format' => '%day% %month% %year%', 'culture' => 'es', 'empty_values' => array('day' => '<- Día ->', 'month' => '<- Mes ->', 'year' => '<- Año ->'), )), 'to_date' => new sfWidgetFormI18nDate(array('years' => array_combine($years, $years), 'format' => '%day% %month% %year%', 'culture' => 'es', 'empty_values' => array('day' => '<- Día ->', 'month' => '<- Mes ->', 'year' => '<- Año ->'), )), 'with_empty' => 0, // Para que no salga el checkbox 'template' => 'desde : %from_date% hasta : %to_date%' )); $this->widgetSchema['fecha_fin'] = new sfWidgetFormFilterDate(array( 'from_date' =>new sfWidgetFormI18nDate(array('years' => array_combine($years, $years), 'format' => '%day% %month% %year%', 'culture' => 'es', 'empty_values' => array('day' => '<- Día ->', 'month' => '<- Mes ->', 'year' => '<- Año ->'), )), 'to_date' => new sfWidgetFormI18nDate(array('years' => array_combine($years, $years), 'format' => '%day% %month% %year%', 'culture' => 'es', 'empty_values' => array('day' => '<- Día ->', 'month' => '<- Mes ->', 'year' => '<- Año ->'), )), 'with_empty' => 1, // Para que salga el checkbox 'empty_label' =>'Sin Egreso', 'template' => 'desde : %from_date% hasta : %to_date%' )); $this->widgetSchema['centro_id'] = new sfWidgetFormDoctrineChoice(array( 'model' => 'Centro', 'add_empty' => '<- Seleccione Centro ->', 'label' => 'Estado de Procedencia', )); $this->widgetSchema['usuario_list'] = new sfWidgetFormDoctrineChoice( array('multiple' => true, 'expanded' => true, 'model'=> 'Usuario', 'table_method'=>'getUsuariosByCoordinacion', 'key_method'=>'getId', )); $this->widgetSchema->setLabels(array( 'fecha_inicio' =>'Fecha de inicio :', 'fecha_fin' =>'Fecha de culminacion :', 'tipo_actividad' =>'Tipo de actividad :', 'estatus_id' =>'Estatus :', 'lugar_actividad' =>'Lugarde la actividad :', 'centro_id' =>'Centro :', 'recurso_humano' =>'Personas externas involucradas :', 'institucion_list' =>'Instituciones :', 'usuario_list' =>'Participantes :', 'observacion_analista' =>'Observaciones del analista:', 'descripcion' =>'Titulo de la actividad :', 'observacion' =>'Objetivo y Observaciones de la actividad:', )); } }Resumen: se crea el filtro como normalmente lo harias, al igual que el paginado, luego modificas los vinculos para navegar entre paginas eliminando el href y agregando onClick; agregas el javascript y listo!!
2 ejemplos en 1: filtros y paginador...
nota: al inicio de la clase para los filtros agregue una funcion muy util para hacer unset a los widgets que no necesitamos usar, hace un tiempo la consegui en un post y no he podido conseguirlo nuevamente... asi q ahi se los dejo...