cakePHP分页并传递了Args

时间:2012-05-03 08:12:27

标签: php cakephp pagination components

我正在尝试在我的cakephp应用中的结果页面上构建一个“搜索”框。该页面使用cakePHP分页组件来显示和“分页”结果。这很完美,但我很难让下一部分工作。

期望的结果:

  1. 带有输入框和几个选择框的cakephp表单(post),包括日期选择器,以便我可以在日期之间进行选择。用户应该能够填充这些字段并提交
  2. 在提交时,用户选择应更改控制器中的cakePHP分页条件
  3. 在视图中,我希望分页栏记录用户选择,这样当我过滤不同的页面时,它会让用户搜索。我知道这可以使用$ this-> passedArgs来实现,因此我使用post而不是get。
  4. 代码:

     // 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));
     ?>
    

    我现在的位置:

    1. 初始页面加载了所有结果
    2. 当我填充搜索框时,它会返回我的结果
    3. 问题:

      1. 我确信我这样做的方式不正确,因为我现在需要做2次检查,a)如果结果已经发布,b)检查是否有passArgs可用。我完全相信这不是正确的做法。
      2. 假设我有两个免费的表单字段用于搜索,比如姓名和姓氏,如果我将姓氏留空,我的网址将写成如下,这看起来或看起来不正确。这意味着我必须指定默认值以确保不会发生以下项目,这似乎不是非常动态。

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

      3. 在刷新时,它表示该页面不存在,因为已发布的值不再可用。

2 个答案:

答案 0 :(得分:6)

通常我会在控制器中继续这样做:

//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
 );

我们的想法是将表单发送的POST转换为GET。所以你不会遇到paginator和刷新

的问题

希望这有帮助

答案 1 :(得分:1)

使用此search plugin可以轻松完成所需的操作。

它可以自动实现你想要的更多或更少的东西,而且它已经比你的代码做得更多了。

所以我建议你直接使用插件或者看看它是如何做到的。 :)