2

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

4 回答 4

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 作为“虚假”条件传递基本上只是一种方便。

我就是这样做的。希望能帮助到你。

于 2013-03-01T04:43:50.287 回答
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
}

这是一种肮脏的方式,但应该可以。

于 2011-11-04T21:30:32.947 回答
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 方法中的逻辑移动到控制器中,就像上面的示例一样。

于 2011-11-05T10:22:11.733 回答
0

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

但是 CakeDC 有一个 Utils 插件包,其中包含我现在使用的 SoftDeletable 行为。https://github.com/cakedc/utils

于 2013-03-01T09:03:55.380 回答