Permalink
Browse files

Clean up URL generation.

Instead of detecting the controller based on the model names, only use
the current request. If you'd like a form to always point at a specific
URL you will need to set the action/url options, this reducess the magic
and makes FormHelper simpler to understand.

This change also makes the put/post conventions simpler. Any time the
context is not in create mode, an update will be done.
  • Loading branch information...
1 parent 17e3dbf commit 4ea06a82dda7257a74df5cbf93c0f6dede71b719 @markstory markstory committed Feb 10, 2014
Showing with 68 additions and 50 deletions.
  1. +13 −16 src/View/Helper/FormHelper.php
  2. +55 −34 tests/TestCase/View/Helper/FormHelperTest.php
@@ -274,7 +274,6 @@ public function tagIsInvalid() {
* @link http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html#options-for-create
*/
public function create($model = null, $options = []) {
- $id = $key = false;
$append = '';
if (empty($options['context'])) {
@@ -287,7 +286,7 @@ public function create($model = null, $options = []) {
$isCreate = $this->_context->isCreate();
$options = array_merge([
- 'type' => (!$isCreate && empty($options['action'])) ? 'put' : 'post',
+ 'type' => !$isCreate ? 'put' : 'post',
'action' => null,
'url' => null,
'default' => true,
@@ -297,29 +296,27 @@ public function create($model = null, $options = []) {
if ($options['action'] === null && $options['url'] === null) {
$options['action'] = $this->request->here(false);
} elseif (empty($options['url']) || is_array($options['url'])) {
- // TODO restore convention around model->controller name.
- if (empty($options['url']['controller'])) {
- $options['url']['controller'] = Inflector::underscore($this->request->params['controller']);
- }
- if (empty($options['action'])) {
- $options['action'] = $this->request->params['action'];
+ if (isset($options['action']) && empty($options['url']['action'])) {
+ $options['url']['action'] = $options['action'];
}
- $plugin = null;
- if ($this->plugin) {
- $plugin = Inflector::underscore($this->plugin);
- }
+ $plugin = $this->plugin ? Inflector::underscore($this->plugin) : null;
$actionDefaults = array(
'plugin' => $plugin,
- 'controller' => $this->_View->viewPath,
- 'action' => $options['action'],
+ 'controller' => Inflector::underscore($this->request->params['controller']),
+ 'action' => $this->request->params['action'],
);
+
$options['action'] = (array)$options['url'] + $actionDefaults;
- // TODO add primary key handling
- if (empty($options['action'][0]) && !empty($id)) {
+ $pk = $this->_context->primaryKey();
+ if (count($pk)) {
+ $id = $this->_context->val($pk[0]);
+ }
+ if (empty($options['action'][0]) && isset($id)) {
$options['action'][0] = $id;
}
+
} elseif (is_string($options['url'])) {
$options['action'] = $options['url'];
}
@@ -487,8 +487,9 @@ public function setUp() {
$this->Form = new FormHelper($this->View);
$this->Form->Html = new HtmlHelper($this->View);
- $this->Form->request = new Request('contacts/add');
- $this->Form->request->here = '/contacts/add';
+ $this->Form->request = new Request('articles/add');
+ $this->Form->request->here = '/articles/add';
+ $this->Form->request['controller'] = 'articles';
$this->Form->request['action'] = 'add';
$this->Form->request->webroot = '';
$this->Form->request->base = '';
@@ -502,6 +503,21 @@ public function setUp() {
'meridianRegex' => 'preg:/(?:<option value="(am|pm)">\\1<\/option>[\r\n]*)*/',
);
+ $this->article = [
+ 'schema' => [
+ 'id' => ['type' => 'integer'],
+ 'author_id' => ['type' => 'integer', 'null' => true],
+ 'title' => ['type' => 'string', 'null' => true],
+ 'body' => 'text',
+ 'published' => ['type' => 'string', 'length' => 1, 'default' => 'N'],
+ '_constraints' => ['primary' => ['type' => 'primary', 'columns' => ['id']]]
+ ],
+ 'required' => [
+ 'author_id' => true,
+ 'title' => true,
+ ]
+ ];
+
Configure::write('Security.salt', 'foo!');
Router::connect('/:controller', array('action' => 'index'));
Router::connect('/:controller/:action/*');
@@ -617,9 +633,8 @@ public function testCreateContextSelectionBuiltIn($data, $class) {
*
* @return void
*/
- public function testCreate() {
- $this->markTestIncomplete('Need to revisit once models work again.');
- $result = $this->Form->create('Contact');
+ public function testCreateTypeOptions() {
+ $result = $this->Form->create(false);
$encoding = strtolower(Configure::read('App.encoding'));
$expected = array(
'form' => array(
@@ -632,21 +647,21 @@ public function testCreate() {
);
$this->assertTags($result, $expected);
- $result = $this->Form->create('Contact', array('type' => 'GET'));
+ $result = $this->Form->create(false, array('type' => 'GET'));
$expected = array('form' => array(
'id' => 'ContactAddForm', 'method' => 'get', 'action' => '/contacts/add',
'accept-charset' => $encoding
));
$this->assertTags($result, $expected);
- $result = $this->Form->create('Contact', array('type' => 'get'));
+ $result = $this->Form->create(false, array('type' => 'get'));
$expected = array('form' => array(
'id' => 'ContactAddForm', 'method' => 'get', 'action' => '/contacts/add',
'accept-charset' => $encoding
));
$this->assertTags($result, $expected);
- $result = $this->Form->create('Contact', array('type' => 'put'));
+ $result = $this->Form->create(false, array('type' => 'put'));
$expected = array(
'form' => array(
'id' => 'ContactAddForm', 'method' => 'post', 'action' => '/contacts/add',
@@ -658,7 +673,19 @@ public function testCreate() {
);
$this->assertTags($result, $expected);
- $result = $this->Form->create('Contact', array('type' => 'file'));
+ $result = $this->Form->create(false, array('type' => 'patch'));
+ $expected = array(
+ 'form' => array(
+ 'method' => 'post', 'action' => '/articles/add',
+ 'accept-charset' => $encoding
+ ),
+ 'div' => array('style' => 'display:none;'),
+ 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'PATCH'),
+ '/div'
+ );
+ $this->assertTags($result, $expected);
+
+ $result = $this->Form->create(false, array('type' => 'file'));
$expected = array(
'form' => array(
'id' => 'ContactAddForm', 'method' => 'post', 'action' => '/contacts/add',
@@ -669,11 +696,17 @@ public function testCreate() {
'/div'
);
$this->assertTags($result, $expected);
+ }
- $this->Form->request->data['Contact']['id'] = 1;
- $this->Form->request->here = '/contacts/edit/1';
- $this->Form->request['action'] = 'edit';
- $result = $this->Form->create('Contact');
+/**
+ * Test opening a form for an update operation.
+ *
+ * @return void
+ */
+ public function testCreateUpdateForm() {
+ $encoding = strtolower(Configure::read('App.encoding'));
+
+ $result = $this->Form->create($this->article);
$expected = array(
'form' => array(
'id' => 'ContactEditForm', 'method' => 'post', 'action' => '/contacts/edit/1',
@@ -688,7 +721,7 @@ public function testCreate() {
$this->Form->request->data['Contact']['id'] = 1;
$this->Form->request->here = '/contacts/edit/1';
$this->Form->request['action'] = 'edit';
- $result = $this->Form->create('Contact', array('type' => 'file'));
+ $result = $this->Form->create($this->article, array('type' => 'file'));
$expected = array(
'form' => array(
'id' => 'ContactEditForm', 'method' => 'post', 'action' => '/contacts/edit/1',
@@ -726,48 +759,36 @@ public function testCreate() {
$this->assertTags($result, $expected);
$this->Form->request['action'] = 'add';
- $result = $this->Form->create('User', array('url' => array('action' => 'login')));
- $expected = array(
- 'form' => array(
- 'id' => 'UserAddForm', 'method' => 'post', 'action' => '/users/login',
- 'accept-charset' => $encoding
- ),
- 'div' => array('style' => 'display:none;'),
- 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'POST'),
- '/div'
- );
- $this->assertTags($result, $expected);
-
- $result = $this->Form->create('User', array('action' => 'login'));
+ $result = $this->Form->create($this->article, array('url' => array('action' => 'publish')));
$expected = array(
'form' => array(
- 'id' => 'UserLoginForm', 'method' => 'post', 'action' => '/users/login',
+ 'method' => 'post', 'action' => '/articles/publish/1',
'accept-charset' => $encoding
),
'div' => array('style' => 'display:none;'),
- 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'POST'),
+ 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'PUT'),
'/div'
);
$this->assertTags($result, $expected);
- $result = $this->Form->create('User', array('url' => '/users/login'));
+ $result = $this->Form->create($this->article, array('url' => '/articles/publish'));
$expected = array(
'form' => array('method' => 'post', 'action' => '/users/login', 'accept-charset' => $encoding, 'id' => 'UserAddForm'),
'div' => array('style' => 'display:none;'),
- 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'POST'),
+ 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'PUT'),
'/div'
);
$this->assertTags($result, $expected);
$this->Form->request['controller'] = 'pages';
- $result = $this->Form->create('User', array('action' => 'signup'));
+ $result = $this->Form->create($this->article, array('action' => 'signup'));
$expected = array(
'form' => array(
- 'id' => 'UserSignupForm', 'method' => 'post', 'action' => '/users/signup',
+ 'method' => 'post', 'action' => '/pages/signup/1',
'accept-charset' => $encoding
),
'div' => array('style' => 'display:none;'),
- 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'POST'),
+ 'input' => array('type' => 'hidden', 'name' => '_method', 'value' => 'PUT'),
'/div'
);
$this->assertTags($result, $expected);

0 comments on commit 4ea06a8

Please sign in to comment.