0

我在对搜索结果进行分页时遇到问题。我的设置如下。

我有一个myapp.com/searches/products带有视图的搜索表单(有搜索表单).../app/views/searches/products.ctp。我正在使用一个Searches控制器,该控制器将Product模型用于此搜索查询。Product具有search()搜索逻辑 ( $this->find(...)) 的作用。搜索结果显示在视图中的表单下方。

我该如何执行类似于$this->paginate()通常在控制器中完成的操作?此外,我想知道我的设置是否有问题,尤其是包含表单和搜索结果的视图。

4

2 回答 2

3

将搜索逻辑保留在模型中并仍然在控制器中分页的一种方法是执行以下操作:

解释:

而不是从模型返回实际结果,只需返回任何/所有 find options,然后像往常一样进行分页。find()对于一些示例,例如下面这个简单的示例,它可能看起来有点矫枉过正,但它为您的like contain, order, group, joins, ... 等添加更多选项留下了空间conditions。并且更符合“Fat Models,瘦身控制器”的口头禅。

使用这样的选项设置您find()的 s 也很不错,因此它可以在您的整个站点中轻松重复使用 - 只需传递不同的选项,您就可以开始了。

代码:

/* CONTROLLER
*/
$opts = array('paginate' => true, 'limit'=>20);
$paginateOptions = $this->Event->getEvents($opts);
$this->paginate = $paginateOptions;
$data = $this->paginate('Event');

/* MODEL
*/
public function getProducts($opts = null) {

    $params = array();

    //limit
    $params['limit'] = 50; //default
    if(!empty($opts['limit'])) $params['limit'] = $opts['limit'];

    //paginate option
    $paginate = false;
    if(isset($opts['paginate'])) {
        if($opts['paginate']) $paginate = true;
    }

    //either return the options just created (paginate)
    if($paginate) {
        return $qOpts;

    //or return the events data
    } else {
        $data = $this->find('all', $qOpts);
        return $data;
    }
}

有一些方法可以编写更苗条/更少的代码行 - 但我喜欢这样写,所以它很快就可以理解。

(您的整体结构似乎没有任何问题。)

于 2012-04-18T20:38:12.700 回答
0

我通常使用将搜索参数存储在会话中并处理控制器操作中的所有内容。

function indexbystatus() {
    $this->set('title_for_layout','List Assets by Status');
    $this->Session->write('sender',array('controller'=>'assets','action'=>'indexbystatus'));
    $searchkey=$this->Session->read('Searchkey.status');
    $conditions='';
    if($searchkey) {
        $conditions=array('Asset.status_id'=>$searchkey);
    }
    if(!empty($this->data)) {
        // if user has sent anything by the searchform set conditions and
        // store it to the session but if it is empty we delete the stored
        // searchkey (this way we can reset the search)
        if($this->data['Asset']['status_id']!='') {
            $conditions=array('Asset.status_id'=>$this->data['Asset']['status_id']);
            $this->Session->write('Searchkey.status',$this->data['Asset']['status_id']);
        } else {
            $this->Session->delete('Searchkey.status');
            $conditions=null;
        }
    } else if($searchkey) {
        // if no data from the searchform we set the stored one
        // from the session if any
        $this->data['Asset']['status_id']=$searchkey;
    }
    $this->paginate=array(
                        'limit'=>25,
                        'order'=>array('Asset.status_id'=>'asc'),
                        'conditions'=>$conditions,
                        );
    $this->set('assets',$this->paginate());
    $statuses=$this->Asset->Status->find('list');
    $this->set('statuses',$statuses);
}

我只是更喜欢在控制器动作而不是模型中处理它,所以我可以通过动作有不同的解决方案和逻辑。

于 2012-04-19T06:27:48.497 回答