【问题标题】:How can I prevent search value in pagination in CakePHP如何防止 CakePHP 分页中的搜索值
【发布时间】:2012-04-06 00:53:41
【问题描述】:

我有分页代码。它工作正常。 但我添加了搜索功能。 所以问题是当我按下提交按钮时,它会显示带有分页的搜索结果。 当我点击页码页面刷新并且网格具有所有默认值时,它会丢失搜索名称。

那么如何在整个页面导航过程中防止 searchname 呢?如果我使用会话,那么我什么时候可以写入会话以及何时删除会话?

我获取所有产品的代码如下:

     $data = $this->paginate('Product');
     $this->set("Products",$data);

按条件是这样的:

   $productname = $this->data['User']['search'];
   $productname = trim($productname);

   $cond = array('Product.productname LIKE' => "%$productname%"); 
   $this->set('Products', $this->paginate("Product", $cond));

那么我可以解决我的问题吗? 谢谢

【问题讨论】:

    标签: cakephp search pagination


    【解决方案1】:

    您可以将您的搜索请求添加到这样的参数中

    $this->params['named']['search'] = urlencode(json_encode($productname));
    

    然后,产品名称将在浏览页面时可用(检查 URL,您将看到您的请求)。然后,您可以通过查看 params 数组来检索请求的产品。

    if (isset($this->params['named']['search'])) {
      $productname = json_decode(urldecode($this->params['named']['search']));
      // ...
    }
    

    编辑:示例

    // inside the index action
    
    if (isset($this->data['User']['search'])) {
        $productname = $this->data['User']['search'];
        $productname = trim($productname);
        $this->params['named']['search'] = urlencode(json_encode($productname));
    }
    
    $cond = array();
    
    if (isset($this->params['named']['search'])) {
        $productname = json_decode(urldecode($this->params['named']['search']));
        $cond = array('Product.productname LIKE' => "%$productname%");
    }
    
    $this->set('Products', $this->paginate("Product", $cond));
    

    【讨论】:

    • 你应该传递那些base64encoded的文本值。它可能会因为一些特殊的字符而失败(+ / 等)。官方 cakedc 搜索插件甚至在该区域有一个网球场大小的错误。比 sry 更安全。
    • 修复在这里:github.com/dereuromark/search/commit/… - 不管怎样@dolly:如果你想更频繁地使用搜索,你可能想看看这个插件,因为它处理得很好。跨度>
    • @dolly Il 可以放置在许多不同的地方。在你的行动中会很好。我将编辑我的答案以向您展示一个示例。
    【解决方案2】:

    您可以使用搜索名称添加分页

    在您的控制器中

    <?php
    
    $separator = array();
    $urlSeparator = array();
    $search_keyword = '';
    $cond = array();
    
    /* if user enter search keyword then  */
    if (!empty($this->request->data)) {
     if (isset($this->request->data['User']['Search']) && ($this->request->data['User']['Search'] != '')) {
        $search_keyword = $this->request->data['User']['Search'];
    }
    }
    /*if search keyword is not enter then look for pagination condition params*/
    elseif (!empty($this->request->params['named']['cond'])) {
    
    $this->request->params['named']['cond'] = strtr($this->request->params['named']['cond'], '-_, ', '+/=');
    
    $this->request->params['named']['cond'] = json_decode(base64_decode($this->request->params['named']['cond']), true);
        if (isset($this->request->params['named']['cond']['search_keyword']) &&   $this->request->params['named']['cond']['gender'] != '') {
        $search_keyword = trim($this->request->params['named']['cond']['search_keyword']);
     }
    }
    
    if(!empty($search_keyword)){
     $cond[] = "Product.productname LIKE '%" . $search_keyword . "'";
     $separator['search_keyword'] = $search_keyword;
    }
    
    
    if (!empty($this->request->params)) {
       if (isset($this->request->params["named"]["page"])) {
        $urlSeparator[] = 'page:' . $this->request->params["named"]["page"];
       }
       if (isset($this->request->params["named"]["sort"])) {
        $urlSeparator[] = 'sort:' . $this->request->params["named"]["sort"];
       }
       if (isset($this->request->params["named"]["direction"])) {
        $urlSeparator[] = 'direction:' . $this->request->params["named"]["direction"];
      }
    }
    
    $urlSeparator = implode("/", $urlSeparator);
    $this->set('separator', $separator);
    $this->set('urlSeparator', $urlSeparator);
    
    $this->set('Products', $this->paginate("Product", $cond));
    
    ?>
    

    并在视图文件中添加以下代码。

    <?php
    $this->Paginator->options(array('update' => '#div_id_for_update',
        'url' => array('controller' => 'controller_name', 'action' => 'index', "cond" => strtr(base64_encode(json_encode($separator)), '+/=', '-_,')),
    ));
    ?>
    

    请根据您的控制器名称修改上述代码。

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2015-08-13
      • 2011-08-12
      • 2012-09-22
      • 2012-06-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多