validateAssociated перезаписывает ошибки связанной модели, возможная ошибка? - PullRequest
3 голосов
/ 24 января 2012

Я работаю с cakephp версии 2.0.2 и ломал голову над тем, почему при отправке формы, которая передает данные в ассоциацию моделей, не выявляются сообщения об ошибках для ассоциаций.

Я копался в классе Model для дальнейшей диагностики. Я обнаружил, что если бы основная модель для формы имела свои собственные ошибки проверки, то в возвращаемых результатах не было бы ошибок проверки для каких-либо связей:

$this->validationErrors

Но я думаю, что нашел дымящийся пистолет. В методе validateAssociated Model.php вы увидите это:

$this->validationErrors = $validationErrors;
if (isset($validationErrors[$this->alias])) {
    $this->validationErrors = $validationErrors[$this->alias];
}

В первой строке задается $this->validationErrors, которая содержит все ошибки, возникающие во всех ассоциациях. Но если $validationErrors содержит ошибки для ключа $this->alias, который является основным именем модели, то, как вы видите, $this->validationErrors перезаписывается именно на эти ошибки.

Так что возникает вопрос .... почему? Я уверен, что это ошибка. Я хочу изменить свой Model.php и думаю, что это сработает. Но я хотел показать это другим, если я сделаю что-то действительно глупое.

1 Ответ

0 голосов
/ 20 мая 2012

У меня была такая же проблема сегодня.Это так для BC.Я знаю, это отстой.Это должно быть ошибкой.Чтобы обойти это, я переформатирую ошибки валидации.

// AppModel.php

public function formatValidationErrors($models) {
    foreach($models as $model => $assoc) {
        if (is_numeric($model)) {
            $model = $assoc;
            $assoc = null;
        }
        $this->validationErrors[$model] = $this->{$model}->validationErrors;
        if ($assoc) {
            $this->{$model}->formatValidationErrors($assoc);
        }
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...