Доступ к invalidFields из представления - PullRequest
0 голосов
/ 21 октября 2011

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

Любая идея, как получить доступ к этим данным вуровень просмотра для проверки на ошибку?Я хотел бы проверить все 3 модели, чтобы я мог отображать все ошибки одновременно, а также избегать создания ручной структуры данных и тестирования для этого.Есть ли какие-то собственные функции / данные Cake, к которым я могу получить доступ, так что это не полностью индивидуальное решение, которое я не могу использовать в более традиционных случаях?

# Controller snippet
if( $this->Proposal->Requestor->saveField( 'phone_number', $this->data['Requestor']['phone_number'] ) && $this->Proposal->Requestor->Building->saveAll( $this->data ) ) {
  # Save off the proposal and message record.
  exit( 'saved' );
}      
else {
  $this->Session->setFlash( 'We can\'t send your quote just yet. Please correct the errors below.', null, null, 'error' );
  # At this point, I may have 2 or more models with validation errors to display
}

# Snippet from an element loaded into the view
# $model = Requestor, but the condition evaluates to false
<?php if( $this->Form->isFieldError( $model . '.phone_number' ) ): ?>
  <?php echo $this->Form->error( $model . '.phone_number' ) ?>
<?php endif; ?>

Спасибо.

1 Ответ

0 голосов
/ 22 октября 2011

Это магия программного обеспечения с открытым исходным кодом.Небольшое копание в исходном коде показало мне, что $this->Form->isFieldError в конечном итоге читает из переменной представления с именем $validationErrors.При выполнении моих независимых сохранений я просто записываю в локальную переменную с тем же именем в своем действии контроллера и устанавливаю ее вручную.Таким образом, нетрадиционный процесс сопоставляется с обычными результатами, и код представления не должен распознавать какие-либо пользовательские структуры.

# Compile our validation errors from each separate
$validationErrors = array();
if( !$this->Proposal->Requestor->validates( array( 'fieldList' => array_keys( $this->data['Requestor'] ) ) ) ) {
  $validationErrors['Requestor'] = $this->Proposal->Requestor->validationErrors;
}
if( !$this->Proposal->Requestor->Building->saveAll( $this->data ) ) {
  $validationErrors = Set::merge( $validationErrors, $this->Proposal->Requestor->Building->validationErrors );
}

if( empty( $validationErrors ) ) {
  # TODO: perform any post-save actions
}
else {
  # Write the complete list of validation errors to the view
  $this->set( compact( 'validationErrors' ) );
}

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

...