Проверка допустимости модели CakePHP с массивом

Я хочу использовать базовую проверку 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 массив?

Спасибо за помощь.

5
задан atp 20 December 2009 в 01:34
поделиться

1 ответ

Учитывая, что это данные, вы должны сохранить список допустимых вариантов в модели.

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". :)

11
ответ дан 13 December 2019 в 19:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: