Fix FormHelper::tagIsInvalid with saveMany forms.

When saving multiple records validation errors were not correctly shown.
Fudge the entity path so it matches the validation errors set in the
models.

Fixes #3828
This commit is contained in:
mark_story 2013-05-13 21:08:19 -04:00
parent bd3428e456
commit f7d106a386
2 changed files with 46 additions and 2 deletions

View file

@ -1456,11 +1456,10 @@ class FormHelperTest extends CakeTestCase {
*/
public function testTagIsInvalid() {
$Contact = ClassRegistry::getObject('Contact');
$Contact->validationErrors[0]['email'] = array('Please provide an email');
$Contact->validationErrors[0]['email'] = $expected = array('Please provide an email');
$this->Form->setEntity('Contact.0.email');
$result = $this->Form->tagIsInvalid();
$expected = array('Please provide an email');
$this->assertEquals($expected, $result);
$this->Form->setEntity('Contact.1.email');
@ -1472,6 +1471,26 @@ class FormHelperTest extends CakeTestCase {
$this->assertFalse($result);
}
/**
* Test tagIsInvalid with validation errors from a saveMany
*
* @return void
*/
public function testTagIsInvalidSaveMany() {
$Contact = ClassRegistry::getObject('Contact');
$Contact->validationErrors[0]['email'] = $expected = array('Please provide an email');
$this->Form->create('Contact');
$this->Form->setEntity('0.email');
$result = $this->Form->tagIsInvalid();
$this->assertEquals($expected, $result);
$this->Form->setEntity('0.Contact.email');
$result = $this->Form->tagIsInvalid();
$this->assertEquals($expected, $result);
}
/**
* Test validation errors.
*
@ -8486,6 +8505,24 @@ class FormHelperTest extends CakeTestCase {
$this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div'));
}
/**
* test the correct display of multi-record form validation errors.
*
* @return void
*/
public function testSaveManyRecordFormValidationErrors() {
$this->Form->create('ValidateUser');
$ValidateUser = ClassRegistry::getObject('ValidateUser');
$ValidateUser->validationErrors[0]['ValidateItem']['name'] = array('Error in field name');
$result = $this->Form->error('0.ValidateUser.ValidateItem.name');
$this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field name', '/div'));
$ValidateUser->validationErrors[0]['city'] = array('Error in field city');
$result = $this->Form->error('ValidateUser.0.city');
$this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div'));
}
/**
* tests the ability to change the order of the form input placeholder "input", "label", "before", "between", "after", "error"
*

View file

@ -272,6 +272,13 @@ class FormHelper extends AppHelper {
public function tagIsInvalid() {
$entity = $this->entity();
$model = array_shift($entity);
// 0.Model.field. Fudge entity path
if (empty($model) || is_numeric($model)) {
array_splice($entity, 1, 0, $model);
$model = array_shift($entity);
}
$errors = array();
if (!empty($entity) && isset($this->validationErrors[$model])) {
$errors = $this->validationErrors[$model];