Я хочу использовать базовую проверку CakePHP для списков в моей модели:
var $validate = array(
'selectBox' => array(
'allowedChoice' => array(
'rule' => array('inList', $listToCheck),
'message' => 'Enter something in listToCheck.'
)
)
);
Однако $listToCheck
массив является тем же массивом, это используется в представлении, для заполнения selectbox. Куда я помещаю эту функцию?
public function getList() {
return array('hi'=>'Hello','bi'=>'Goodbye','si'=>'Salutations');
}
Уже в моем контроллере, в одном из действий я устанавливаю его для представления, как:
public function actionForForm() {
$options = $this->getList();
$this->set('options', $options);
}
Так, я не хочу должным быть копировать getList()
функционируйте..., куда я могу поместить его так, Модель может назвать его для заполнения $listToCheck
массив?
Спасибо за помощь.
Учитывая, что это данные, вы должны сохранить список допустимых вариантов в модели.
class MyModel extends AppModel {
var $fieldAbcChoices = array('a' => 'The A', 'b' => 'The B', 'c' => 'The C');
}
Вы можете получить эту переменную в Контроллере просто так:
$this->set('fieldAbcs', $this->MyModel->fieldAbcChoices);
К сожалению, вы не можете просто используйте эту переменную в объявлении правила для правила inList
, поскольку правила объявлены как переменные экземпляра, и они могут быть инициализированы только статически (переменные не допускаются). Лучший способ обойти это - установить переменную в конструкторе:
var $validate = array(
'fieldAbc' => array(
'allowedChoice' => array(
'rule' => array('inList', array()),
'message' => 'Enter something in listToCheck.'
)
)
);
function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->validate['fieldAbc']['allowedChoice']['rule'][1] = array_keys($this->fieldAbcChoices);
}
Если вам неудобно переопределять конструктор, вы также можете сделать это с помощью обратного вызова beforeValidate ()
.
Также обратите внимание на что вы не должны называть свое поле "selectBox". :)