CakePhp - Раскрывающиеся списки - поиск ассоциации вызова («список») для каждого действия? - PullRequest
2 голосов
/ 12 февраля 2011

Допустим, у меня есть модель компании и контроллер компании.Внешние ключи в таблице компании включают time_zone_id, station_id, state_id, city_id.

. У меня были действия в CompaniesController для добавления, редактирования, просмотра компаний.Для добавления и редактирования мне нужны выпадающие списки всех ассоциаций внешних ключей (часовые пояса, штаты, города, станции).Таким образом, в этих действиях я пишу много следующего для каждого действия:

$this->set('cities', $this->Station->City->find('list'));
$this->set('states', $this->Station->State->find('list'));

и т. Д.

Похоже, много повторений кода.Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2011

Фильтры хороши, как в ответе webbiedave, но они могут усложниться, если у вас будет много условной логики.

Другой вариант заключается в том, что вы можете определять методы в контроллере, которые не предназначеныкак действия / представления: это обычный объект PHP после всего.Еще лучше, если вы используете PHP5, вы можете объявить эти методы закрытыми, чтобы их нельзя было принять за действия ...

Например, вы можете определить следующее в вашем контроллере:

private function _populate_dropdowns() {
    $this->set('cities', $this->Station->City->find('list'));
    $this->set('states', $this->Station->State->find('list'));
}

Затем назовите его в начале любого действия, которое нуждается в этом:

public function add() {
    $this->_populate_dropdowns();
    // ... 
    // add code
}

public function edit() {
    $this->_populate_dropdowns();
    // ... 
    // edit code
}
0 голосов
/ 12 февраля 2011

Добавьте предварительный просмотр обратного вызова, такой как afterFilter, на контроллер Companies:

function afterFilter() {
    // conditional ensures only actions that need the vars will receive them
    if (in_array($this->action, array('index', 'view', 'edit'))) {
        $this->set('cities', $this->Station->City->find('list'));
        $this->set('states', $this->Station->State->find('list'));
    }
}

afterFilter будет вызываться после каждого действия контроллера Companies.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...