调整AppModel中的beforeFind()



我有一个status_id字段在一切管理,如果事情被发布等。我已经在我的AppModel中创建了这个来处理所有的过滤。

public function beforeFind($queryData) {
        // Force all finds to only find stuff which is live
        $queryData['conditions'][$this->alias.'.status_id'] = 1;
        return $queryData;
}

这很好,直到你进入管理路由,在这一点上你想看到所有的项目,他们被过滤。有没有办法知道你是否在管理路由从AppModel?

我在类似的情况下使用了"软删除"行为。

我的建议是检查您是否已经在status_id字段上有条件,并且只有在没有条件时才设置它。像这样:

public function beforeFind($queryData) {
    if (! isset($queryData['conditions'][$this->alias.'.status_id'])) {
        // Force all finds to only find stuff which is live
        $queryData['conditions'][$this->alias.'.status_id'] = 1;
    } elseif ($queryData['conditions'][$this->alias.'.status_id'] == 'all') {
        unset($queryData['conditions'][$this->alias.'.status_id']);
    }
    return $queryData;
}

这样,默认情况下您就具有所需的功能,并且还可以在需要时在status_id字段上使用正常条件。额外的好处是,要像在管理路由中那样忽略条件,可以使用以下命令:

    $data = $this->paginate('YourModel', array('YourModel.status_id' => 'all'));

这基本上只是一个方便,以避免必须传递所有状态id作为一个"假的"条件。

我就是这么做的。

你可以在你的控制器中检查admin路由,并像这样定义它:

App Controller:
if(isAdmin){
$queryData['conditions']['isAdmin'] = true;
}
In your AppModel:
if(!isset($queryData['conditions']['isAdmin'] & $queryData['conditions']['isAdmin'] !== true )){
$queryData['conditions'][$this->alias.'.status_id'] = 1;
        return $queryData;
} else {
       return $queryData
}

模型没有理由知道路由是什么。它的目的是向控制器提供所请求的内容。换句话说,必须在控制器中设置条件,而不是在模型中。

很抱歉,我说得太简短了。

你想做的是违背MVC设计模式的。它是处理和路由客户端发出的请求的控制器。

In your controller:
function index(){
    $data = $this->paginate('YourModel', array('YourModel.status_id' => 1));
    $this->set('data', $data);
}
function admin_index(){
    $data = $this->paginate();
    $this->set('data', $data);
}

更简洁

您正在尝试在模型中检测请求是否已从管理路由发出,这是错误的方式。控制器会自动处理。Admin_index()处理通过admin路由发出的索引请求,index()处理通过普通路由发出的请求。

在控制器中,你决定你想要什么数据。您应该将beforeFind方法中的逻辑移到控制器中,如上面的示例所示。

我得到的答案是将路由设置为来自控制器的模型中的属性,然后您可以从模型中检查。

然而CakeDC有一个Utils插件包,其中包括我现在使用的softdeleteable行为。https://github.com/cakedc/utils

最新更新