在AppModel中调整beforeFind()

时间:2011-11-04 21:16:24

标签: cakephp cakephp-2.0

我在所有内容中都有一个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进入管理路由?

4 个答案:

答案 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