From 2dca77cbcbd738217d76128dcdc3cd9a3697dcea Mon Sep 17 00:00:00 2001 From: mark_story Date: Tue, 25 Aug 2009 23:34:19 -0400 Subject: [PATCH] Updating Scaffold to merge hasAndBelongsToMany keys when generating field lists for scaffolded forms. Fixes #48 --- cake/libs/controller/scaffold.php | 4 ++ .../cases/libs/controller/scaffold.test.php | 66 ++++++++++++++++++- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/cake/libs/controller/scaffold.php b/cake/libs/controller/scaffold.php index 84549c93878..186bf099841 100644 --- a/cake/libs/controller/scaffold.php +++ b/cake/libs/controller/scaffold.php @@ -237,6 +237,10 @@ function __scaffoldIndex($params) { * @access private */ function __scaffoldForm($action = 'edit') { + $this->controller->viewVars['scaffoldFields'] = array_merge( + $this->controller->viewVars['scaffoldFields'], + array_keys($this->ScaffoldModel->hasAndBelongsToMany) + ); $this->controller->render($action, $this->layout); $this->_output(); } diff --git a/cake/tests/cases/libs/controller/scaffold.test.php b/cake/tests/cases/libs/controller/scaffold.test.php index d7dfa7ea367..64aad9c0765 100644 --- a/cake/tests/cases/libs/controller/scaffold.test.php +++ b/cake/tests/cases/libs/controller/scaffold.test.php @@ -140,6 +140,19 @@ class ScaffoldMock extends CakeTestModel { 'foreignKey' => 'article_id', ) ); +/** + * hasAndBelongsToMany property + * + * @var string + **/ + var $hasAndBelongsToMany = array( + 'ScaffoldTag' => array( + 'className' => 'ScaffoldTag', + 'foreignKey' => 'post_id', + 'associationForeignKey' => 'tag_id', + 'joinTable' => 'posts_tags' + ) + ); } /** * ScaffoldUser class @@ -195,6 +208,21 @@ class ScaffoldComment extends CakeTestModel { ) ); } +/** + * ScaffoldTag class + * + * @package cake + * @subpackage cake.tests.cases.libs.controller + */ +class ScaffoldTag extends CakeTestModel { +/** + * useTable property + * + * @var string 'posts' + * @access public + */ + var $useTable = 'tags'; +} /** * TestScaffoldView class * @@ -226,7 +254,7 @@ class ScaffoldViewTest extends CakeTestCase { * @var array * @access public */ - var $fixtures = array('core.article', 'core.user', 'core.comment'); + var $fixtures = array('core.article', 'core.user', 'core.comment', 'core.posts_tag', 'core.tag'); /** * startTest method * @@ -559,7 +587,7 @@ class ScaffoldTest extends CakeTestCase { * @var array * @access public */ - var $fixtures = array('core.article', 'core.user', 'core.comment'); + var $fixtures = array('core.article', 'core.user', 'core.comment', 'core.posts_tag', 'core.tag'); /** * startTest method * @@ -648,6 +676,40 @@ function testScaffoldVariableSetting() { $this->assertEqual($result['pluralVar'], 'scaffoldMock'); $this->assertEqual($result['scaffoldFields'], array('id', 'user_id', 'title', 'body', 'published', 'created', 'updated')); } +/** + * test that habtm relationship keys get added to scaffoldFields. + * + * @see http://code.cakephp.org/tickets/view/48 + * @return void + **/ + function testHabtmFieldAdditionWithScaffoldForm() { + $this->Controller->action = 'edit'; + $this->Controller->here = '/scaffold_mock'; + $this->Controller->webroot = '/'; + $params = array( + 'plugin' => null, + 'pass' => array(1), + 'form' => array(), + 'named' => array(), + 'url' => array('url' =>'scaffold_mock'), + 'controller' => 'scaffold_mock', + 'action' => 'edit', + ); + //set router. + Router::reload(); + Router::setRequestInfo(array($params, array('base' => '/', 'here' => '/scaffold_mock', 'webroot' => '/'))); + $this->Controller->params = $params; + $this->Controller->controller = 'scaffold_mock'; + $this->Controller->base = '/'; + $this->Controller->constructClasses(); + ob_start(); + $Scaffold = new Scaffold($this->Controller, $params); + $result = ob_get_clean(); + $this->assertPattern('/name="data\[ScaffoldTag\]\[ScaffoldTag\]"/', $result); + + $result = $Scaffold->controller->viewVars; + $this->assertEqual($result['scaffoldFields'], array('id', 'user_id', 'title', 'body', 'published', 'created', 'updated', 'ScaffoldTag')); + } /** * test that the proper names and variable values are set by Scaffold *