From ce743c00e86bfdb828cd07ed3477503fcb6385fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Lorenzo=20Rodr=C3=ADguez?= Date: Wed, 21 Oct 2009 16:39:16 -0430 Subject: [PATCH] Expanding Helper an View functionaility to accept deep nested entitities. This allows the form helper to render inputs with arbitrary number of dot separated parts --- cake/libs/view/helper.php | 78 ++----------- cake/libs/view/view.php | 13 +++ cake/tests/cases/libs/view/helper.test.php | 4 + .../cases/libs/view/helpers/form.test.php | 106 +++++++++++++++--- 4 files changed, 121 insertions(+), 80 deletions(-) diff --git a/cake/libs/view/helper.php b/cake/libs/view/helper.php index 10ceee2c2..fed9e1deb 100644 --- a/cake/libs/view/helper.php +++ b/cake/libs/view/helper.php @@ -541,31 +541,10 @@ class Helper extends Overloadable { */ function tagIsInvalid($model = null, $field = null, $modelID = null) { $view =& ClassRegistry::getObject('view'); - foreach (array('model', 'field', 'modelID') as $key) { - if (empty(${$key})) { - ${$key} = $this->{$key}(); - } - } - $errors = $this->validationErrors; - - if (!empty($view->entityPath)) { - $check = $view->entityPath; - $path = explode('.',$check); - if (count($path) == 1 || is_numeric($path[0])) { - $check = $model . '.' . $check; - } - return Set::extract($errors,$check); - } - - if ($view->model !== $model && isset($errors[$view->model][$model])) { - $errors = $errors[$view->model]; - } - - if (!isset($modelID)) { - return empty($errors[$model][$field]) ? 0 : $errors[$model][$field]; - } else { - return empty($errors[$model][$modelID][$field]) ? 0 : $errors[$model][$modelID][$field]; + $entity = $view->entity(); + if (!empty($entity)) { + return Set::extract($errors,join('.',$entity)); } } @@ -586,8 +565,10 @@ class Helper extends Overloadable { $this->setEntity($options); return $this->domId(); } - - $dom = $this->model() . $this->modelID() . Inflector::camelize($view->field) . Inflector::camelize($view->fieldSuffix); + + $entity = $view->entity(); + $model = array_shift($entity); + $dom = $model . join('',array_map(array('Inflector','camelize'),$entity)); if (is_array($options) && !array_key_exists($id, $options)) { $options[$id] = $dom; @@ -626,18 +607,7 @@ class Helper extends Overloadable { $name = $field; break; default: - $entity = $view->entity(); - if (!empty($view->entityPath)) { - $check = $view->entityPath; - $path = explode('.',$check); - $model = $this->model(); - if ((count($path) == 1 && $model != $this->field()) || is_numeric($path[0])) { - debug($model); debug($this->field()); - array_unshift($path,$model); - } - $entity = $path; - } - $name = 'data[' . join('][', $path) . ']'; + $name = 'data[' . join('][', $view->entity()) . ']'; break; } @@ -676,35 +646,9 @@ class Helper extends Overloadable { $view =& ClassRegistry::getObject('view'); $result = null; - $modelName = $this->model(); - $fieldName = $this->field(); - $modelID = $this->modelID(); - - if (!empty($this->data) && !empty($view->entityPath)) { - $check = $view->entityPath; - $path = explode('.',$check); - if ((count($path) == 1 && $this->model() != $this->field()) || is_numeric($path[0])) { - $field = $this->model() . '.' . $check; - } - $result = Set::extract($this->data,$check); - } - - if (is_null($fieldName)) { - $fieldName = $modelName; - $modelName = null; - } - - if (isset($this->data[$fieldName]) && $modelName === null) { - $result = $this->data[$fieldName]; - } elseif (isset($this->data[$modelName][$fieldName])) { - $result = $this->data[$modelName][$fieldName]; - } elseif (isset($this->data[$fieldName]) && is_array($this->data[$fieldName])) { - if (ClassRegistry::isKeySet($fieldName)) { - $model =& ClassRegistry::getObject($fieldName); - $result = $this->__selectedArray($this->data[$fieldName], $model->primaryKey); - } - } elseif (isset($this->data[$modelName][$modelID][$fieldName])) { - $result = $this->data[$modelName][$modelID][$fieldName]; + $entity = $view->entity(); + if (!empty($this->data) && !empty($entity)) { + $result = Set::extract($this->data,join('.',$entity)); } if (is_array($result)) { diff --git a/cake/libs/view/view.php b/cake/libs/view/view.php index 0254381f6..c4599ae33 100644 --- a/cake/libs/view/view.php +++ b/cake/libs/view/view.php @@ -609,6 +609,19 @@ class View extends Object { */ function entity() { $assoc = ($this->association) ? $this->association : $this->model; + if (!empty($this->entityPath)) { + $path = explode('.',$this->entityPath); + $count = count($path); + if ( + ($count == 1 && !empty($this->association)) || + ($count == 1 && $this->model != $this->entityPath) || + ($count == 2 && !empty($this->fieldSuffix)) || + is_numeric($path[0]) + ) { + array_unshift($path,$assoc); + } + return Set::filter($path); + } return array_values(Set::filter( array($assoc, $this->modelId, $this->field, $this->fieldSuffix) )); diff --git a/cake/tests/cases/libs/view/helper.test.php b/cake/tests/cases/libs/view/helper.test.php index e5f293387..373f1712a 100644 --- a/cake/tests/cases/libs/view/helper.test.php +++ b/cake/tests/cases/libs/view/helper.test.php @@ -645,6 +645,10 @@ class HelperTest extends CakeTestCase { $this->Helper->data['HelperTestPost']['title'] = 'My Title'; $result = $this->Helper->value('title'); $this->assertEqual($result,'My Title'); + + $this->Helper->data['My']['title'] = 'My Title'; + $result = $this->Helper->value('My.title'); + $this->assertEqual($result,'My Title'); } diff --git a/cake/tests/cases/libs/view/helpers/form.test.php b/cake/tests/cases/libs/view/helpers/form.test.php index 461b8bfc2..2777aa477 100644 --- a/cake/tests/cases/libs/view/helpers/form.test.php +++ b/cake/tests/cases/libs/view/helpers/form.test.php @@ -574,7 +574,7 @@ class ValidateItem extends CakeTestModel { */ var $_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), - 'profile_id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), + '' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'name' => array('type' => 'text', 'null' => '', 'default' => '', 'length' => '255'), 'description' => array( 'type' => 'string', 'null' => '', 'default' => '', 'length' => '255' @@ -709,6 +709,8 @@ class FormHelperTest extends CakeTestCase { unset($this->Form->Html, $this->Form, $this->Controller, $this->View); Configure::write('Security.salt', $this->oldSalt); } + + /** * testFormCreateWithSecurity method @@ -1602,7 +1604,7 @@ class FormHelperTest extends CakeTestCase { '/option', '/select', '/div' - ); debug($result,true); + ); $this->assertTags($result, $expected); $result = $this->Form->input('email', array( @@ -5477,17 +5479,95 @@ class FormHelperTest extends CakeTestCase { } function testMultiRecordForm() { - $this->Form->create('ValidateProfile'); - $this->Form->validationErrors['ValidateProfile'][2]['ValidateItem'][1]['name'] = 'Error in field name'; - $result = $this->Form->error('ValidateProfile.2.ValidateItem.1.name'); - $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field name', '/div')); - - $this->Form->validationErrors['ValidateProfile'][2]['city'] = 'Error in field city'; - $result = $this->Form->error('ValidateProfile.2.city'); - $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div')); - - $result = $this->Form->error('2.city'); - $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div')); + $this->Form->create('ValidateProfile'); + $this->Form->data['ValidateProfile'][1]['ValidateItem'][2]['name'] = 'Value'; + $result = $this->Form->input('ValidateProfile.1.ValidateItem.2.name'); + $expected = array( + 'div' => array('class' => 'input textarea'), + 'label' => array('for' => 'ValidateProfile1ValidateItem2Name'), + 'Name', + '/label', + 'textarea' => array( + 'id' => 'ValidateProfile1ValidateItem2Name', + 'name' => 'data[ValidateProfile][1][ValidateItem][2][name]', + 'cols' => 30, + 'rows' => 6 + ), + 'Value', + '/textarea', + '/div' + ); + $this->assertTags($result, $expected); + + $result = $this->Form->input('ValidateProfile.1.ValidateItem.2.created',array('empty' => true)); + $expected = array( + 'div' => array('class' => 'input date'), + 'label' => array('for' => 'ValidateProfile1ValidateItem2CreatedMonth'), + 'Created', + '/label', + array('select' => array( + 'name' => 'data[ValidateProfile][1][ValidateItem][2][created][month]', + 'id' => 'ValidateProfile1ValidateItem2CreatedMonth' + ) + ), + array('option' => array('value' => '')), '', '/option', + $this->dateRegex['monthsRegex'], + '/select', '-', + array('select' => array( + 'name' => 'data[ValidateProfile][1][ValidateItem][2][created][day]', + 'id' => 'ValidateProfile1ValidateItem2CreatedDay' + ) + ), + array('option' => array('value' => '')), '', '/option', + $this->dateRegex['daysRegex'], + '/select', '-', + array('select' => array( + 'name' => 'data[ValidateProfile][1][ValidateItem][2][created][year]', + 'id' => 'ValidateProfile1ValidateItem2CreatedYear' + ) + ), + array('option' => array('value' => '')), '', '/option', + $this->dateRegex['yearsRegex'], + '/select', + '/div' + ); + $this->assertTags($result, $expected); + + $this->Form->validationErrors['ValidateProfile'][1]['ValidateItem'][2]['profile_id'] = 'Error'; + $this->Form->data['ValidateProfile'][1]['ValidateItem'][2]['profile_id'] = '1'; + $result = $this->Form->input('ValidateProfile.1.ValidateItem.2.profile_id'); + $expected = array( + 'div' => array('class' => 'input text error'), + 'label' => array('for' => 'ValidateProfile1ValidateItem2ProfileId'), + 'Profile', + '/label', + 'input' => array( + 'name' => 'data[ValidateProfile][1][ValidateItem][2][profile_id]', 'type' => 'text', + 'value' => '1', + 'id' => 'ValidateProfile1ValidateItem2ProfileId', + 'maxlength' => 8, + 'class' => 'form-error' + ), + array('div' => array('class' => 'error-message')), + 'Error', + '/div', + '/div' + ); + $this->assertTags($result, $expected,true); + } + + function testMultiRecordFormValidationErrors() { + $this->Form->create('ValidateProfile'); + $this->Form->validationErrors['ValidateProfile'][2]['ValidateItem'][1]['name'] = 'Error in field name'; + $result = $this->Form->error('ValidateProfile.2.ValidateItem.1.name'); + $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field name', '/div')); + + $this->Form->validationErrors['ValidateProfile'][2]['city'] = 'Error in field city'; + $result = $this->Form->error('ValidateProfile.2.city'); + $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div')); + + $result = $this->Form->error('2.city'); + $this->assertTags($result, array('div' => array('class' => 'error-message'), 'Error in field city', '/div')); } } ?> \ No newline at end of file