Получение данных модели внутри функции обратного вызова модели CakePHP

Я пытаюсь использовать существующие данные модели внутри функции обратного вызова модели в CakePHP 2.1, но не могу заставить ее работать. Что я делаю, так это пытаюсь получить роль пользователя в обратном вызове beforeValidate() и проверить, пуста ли она. Если да, то поставлю. Обычно я делаю это так, и для первого создания записи это работает довольно хорошо.

if (empty($this->data[$this->alias]['role']))
    $this->data[$this->alias]['role'] = 'user';

Проблема в том, что каждый раз, когда существующая запись (пользователь) обновляется, роль будет устанавливаться снова.

Вопрос: Итак, как мне проверить, установлено ли уже поле role в данных записи, а не в данных сообщения (кажется, что $this->data[$this->alias] содержит только данные POST)?


person Ihre Lordschaft Jlis Ehrl    schedule 10.10.2012    source источник


Ответы (2)


Насколько я вижу, у этой проблемы есть три решения.

  1. Установите значение по умолчанию в столбце базы данных (самый простой, лучший?)
  2. Добавляйте роль к своим входам каждый раз.
  3. Найдите пользователя и добавьте роль, если она отсутствует

Первые два варианта кажутся очевидными, поэтому я просто проиллюстрирую последний.

public function beforeValidate() {
  if (!empty($this->id) {
    $this->data[$this->alias][$this->primaryKey] = $this->id;
  }
  if (!empty($this->data[$this->alias][$this->primaryKey])) {
    // user exists, check their data
    $id = $this->data[$this->alias][$this->primaryKey];
    $user = $this->find('first', array(
      'conditions' => array($this->primaryKey => $id)
    ));
    $this->data[$this->alias]['role'] = $user[$this->alias]['role'];
  }
  if (empty($this->data[$this->alias]['role'])) {
    // new user but missing a role
    $this->data[$this->alias]['role'] = 'user';
  }
  return true;
}

Этот обратный вызов проверит, был ли передан идентификатор, и если да, он найдет пользователя и заполнит поле role. Затем он проверяет наличие пустой роли и при необходимости заполняет ее значением по умолчанию. Очевидно, что чем больше у вас кода, тем больше возможностей для ошибок, поэтому я предлагаю первый вариант для значений столбцов по умолчанию.

person jeremyharris    schedule 10.10.2012
comment
Спасибо Джереми, это похоже на хорошее и чистое решение для такого поведения. - person Ihre Lordschaft Jlis Ehrl; 17.10.2012
comment
Круто, рад, что один из вариантов сработал! Помните, что первые два варианта всегда будут самыми быстрыми и наименее (потенциально) глючными. - person jeremyharris; 17.10.2012

пытаться:

if (empty($this->data[$this->alias]['role']) && empty($this->role)) {
   $this->data[$this->alias]['role'] = 'user';
}
person Grzegorz Motyl    schedule 10.10.2012
comment
Я пробовал это раньше, кроме $this->id поля всегда возвращают null. И я мог представить, что идентификатор работает, потому что я делаю $this->User->id = $id; в методе контроллера. - person Ihre Lordschaft Jlis Ehrl; 10.10.2012