Paginación cakePHP y passArgs

Estoy tratando de crear un cuadro de "búsqueda" en una página de resultados en mi aplicación cakephp. La página usa el componente de paginación cakePHP para mostrar y "paginar" los resultados. Esto es perfecto, pero tengo dificultades para que la siguiente parte funcione.

El resultado deseado:

  1. Un formulario cakephp (publicación) con un cuadro de entrada y un par de cuadros de selección, incluido un selector de fecha para que pueda seleccionar entre fechas. El usuario debe poder completar estos campos y enviar
  2. Al enviar, la selección del usuario debe cambiar las condiciones de paginación de cakePHP en el controlador
  3. En la vista, quiero que la barra de paginación mantenga un registro de la selección del usuario, de modo que cuando filtro a través de diferentes páginas, mantenga la búsqueda de los usuarios. Entiendo que esto se puede lograr usando $this->passedArgs, por eso estoy usando post y no get.

El código:

 // Form:
 <?php 
      echo $this->Form->create('search', array('class' => false));
           echo $this->Form->input('searchFor');
           echo $this->Form->input('dateFrom');
           echo $this->Form->input('dateTo');
      echo $this->Form->end(); 
 ?>

 // Controller:
 if($this->request->is("post")) {
      $filters = $this->request->data["search"];
      $this->passedArgs["searchFor"] = $filters["searchFor"];
      $this->passedArgs["dateFrom"] = $filters["dateFrom"]." 00:00:00";
      $this->passedArgs["dateTo"] = $filters["dateTo"]." 00:00:00";


      // Assign search parameters:
      if($this->passedArgs["searchFor"] != "") {
           $conditions["Model.field LIKE"] = "%".$this->passedArgs["searchFor"]."%";
      }

      $conditions["Model.created >="] = $this->passedArgs["dateFrom"];
      $conditions["Model.created <="] = $this->passedArgs["dateTo"];


 } else {
      $conditions = array("Result.status_id >=" => 12);
 }

 $this->paginate = array(
     'conditions' => $conditions,
     'order' => array('Result.created ASC'),
     'limit' => 20
 );

 $this->set("results",$this->paginate("Model");


 // The view file:
 <?php
      $this->Paginator->options(array('url' => $this->passedArgs));
 ?>

Dónde estoy ahora:

  1. La página inicial se carga con todos los resultados.
  2. Cuando completo los cuadros de búsqueda, devuelve mis resultados

El problema:

  1. Estoy convencido de que la forma en que lo estoy haciendo es incorrecta, ya que ahora necesito hacer 2 comprobaciones, a) si se han publicado los resultados yb) comprobar si hay passArgs disponibles. Estoy 100% convencido de que esta no es la forma correcta de hacerlo.
  2. Digamos que tengo 2 campos de formulario libre para buscar, digamos nombre y apellido, si dejo el apellido en blanco, mi URL se escribirá como se muestra a continuación, y esto no parece correcto. Eso significa que tengo que asignar valores predeterminados para garantizar que los elementos a continuación no sucedan, lo que no parece ser muy dinámico.

    http://localhost/site/controller/action/surname:0/name:John/date:0/

  3. Al actualizar, dice que la página no existe porque los valores publicados ya no están disponibles.

preguntado el 03 de mayo de 12 a las 09:05

2 Respuestas

normalmente procedo así en el controlador:

//transform POST into GET
if($this->request->is("post")) {
    $url = array('action'=>'index');
    $filters = array();

    if(isset($this->data['searchFor']) && $this->data['searchFor']){
        //maybe clean up user input here??? or urlencode??
        $filters['searchFor'] = $this->data['searchFor'];
    }
    //redirect user to the index page including the selected filters
    $this->redirect(array_merge($url,$filters)); 
}

$conditions = array();
//check filters on passedArgs
if(isset($this->passedArgs["searchFor"])){
    $conditions["Model.field LIKE"] = "%".$this->passedArgs["searchFor"]."%";
}

//paginate as normal
$this->paginate = array(
     'conditions' => $conditions,
     'order' => array('Result.created ASC'),
     'limit' => 20
 );

La idea es transformar el POST enviado por su formulario en GET. para que no tengas problemas con el paginador ni con el refresco

Espero que esto ayude

contestado el 03 de mayo de 12 a las 10:05

Lo que desea se puede hacer mucho más simple y SECO usando este complemento de búsqueda.

Automatiza lo que quieres más o menos y además ya puede hacer más que tu código.

Así que le sugiero que use el complemento directamente o que le eche un vistazo a cómo funciona. :)

contestado el 03 de mayo de 12 a las 10:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.