我有一个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