diff --git a/app/webroot/index.php b/app/webroot/index.php index 9ef8225db..6a4077c7f 100644 --- a/app/webroot/index.php +++ b/app/webroot/index.php @@ -24,6 +24,7 @@ if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } + /** * These defines should only be edited if you have cake installed in * a directory layout other than the way it is distributed. @@ -72,6 +73,9 @@ if (!defined('WWW_ROOT')) { // for built-in server if (php_sapi_name() == 'cli-server') { + if ($_SERVER['REQUEST_URI'] !== '/' && file_exists(WWW_ROOT . $_SERVER['REQUEST_URI'])) { + return false; + } $_SERVER['PHP_SELF'] = '/' . basename(__FILE__); } @@ -93,5 +97,6 @@ if (!empty($failed)) { App::uses('Dispatcher', 'Routing'); + $Dispatcher = new Dispatcher(); $Dispatcher->dispatch(new CakeRequest(), new CakeResponse()); diff --git a/lib/Cake/Console/Command/ServerShell.php b/lib/Cake/Console/Command/ServerShell.php index ce9272929..d4f9a929e 100644 --- a/lib/Cake/Console/Command/ServerShell.php +++ b/lib/Cake/Console/Command/ServerShell.php @@ -125,10 +125,11 @@ class ServerShell extends AppShell { return; } - $command = sprintf("php -S %s:%d -t %s", + $command = sprintf("php -S %s:%d -t %s %s", $this->_host, $this->_port, - $this->_documentRoot + $this->_documentRoot, + WEBROOT_DIR . '/index.php' ); $port = ($this->_port == self::DEFAULT_PORT) ? '' : ':' . $this->_port; diff --git a/lib/Cake/Console/Templates/skel/webroot/index.php b/lib/Cake/Console/Templates/skel/webroot/index.php index 38be5c4cd..d4ba7734a 100644 --- a/lib/Cake/Console/Templates/skel/webroot/index.php +++ b/lib/Cake/Console/Templates/skel/webroot/index.php @@ -74,6 +74,9 @@ if (!defined('WWW_ROOT')) { // for built-in server if (php_sapi_name() == 'cli-server') { + if ($_SERVER['REQUEST_URI'] !== '/' && file_exists(WWW_ROOT . $_SERVER['REQUEST_URI'])) { + return false; + } $_SERVER['PHP_SELF'] = '/' . basename(__FILE__); } diff --git a/lib/Cake/Test/Case/View/Helper/FormHelperTest.php b/lib/Cake/Test/Case/View/Helper/FormHelperTest.php index 18153647b..f061ba76d 100644 --- a/lib/Cake/Test/Case/View/Helper/FormHelperTest.php +++ b/lib/Cake/Test/Case/View/Helper/FormHelperTest.php @@ -2445,6 +2445,33 @@ class FormHelperTest extends CakeTestCase { ); $result = $this->Form->input('Contact.multiple', array('multiple' => 'checkbox', 'disabled' => $disabled, 'options' => $options)); $this->assertTags($result, $expected); + + // make sure 50 does only disable 50, and not 50f5c0cf + $options = array('50' => 'Fifty', '50f5c0cf' => 'Stringy'); + $disabled = array(50); + + $expected = array( + array('div' => array('class' => 'input select')), + array('label' => array('for' => "ContactMultiple")), + 'Multiple', + '/label', + array('input' => array('type' => 'hidden', 'name' => "data[Contact][multiple]", 'value' => '', 'id' => "ContactMultiple")), + array('div' => array('class' => 'checkbox')), + array('input' => array('type' => 'checkbox', 'name' => "data[Contact][multiple][]", 'value' => 50, 'disabled' => 'disabled', 'id' => "ContactMultiple50")), + array('label' => array('for' => "ContactMultiple50")), + 'Fifty', + '/label', + '/div', + array('div' => array('class' => 'checkbox')), + array('input' => array('type' => 'checkbox', 'name' => "data[Contact][multiple][]", 'value' => '50f5c0cf', 'id' => "ContactMultiple50f5c0cf")), + array('label' => array('for' => "ContactMultiple50f5c0cf")), + 'Stringy', + '/label', + '/div', + '/div' + ); + $result = $this->Form->input('Contact.multiple', array('multiple' => 'checkbox', 'disabled' => $disabled, 'options' => $options)); + $this->assertTags($result, $expected); } /** @@ -2996,6 +3023,31 @@ class FormHelperTest extends CakeTestCase { $this->assertTags($result, $expected); } +/** + * Tests inputs() works with plugin models + * + * @return void + */ + public function testInputsPluginModel() { + $this->loadFixtures('Post'); + App::build(array( + 'Plugin' => array(CAKE . 'Test' . DS . 'test_app' . DS . 'Plugin' . DS) + )); + CakePlugin::load('TestPlugin'); + $this->Form->request['models'] = array( + 'TestPluginPost' => array('plugin' => 'TestPlugin', 'className' => 'TestPluginPost') + ); + $this->Form->create('TestPlugin.TestPluginPost'); + $result = $this->Form->inputs(); + + $this->assertContains('data[TestPluginPost][id]', $result); + $this->assertContains('data[TestPluginPost][author_id]', $result); + $this->assertContains('data[TestPluginPost][title]', $result); + $this->assertTrue(ClassRegistry::isKeySet('TestPluginPost')); + $this->assertFalse(ClassRegistry::isKeySet('TestPlugin')); + $this->assertEquals('TestPluginPost', $this->Form->model()); + } + /** * testSelectAsCheckbox method * @@ -4221,7 +4273,7 @@ class FormHelperTest extends CakeTestCase { 'Contact' => array(), 'ContactTag' => array( array( - 'id' => 1, + 'id' => '1', 'name' => 'blue' ), array( @@ -4252,6 +4304,48 @@ class FormHelperTest extends CakeTestCase { '/select' ); $this->assertTags($result, $expected); + + // make sure only 50 is selected, and not 50f5c0cf + $this->View->viewVars['contactTags'] = array( + '1' => 'blue', + '50f5c0cf' => 'red', + '50' => 'green' + ); + $this->Form->request->data = array( + 'Contact' => array(), + 'ContactTag' => array( + array( + 'id' => 1, + 'name' => 'blue' + ), + array( + 'id' => 50, + 'name' => 'green' + ) + ) + ); + $this->Form->create('Contact'); + $result = $this->Form->input('ContactTag', array('div' => false, 'label' => false)); + $expected = array( + 'input' => array( + 'type' => 'hidden', 'name' => 'data[ContactTag][ContactTag]', 'value' => '', 'id' => 'ContactTagContactTag_' + ), + 'select' => array( + 'name' => 'data[ContactTag][ContactTag][]', 'id' => 'ContactTagContactTag', + 'multiple' => 'multiple' + ), + array('option' => array('value' => '1', 'selected' => 'selected')), + 'blue', + '/option', + array('option' => array('value' => '50f5c0cf')), + 'red', + '/option', + array('option' => array('value' => '50', 'selected' => 'selected')), + 'green', + '/option', + '/select' + ); + $this->assertTags($result, $expected); } /** diff --git a/lib/Cake/View/Helper/FormHelper.php b/lib/Cake/View/Helper/FormHelper.php index eac615994..d4cdb9b6a 100644 --- a/lib/Cake/View/Helper/FormHelper.php +++ b/lib/Cake/View/Helper/FormHelper.php @@ -329,7 +329,8 @@ class FormHelper extends AppHelper { $key = null; if ($model !== false) { - $key = $this->_introspectModel($model, 'key'); + list($plugin, $model) = pluginSplit($model, true); + $key = $this->_introspectModel($plugin . $model, 'key'); $this->setEntity($model, true); } @@ -2612,9 +2613,10 @@ class FormHelper extends AppHelper { } if ($name !== null) { + $isNumeric = is_numeric($name); if ( (!$selectedIsArray && !$selectedIsEmpty && (string)$attributes['value'] == (string)$name) || - ($selectedIsArray && in_array($name, $attributes['value'], true)) + ($selectedIsArray && in_array($name, $attributes['value'], !$isNumeric)) ) { if ($attributes['style'] === 'checkbox') { $htmlOptions['checked'] = true; @@ -2629,19 +2631,21 @@ class FormHelper extends AppHelper { if ($attributes['style'] === 'checkbox') { $htmlOptions['value'] = $name; - $disabledType = null; $hasDisabled = !empty($attributes['disabled']); if ($hasDisabled) { - $disabledType = gettype($attributes['disabled']); + $disabledIsArray = is_array($attributes['disabled']); + if ($disabledIsArray) { + $disabledIsNumeric = is_numeric($htmlOptions['value']); + } } if ( $hasDisabled && - $disabledType === 'array' && - in_array($htmlOptions['value'], $attributes['disabled']) + $disabledIsArray && + in_array($htmlOptions['value'], $attributes['disabled'], !$disabledIsNumeric) ) { $htmlOptions['disabled'] = 'disabled'; } - if ($hasDisabled && $disabledType !== 'array') { + if ($hasDisabled && !$disabledIsArray) { $htmlOptions['disabled'] = $attributes['disabled'] === true ? 'disabled' : $attributes['disabled']; }