diff --git a/lib/Cake/Test/Case/View/HelperTest.php b/lib/Cake/Test/Case/View/HelperTest.php index e2a8d3172..9f1365209 100644 --- a/lib/Cake/Test/Case/View/HelperTest.php +++ b/lib/Cake/Test/Case/View/HelperTest.php @@ -348,6 +348,25 @@ class HelperTest extends CakeTestCase { $this->assertEquals(array('Tag', 'Tag'), $this->Helper->entity()); } +/** + * Test that habtm associations can have property fields created. + * + * @return void + */ + public function testSetEntityHabtmPropertyFieldNames() { + $this->Helper->fieldset = array( + 'HelperTestComment' => array( + 'fields' => array('Tag' => array('type' => 'multiple')) + ) + ); + $this->Helper->setEntity('HelperTestComment', true); + + $this->Helper->setEntity('Tag.name'); + $this->assertEquals('Tag', $this->Helper->model()); + $this->assertEquals('name', $this->Helper->field()); + $this->assertEquals(array('Tag', 'name'), $this->Helper->entity()); + } + /** * test that 'view' doesn't break things. * diff --git a/lib/Cake/View/Helper.php b/lib/Cake/View/Helper.php index 8834c4de4..c2219be89 100644 --- a/lib/Cake/View/Helper.php +++ b/lib/Cake/View/Helper.php @@ -453,21 +453,21 @@ class Helper extends Object { $this->_association = null; - // habtm models are special - if ( + $isHabtm = ( isset($this->fieldset[$this->_modelScope]['fields'][$parts[0]]['type']) && - $this->fieldset[$this->_modelScope]['fields'][$parts[0]]['type'] === 'multiple' - ) { + $this->fieldset[$this->_modelScope]['fields'][$parts[0]]['type'] === 'multiple' && + $count == 1 + ); + + // habtm models are special + if ($count == 1 && $isHabtm) { $this->_association = $parts[0]; $entity = $parts[0] . '.' . $parts[0]; } else { // check for associated model. $reversed = array_reverse($parts); - foreach ($reversed as $part) { - if ( - !isset($this->fieldset[$this->_modelScope]['fields'][$part]) && - preg_match('/^[A-Z]/', $part) - ) { + foreach ($reversed as $i => $part) { + if ($i > 0 && preg_match('/^[A-Z]/', $part)) { $this->_association = $part; break; } diff --git a/lib/Cake/View/Helper/FormHelper.php b/lib/Cake/View/Helper/FormHelper.php index f4908b0aa..26c014602 100644 --- a/lib/Cake/View/Helper/FormHelper.php +++ b/lib/Cake/View/Helper/FormHelper.php @@ -196,11 +196,11 @@ class FormHelper extends AppHelper { if ($key === 'fields') { if (!isset($this->fieldset[$model]['fields'])) { $fields = $this->fieldset[$model]['fields'] = $object->schema(); - } - if (empty($field)) { foreach ($object->hasAndBelongsToMany as $alias => $assocData) { $this->fieldset[$object->alias]['fields'][$alias] = array('type' => 'multiple'); } + } + if (empty($field)) { return $this->fieldset[$model]['fields']; } elseif (isset($this->fieldset[$model]['fields'][$field])) { return $this->fieldset[$model]['fields'][$field]; @@ -445,6 +445,7 @@ class FormHelper extends AppHelper { if ($model !== false) { $this->setEntity($model, true); + $this->_introspectModel($model, 'fields'); } return $this->Html->useTag('form', $action, $htmlAttributes) . $append; } @@ -2234,24 +2235,6 @@ class FormHelper extends AppHelper { return $opt; } -/** - * Add support for special HABTM syntax. - * - * Sets this helper's model and field properties to the dot-separated value-pair in $entity. - * - * @param mixed $entity A field name, like "ModelName.fieldName" or "ModelName.ID.fieldName" - * @param boolean $setScope Sets the view scope to the model specified in $tagValue - * @return void - */ - public function setEntity($entity, $setScope = false) { - parent::setEntity($entity, $setScope); - $parts = explode('.', $entity); - $field = $this->_introspectModel($this->_modelScope, 'fields', $parts[0]); - if (!empty($field) && $field['type'] === 'multiple') { - $this->_entityPath = $parts[0] . '.' . $parts[0]; - } - } - /** * Gets the input field name for the current tag *