2012-05-02 4 views
0

Я пытаюсь установить поле «на лету» внутри модели, поэтому оно будет возвращено в моем случае с любым действием чтения. Я просмотрел виртуальные поля, но они не совсем правы, поскольку они в основном выполняют SQL-запросы.Программная установка поля внутри модели в CakePHP

В этом примере я пытаюсь вернуть значение, основанное на простой проверке, чтобы узнать, активировал ли пользователь свою учетную запись или нет. Внутри моей модели, я хочу, чтобы запустить эту функцию:

public function status() { 
    if ($this->field('password')) { 
     return = 'active'; 
    } else if ($this->Ticket->field('id')) { 
     return = 'pending'; 
    } else { 
     return = 'inactive'; 
    } 
} 

Цель состоит в том, чтобы получить доступ, что на мой взгляд, с помощью $ пользователя [ «User»] [ «статус»], так что я мог бы применить стили CSS, и т.д., основанный на результате.

Но это между установкой $ this ['User'] ['status'] = status() ускользает от меня прямо сейчас.

Кроме того, поскольку я читаю список пользователей по-разному (иногда с разбивкой на страницы или одним пользователем за раз), это не то, что я хочу установить в своем контроллере. Я хочу, чтобы свойство просто отображалось в модели при чтении.

ответ

2

Как насчет делать вашу логику и добавляет его результатов в afterFind обратного вызова? (Который - на его имя срабатывает после того, как вы делаете find()) Что-то вроде этого:

//User model 
public function afterFind($results) { 

    if ($this->field('password')) { 
     $results[$this->alias]['status'] = 'active'; 

    } else if ($this->Ticket->field('id')) { 
     $results[$this->alias]['status'] = 'pending'; 

    } else { 
     $results[$this->alias]['status'] = 'inactive'; 
    } 
} 
+0

Хм ... по какой-то причине это дает мне ошибку: Фатальная ошибка: Разрешены памяти размером 33554432 байт исчерпаны (пытался выделить 523800 байт) –

+1

Похоже, что у вас слишком рекурсивный набор. Я рекомендую установить 'public $ recursive = -1;' в вашем AppModel, а затем изменить его только тогда, когда вам НЕОБХОДИМО это выше (хотя я не думаю, что использование рекурсивного - хорошая идея - вместо этого следует использовать Containable) – Dave

0

Попробуйте это в обратный вызов, где вы хотите, чтобы вызвать функцию состояния:

$this->data[$this->alias]['status'] = $this->status(); 
Смежные вопросы