6

我看到此分页无法同时对两列进行排序票证仍处于打开状态,这使我相信如果没有解决方法,我正在尝试做的事情是不可能的。所以我想我正在寻找的是一种解决方法。

我正在尝试做许多留言板所做的事情:具有“ sticky”功能。我想让它无论用户单击哪个表头链接进行排序,我的模型的“ sticky”字段始终是排序的第一件事,然后是用户单击的任何列。我知道你可以设置$this->paginate['Model']['order']任何你想要的,所以你可以破解它,把“ sticky”字段放在第一位,用户选择的列放在第二位。这种方法的问题是分页在您执行后无法正常运行。表头链接不能正常工作,切换页面也不能正常工作。还有其他解决方法吗?

4

4 回答 4

16

CakePHP IRC 频道上的用户 ten1 帮助我找到了解决方案。我告诉他,如果他在这里发布答案,那么我会将其标记为正确答案,但他说我应该自己做,因为他还没有 Stack Overflow 帐户。

诀窍是使用模型的“beforeFind”回调方法将“粘性”字段注入查询的“订单”设置,如下所示:

public function beforeFind($queryData) {
    $sticky = array('Model.sticky' => 'DESC');

    if (is_array($queryData['order'][0])) {
        $queryData['order'][0] = $sticky + $queryData['order'][0];
    }
    else {
        $queryData['order'][0] = $sticky;
    }

    return $queryData;
}
于 2012-12-12T16:14:27.797 回答
0

您可以做的是在操作中对其进行编码。当 URL 上存在某些参数时,只需创建所需的查询。(参数必须通过 GET 发送)

例如:

public function posts(){
    $optional= array();

    if(!empty($this->params->query['status'])){
                if(strlower($this->params->query['status']=='des')){
        $optional= array('Post.status DESC');
                }

                else if(strlower($this->params->query['status']=='asc')){
                    $optional= array('Post.status ASC');
                }
    }

    if(!empty($this->params->query['department'])){         
        //same...
    }

    //order first by the sticky field and then by the optional parameters.
    $order = array('Post.stickyField DESC') + $optional;


    $this->paginate = array(
            'conditions' => $conditions,
            'order' => $order,
            'paramType' => 'querystring',

    );

    $this->set('posts', $this->paginate('Post'));
}

我使用了类似的东西来过滤一些数据,$conditions而不是使用$order它,它运行良好。

于 2012-12-12T09:40:16.507 回答
0

您可以使用自定义字段进行排序和更新分页组件。

控制器代码

$order['Document.DATE'] = 'asc';

        $this->paginate = array(

                "conditions"=> $conditions ,
                "order" => $order ,
                "limit" => 10,
            **"sortcustom" => array('field' =>'Document.DATE' , 'direction' =>'desc'),**

            );

分页组件的变化。

公共函数 validateSort($object, $options, $whitelist = array()) {

    if (isset($options['sort'])) {
        $direction = null;
        if (isset($options['direction'])) {
            $direction = strtolower($options['direction']);
        }
        if ($direction != 'asc' && $direction != 'desc') {
            $direction = 'asc';
        }
        $options['order'] = array($options['sort'] => $direction);
    }

    if (!empty($whitelist) && isset($options['order']) && is_array($options['order'])) {
        $field = key($options['order']);
        if (!in_array($field, $whitelist)) {
            $options['order'] = null;
        }
    }

    if (!empty($options['order']) && is_array($options['order'])) {
        $order = array();
        foreach ($options['order'] as $key => $value) {
            $field = $key;
            $alias = $object->alias;
            if (strpos($key, '.') !== false) {
                list($alias, $field) = explode('.', $key);
            }

            if ($object->hasField($field)) {
                $order[$alias . '.' . $field] = $value;
            } elseif ($object->hasField($key, true)) {
                $order[$field] = $value;
            } elseif (isset($object->{$alias}) && $object->{$alias}->hasField($field, true)) {
                $order[$alias . '.' . $field] = $value;
            }
        }


        **if(count($options['sortcustom']) > 0 )
          {
            $order[$options['sortcustom']['field']] = $options['sortcustom']['direction']; 
          }**


        $options['order'] = $order;
    }

    return $options;
}
于 2013-04-16T10:50:35.663 回答
0

轻松插入'paramType' => 'querystring', 显示代码示例:

$this->paginate = array(
    'conditions' => $conditions,
    'order' => array(
        'Post.name' => 'ASC',
        'Post.created' => 'DESC',

    ),
    'paramType' => 'querystring',

);

$this->set('posts', $this->paginate('Post'));
于 2015-08-11T04:20:20.567 回答