我在所有内容中都有一个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进入管理路由?
答案 0 :(得分:4)
我有类似情况的经验,我使用“软删除”行为。
我的建议是检查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作为“假的”条件传递。
我就是这样做的。希望它有所帮助。
答案 1 :(得分:1)
您可以在控制器中检查管理员路线,并将其定义如下:
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
}
这是一种肮脏的方式但应该有用。
答案 2 :(得分:0)
模型没有理由知道路线是什么。它的目的是向控制器提供所要求的信息。换句话说,您必须在控制器中设置条件,而不是在模型中。
对于过于简短而感到抱歉。
您尝试做的事情违背了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()处理通过管理路由发出的索引请求,通过正常路由发出的index()请求。
您可以在控制器中决定所需的数据。您应该将beforeFind方法中的逻辑移动到控制器中,如上例所示。
答案 3 :(得分:0)
我得到的答案是将路径设置为控制器中模型中的属性,然后可以从模型中检查。
然而,CakeDC有一个Utils插件包,其中包含我现在使用的SoftDeletable行为。 https://github.com/cakedc/utils