Настройка beforeFind () в AppModel - PullRequest
2 голосов
/ 05 ноября 2011

У меня есть поле 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 голосов
/ 01 марта 2013

У меня есть опыт в аналогичной ситуации, когда я использую поведение "мягкого удаления".

Я рекомендую проверить, есть ли у вас условие в поле 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'));

По сути, это просто удобство, позволяющее избежать передачи всех идентификаторов состояния в качестве условия "фальшивки".

Вот как бы я это сделал. Надеюсь, это поможет.

1 голос
/ 05 ноября 2011

Вы можете проверить маршрут администратора в вашем контроллере и определить его следующим образом:

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
}

Это грязный способ, но он должен работать.

0 голосов
/ 01 марта 2013

Ответ, который у меня есть, заключается в том, чтобы установить маршрут в качестве атрибута в модели из контроллера, который затем можно проверить из модели.

Однако у CakeDC есть плагин Utils, который включает в себя поведение SoftDeletable, которое я сейчас использую. https://github.com/cakedc/utils

0 голосов
/ 05 ноября 2011

модель не знает, каков маршрут. Его цель - снабдить контроллер запросами. Другими словами, вы должны установить условие в контроллере, а не в модели.

Извините, что был слишком кратким.

То, что вы пытаетесь сделать, противоречит шаблону проектирования 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, в контроллер, как в примере выше.

...