В CakePHP, как я могу получить доступ к полям модели внутри пользовательских проверок других полей модели? - PullRequest
0 голосов
/ 17 октября 2018

У меня есть модель в cakephp 1.3.Я хочу настроить пользовательскую проверку для моего поля example_id, в котором используется значение поля example_type.Я хочу, чтобы проверка завершилась неудачно, если example_type - это определенный тип (1, а не 2 или 3).

Вот пример переменной проверки:

var $validate = array(
    'example_type' => array(
        'notempty' => array(
            'rule' => array('notempty'),
            'message' => 'Example Type: This is a required field'
        ),
        'numeric' => array(
            'rule' => array('numeric'),
            'message' => 'Example Type: Please choose from the drop down.'
        ),
        'isSpecificType' => array(
            'rule' => array('isSpecificType')
        )
    ),
    'example_id' => array(
        'range' => array(
            'rule' => array('range', -1, 2147483648),
            'message' => 'Example ID: Enter number from 0 to 2147483647',
            'allowEmpty' => true
        ),
        'numeric' => array(
            'rule' => array('numeric'),
            'message' => 'Example ID: Numeric only.',
            'allowEmpty' => true
        ),
        'is_type' => array(
            'rule' => array('exampleNotEmpty', $specific_type_var),
            'message' => 'Example ID: You must have an example id if the example type is 1'
        )
    )
);

Тогда я собирался получитьдве пользовательские функции проверки, isSpecificType и exampleNotEmpty.Смотрите следующее:

function isSpecificType($check) {
    $specific_type_var = $check['example_type'];
    return true;
};

function exampleNotEmpty($check, $type) {
    if ($type === 1) {
        if (is_null($check['example_id'])) {
            return false; //by the way, i realize is_null may not be correct here, but I have the capability to correct this after I am able to run it a few times
        }
    }
    return true;
};

Наконец, в верхней части моей AppModel, непосредственно перед объявлением $ validate, я сделал переменную $ specific_type_var.Смотрите следующее:

var $specific_type_var = 1;

Итак, теперь моя проблема.В этой строке я получаю сообщение об ошибке:

'rule' => array('exampleNotEmpty', $specific_type_var),

Ошибка: Ошибка синтаксического анализа: синтаксическая ошибка, непредвиденный '$ specific_type_var' (T_VARIABLE), ожидающий ')' в / cakephpproject / app / models / example.php on line ##

Мои последние вопросы в этом посте: правильно ли я поступаю?У меня просто есть синтаксическая ошибка?Или я могу получить доступ к полю example_type непосредственно из пользовательской функции проверки, которая вызывается другим полем?Возможно ли то, что я делаю, даже в модели, или я должен сделать это на уровне контроллера?

1 Ответ

0 голосов
/ 18 октября 2018

У меня было несколько проблем.Один из них - как использовать переменные в модели CakePHP.Во-вторых, как передать поля в пользовательские валидаторы другого поля, используя эти переменные.В-третьих, как передать пустые поля пользовательским валидаторам.

Ответ на первый вопрос: переопределение конструктора позволяет добавлять переменные в модель.

public function __construct($id = false, $table = null, $ds = null){
    parent::__construct($id, $table, $ds);
    $this->example_type_var = 1;
}

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

var $validate = array(
    'example_type' => array(
        'updateActionne' => array(
            'rule' => array('_updateTheOleType')
        )
    )
)

Затем в пользовательском валидаторе:

function _updateTheOleType($check) {
    $this->example_type_var = $check['example_type'];
    return true;
}

Во втором пользовательском валидаторе снова используйте $ this-> example_type_var.Смотрите следующее:

function _exampleNotEmpty($check) {
    if ($this->example_type_var === '3') {
        if (empty($check['example_id']) && $check['example_id'] !== '0') {
            return false;
        }
    }
    return true;
}

Ответ на третий вопрос: я ошибочно подумал, что allowEmpty - это то, что мне нужно для передачи пустого поля в пользовательский валидатор.Это не так, как это работает.AllowEmpty, установленный в true, означает, что пустые поля возвращают true в правиле.Ваш пользовательский валидатор даже не запустится.AllowEmpty, установленный в false, означает, что пустые поля не пройдут проверку, опять же, даже не заходя в пользовательскую функцию проверки правила.Требуется правильный атрибут.Установка значения true заставляет правило всегда выполняться.

Неправильно:

var $validate = array(
    'example_id' => array(
        'exampleNotEmpty' => array(
            'rule' => array('_exampleNotEmpty'),
            'message' => 'Example ID: You must have an example ID if the event is example type.',
            'allowEmpty' => true
        )
    )
)

Неправильно:

var $validate = array(
    'example_id' => array(
        'exampleNotEmpty' => array(
            'rule' => array('_exampleNotEmpty'),
            'message' => 'Example ID: You must have an example ID if the event is example type.',
            'allowEmpty' => false
        )
    )
)

Правильно:

var $validate = array(
    'example_id' => array(
        'exampleNotEmpty' => array(
            'rule' => array('_exampleNotEmpty'),
            'message' => 'Example ID: You must have an example ID if the event is example type.',
            'required' => true
        )
    )
)
...