diff --git a/cake/libs/view/helper.php b/cake/libs/view/helper.php index daf27b1e3..6fde18fdd 100644 --- a/cake/libs/view/helper.php +++ b/cake/libs/view/helper.php @@ -298,43 +298,116 @@ class Helper extends Overloadable { return $attribute; } /** - * Sets this helper's model and field properties to the slash-separated value-pair in $tagValue. - * - * @param string $tagValue A field name, like "Modelname.fieldname", "Modelname/fieldname" is deprecated + * @deprecated */ - function setFormTag($tagValue) { + function setFormTag($tagValue, $setScope = false) { + return $this->setEntity($tagValue, $setScope); + } +/** + * 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 + */ + function setEntity($entity, $setScope = false) { $view =& ClassRegistry::getObject('view'); - if ($tagValue === null) { + if ($setScope) { + $view->modelScope = false; + } + + if ($entity === null) { $view->model = null; $view->association = null; $view->modelId = null; + $view->modelScope = false; return; } - $parts = preg_split('/\/|\./', $tagValue); + $tmpModel = $view->model; + $parts = preg_split('/\/|\./', $entity); + $isModel = (ClassRegistry::isKeySet($parts[0]) || $parts[0] == '_Token'); + $model = ife($isModel, $parts[0], $view->model); + $hasField = false; + + if ($parts[0] == '_Token' && isset($parts[1])) { + $hasField = 1; + } elseif (!empty($model) && ClassRegistry::isKeySet($model)) { + $model =& ClassRegistry::getObject($model); + for ($i = 1; $i < count($parts); $i++) { + if ($model->hasField($parts[$i]) || array_key_exists($parts[$i], $model->validate)) { + $hasField = $i; + break; + } + } + } + $view->field = null; + $view->fieldSuffix = null; $view->association = null; - if (count($parts) == 1) { - $view->field = $parts[0]; - //} elseif (count($parts) == 2 && !ClassRegistry::isKeySet($parts[0]) && !ClassRegistry::isKeySet($parts[0])) { - } elseif (count($parts) == 2 && is_numeric($parts[0])) { - $view->modelId = $parts[0]; - $view->field = $parts[1]; - } elseif (count($parts) == 2 && empty($parts[1])) { - $view->model = $parts[0]; - $view->field = $parts[1]; - } elseif (count($parts) == 2) { - $view->association = $parts[0]; - $view->field = $parts[1]; - } elseif (count($parts) == 3) { - $view->association = $parts[0]; - $view->modelId = $parts[1]; - $view->field = $parts[2]; + if ($isModel) { + switch (count($parts)) { + case 1: + $view->modelId = null; + if ($view->modelScope) { + $view->association = $parts[0]; + } else { + $view->model = $parts[0]; + } + break; + case 2: + case 3: + if ($hasField) { + $view->field = $parts[$hasField]; + if ($view->modelScope) { + $view->association = $parts[0]; + } else { + $view->model = $parts[0]; + } + } else { + list($view->model, $view->modelId) = $parts; + } + break; + } + } else { + switch (count($parts)) { + case 1: + $view->field = $parts[0]; + $view->association = null; + break; + case 2: + case 3: + if ($hasField || $hasField === 0) { + $view->field = $parts[$hasField]; + if ($hasField == 1) { + $view->modelId = $parts[0]; + } + } elseif (!$hasField && count($parts) == 2) { + $view->field = $parts[1]; + if ($view->modelScope) { + $view->association = $parts[0]; + } else { + $view->model = $parts[0]; + } + } + break; + } } - if (!isset($view->model)) { + + if ($hasField && isset($parts[$hasField + 1])) { + $view->fieldSuffix = $parts[$hasField + 1]; + } + + if (!isset($view->model) || empty($view->model)) { $view->model = $view->association; $view->association = null; + } elseif ($view->model == $view->association) { + $view->association = null; + } + + if ($setScope) { + $view->modelScope = true; } } /** @@ -344,10 +417,10 @@ class Helper extends Overloadable { */ function model() { $view =& ClassRegistry::getObject('view'); - if ($view->association == null) { - return $view->model; - } else { + if (!empty($view->association)) { return $view->association; + } else { + return $view->model; } } /** @@ -392,14 +465,16 @@ class Helper extends Overloadable { * @return mixed */ function domId($options = null, $id = 'id') { + $view =& ClassRegistry::getObject('view'); + if (is_array($options) && !array_key_exists($id, $options)) { - $options[$id] = $this->model() . Inflector::camelize($this->field()); + $options[$id] = $this->model() . Inflector::camelize($view->field) . Inflector::camelize($view->fieldSuffix); } elseif (is_array($options) && $options[$id] === null) { unset($options[$id]); return $options; } elseif (!is_array($options)) { - $this->setFormTag($options); - return $this->model() . Inflector::camelize($this->field()); + $this->setEntity($options); + return $this->model() . Inflector::camelize($view->field) . Inflector::camelize($view->fieldSuffix); } return $options; } @@ -411,6 +486,8 @@ class Helper extends Overloadable { * @return array */ function __name($options = array(), $field = null, $key = 'name') { + $view =& ClassRegistry::getObject('view'); + if ($options === null) { $options = array(); } elseif (is_string($options)) { @@ -419,24 +496,19 @@ class Helper extends Overloadable { } if (!empty($field)) { - $this->setFormTag($field); + $this->setEntity($field); } if (is_array($options) && array_key_exists($key, $options)) { return $options; } - switch($field) { + switch ($field) { case '_method': $name = $field; break; default: - //$name = array_filter(array($this->model(), $this->field(), $this->modelID())); - $name = array_filter(array($this->model(), $this->field())); - if ($this->modelID() === 0) { - $name[] = $this->modelID(); - } - $name = 'data[' . join('][', $name) . ']'; + $name = 'data[' . join('][', $view->entity()) . ']'; break; } @@ -464,7 +536,7 @@ class Helper extends Overloadable { } if (!empty($field)) { - $this->setFormTag($field); + $this->setEntity($field); } if (is_array($options) && isset($options[$key])) { @@ -504,7 +576,7 @@ class Helper extends Overloadable { * @return array */ function __initInputField($field, $options = array()) { - $this->setFormTag($field); + $this->setEntity($field); $options = (array)$options; $options = $this->__name($options); $options = $this->value($options); @@ -646,4 +718,5 @@ class Helper extends Overloadable { } while ($oldstring != $this->__cleaned); } } + ?> \ No newline at end of file diff --git a/cake/libs/view/helpers/form.php b/cake/libs/view/helpers/form.php index 7af314b39..d93a17737 100644 --- a/cake/libs/view/helpers/form.php +++ b/cake/libs/view/helpers/form.php @@ -114,14 +114,14 @@ class FormHelper extends AppHelper { } } - $this->setFormTag($model . '.'); + $this->setEntity($model . '.', true); $append = ''; $created = $id = false; if (isset($object)) { $fields = $object->schema(); if (empty($fields)) { - trigger_error(__('(FormHelper::create) Unable to use model field data. If you are using a model without a database table, try implementing schema()', true), E_USER_WARNING); + trigger_error(__('(FormHelper::create) Unable to use model field data. If you are using a model without a database table, try implementing schema()', true), E_USER_WARNING); } $data = array( 'fields' => $fields, @@ -131,7 +131,7 @@ class FormHelper extends AppHelper { $habtm = array(); if (!empty($object->hasAndBelongsToMany)) { - foreach ($object->hasAndBelongsToMany as $alias => $assocData ) { + foreach ($object->hasAndBelongsToMany as $alias => $assocData) { $data['fields'][$alias] = array('type' => 'multiple'); } } @@ -207,7 +207,7 @@ class FormHelper extends AppHelper { if (isset($this->params['_Token']) && !empty($this->params['_Token'])) { $append .= '
'; } @@ -255,8 +255,11 @@ class FormHelper extends AppHelper { $out .= $this->secure($this->fields); $this->fields = array(); } - $this->setFormTag(null); + $this->setEntity(null); $out .= $this->Html->tags['formend']; + + $view =& ClassRegistry::getObject('view'); + $view->modelScope = false; return $this->output($out); } @@ -332,7 +335,7 @@ class FormHelper extends AppHelper { * @access public */ function isFieldError($field) { - $this->setFormTag($field); + $this->setEntity($field); return (bool)$this->tagIsInvalid(); } /** @@ -345,7 +348,7 @@ class FormHelper extends AppHelper { * @access public */ function error($field, $text = null, $options = array()) { - $this->setFormTag($field); + $this->setEntity($field); $options = am(array('wrap' => true, 'class' => 'error-message', 'escape' => true), $options); if ($error = $this->tagIsInvalid()) { @@ -476,14 +479,8 @@ class FormHelper extends AppHelper { * @return string */ function input($fieldName, $options = array()) { - $this->setFormTag($fieldName); - $options = am( - array( - 'before' => null, - 'between' => null, - 'after' => null - ), - $options); + $this->setEntity($fieldName); + $options = am(array('before' => null, 'between' => null, 'after' => null), $options); if (!isset($options['type'])) { $options['type'] = 'text'; @@ -502,7 +499,7 @@ class FormHelper extends AppHelper { if (isset($type)) { $map = array( - 'string' => 'text', 'datetime' => 'datetime', + 'string' => 'text', 'datetime' => 'datetime', 'boolean' => 'checkbox', 'timestamp' => 'datetime', 'text' => 'textarea', 'time' => 'time', 'date' => 'date' @@ -511,8 +508,8 @@ class FormHelper extends AppHelper { if (isset($map[$type])) { $options['type'] = $map[$type]; } elseif ($type === 'multiple') { - $this->setFormTag($this->field().'.'.$this->field()); $fieldName = $this->field().'.'.$this->field(); + $this->setEntity($fieldName); } if ($this->field() == $primaryKey) { $options['type'] = 'hidden'; @@ -599,6 +596,10 @@ class FormHelper extends AppHelper { } else { $labelText = $label; } + + if (isset($options['id'])) { + $labelAttributes = am($labelAttributes, array('for' => $options['id'])); + } $out = $this->label(null, $labelText, $labelAttributes); } @@ -841,6 +842,15 @@ class FormHelper extends AppHelper { * @access public */ function hidden($fieldName, $options = array()) { + /*$class = null; + if (isset($options['class'])) { + $class = $options['class']; + } + unset($options['class']); + if (!empty($class)) { + $options['class'] = $class; + }*/ + $options = $this->__initInputField($fieldName, $options); $model = $this->model(); $value = ''; @@ -1047,7 +1057,7 @@ class FormHelper extends AppHelper { if (!empty($value)) { $selected = date('d', strtotime($value)); } - return $this->select($fieldName . "_day", $this->__generateOptions('day'), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".day", $this->__generateOptions('day'), $selected, $attributes, $showEmpty); } /** * Returns a SELECT element for years @@ -1078,7 +1088,7 @@ class FormHelper extends AppHelper { if (!empty($value)) { $selected = date('Y', strtotime($value)); } - return $this->select($fieldName . "_year", $this->__generateOptions('year', $minYear, $maxYear), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".year", $this->__generateOptions('year', $minYear, $maxYear), $selected, $attributes, $showEmpty); } /** * Returns a SELECT element for months. @@ -1104,7 +1114,7 @@ class FormHelper extends AppHelper { if (!empty($value)) { $selected = date('m', strtotime($value)); } - return $this->select($fieldName . "_month", $this->__generateOptions('month'), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".month", $this->__generateOptions('month'), $selected, $attributes, $showEmpty); } /** * Returns a SELECT element for hours. @@ -1134,7 +1144,7 @@ class FormHelper extends AppHelper { } elseif (!empty($value) && !$format24Hours) { $selected = date('g', strtotime($value)); } - return $this->select($fieldName . "_hour", $this->__generateOptions($format24Hours ? 'hour24' : 'hour'), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".hour", $this->__generateOptions($format24Hours ? 'hour24' : 'hour'), $selected, $attributes, $showEmpty); } /** * Returns a SELECT element for minutes. @@ -1159,7 +1169,7 @@ class FormHelper extends AppHelper { if (!empty($value)) { $selected = date('i', strtotime($value)); } - return $this->select($fieldName . "_min", $this->__generateOptions('minute'), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".min", $this->__generateOptions('minute'), $selected, $attributes, $showEmpty); } /** * Returns a SELECT element for AM or PM. @@ -1173,7 +1183,7 @@ class FormHelper extends AppHelper { $selected = date('a', strtotime($value)); } $selected = empty($selected) ? ($showEmpty ? null : date('a')) : $selected; - return $this->select($fieldName . "_meridian", $this->__generateOptions('meridian'), $selected, $attributes, $showEmpty); + return $this->select($fieldName . ".meridian", $this->__generateOptions('meridian'), $selected, $attributes, $showEmpty); } /** * Returns a set of SELECT elements for a full datetime setup: day, month and year, and then time. @@ -1314,7 +1324,7 @@ class FormHelper extends AppHelper { } if (!empty($field)) { - $this->setFormTag($field); + $this->setEntity($field); } if (is_array($options) && isset($options[$key])) { @@ -1342,6 +1352,7 @@ class FormHelper extends AppHelper { $attributes = am(array('escape' => true), $attributes); $selectedIsEmpty = ($selected === '' || $selected === null); $selectedIsArray = is_array($selected); + foreach ($elements as $name => $title) { $htmlOptions = array(); if (is_array($title) && (!isset($title['name']) || !isset($title['value']))) { diff --git a/cake/libs/view/helpers/html.php b/cake/libs/view/helpers/html.php index 6ecc8e720..7d6d398cb 100644 --- a/cake/libs/view/helpers/html.php +++ b/cake/libs/view/helpers/html.php @@ -402,7 +402,7 @@ class HtmlHelper extends AppHelper { function radio($fieldName, $options, $inbetween = null, $htmlAttributes = array()) { trigger_error(__('(HtmlHelper::radio) Deprecated: Use FormHelper::radio instead', true), E_USER_WARNING); - $this->setFormTag($fieldName); + $this->setEntity($fieldName); $value = isset($htmlAttributes['value']) ? $htmlAttributes['value'] : $this->value($fieldName); $out = array(); @@ -671,7 +671,7 @@ class HtmlHelper extends AppHelper { */ function tagValue($fieldName) { trigger_error(sprintf(__('Method tagValue() is deprecated in %s: see Helper::value', true), get_class($this)), E_USER_NOTICE); - $this->setFormTag($fieldName); + $this->setEntity($fieldName); if (isset($this->data[$this->model()][$this->field()])) { return h($this->data[$this->model()][$this->field()]); } @@ -717,7 +717,7 @@ class HtmlHelper extends AppHelper { function tagErrorMsg($field, $text) { trigger_error(sprintf(__('Method tagErrorMsg() is deprecated in %s: see FormHelper::error', true), get_class($this)), E_USER_NOTICE); $error = 1; - $this->setFormTag($field); + $this->setEntity($field); if ($error == $this->tagIsInvalid()) { return sprintf(' ', is_array($text) ? (empty($text[$error - 1]) ? 'Error in field' : $text[$error - 1]) : $text); } else { diff --git a/cake/libs/view/view.php b/cake/libs/view/view.php index b06327e8d..099b8d16e 100644 --- a/cake/libs/view/view.php +++ b/cake/libs/view/view.php @@ -69,6 +69,12 @@ class View extends Object { * @access public */ var $action = null; +/** + * True if in scope of model-specific region + * + * @var boolean + */ + var $modelScope = false; /** * Name of current model this view context is attached to * @@ -94,9 +100,9 @@ class View extends Object { */ var $fieldSuffix = null; /** - * Name of current model ID this view context is attached to + * The current model ID this view context is attached to * - * @var string + * @var mixed */ var $modelId = null; /** @@ -555,6 +561,17 @@ class View extends Object { $this->uuids[] = $hash; return $hash; } +/** + * Returns the entity reference of the current context as an array of identity parts + * + * @return array An array containing the identity elements of an entity + */ + function entity() { + return array_filter(array( + ife($this->association, $this->association, $this->model), + $this->modelId, $this->field, $this->fieldSuffix + )); + } /** * Allows a template or element to set a variable that will be available in * a layout or other element. Analagous to Controller::set. diff --git a/cake/tests/cases/libs/view/helper.test.php b/cake/tests/cases/libs/view/helper.test.php new file mode 100755 index 000000000..8b57cce76 --- /dev/null +++ b/cake/tests/cases/libs/view/helper.test.php @@ -0,0 +1,164 @@ + + * Copyright 2005-2007, Cake Software Foundation, Inc. + * 1785 E. Sahara Avenue, Suite 490-204 + * Las Vegas, Nevada 89104 + * + * Licensed under The Open Group Test Suite License + * Redistributions of files must retain the above copyright notice. + * + * @filesource + * @copyright Copyright 2005-2007, Cake Software Foundation, Inc. + * @link https://trac.cakephp.org/wiki/Developement/TestSuite CakePHP(tm) Tests + * @package cake.tests + * @subpackage cake.tests.cases.libs + * @since CakePHP(tm) v 1.2.0.4206 + * @version $Revision: 5497 $ + * @modifiedby $LastChangedBy: gwoo $ + * @lastmodified $Date: 2007-08-07 03:44:12 -0400 (Tue, 07 Aug 2007) $ + * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License + */ +uses('view' . DS . 'view', 'view' . DS . 'helper'); + +class HelperTestPost extends Model { + + var $useTable = false; + + function schema() { + $this->_schema = array( + 'id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), + 'title' => array('type' => 'string', 'null' => false, 'default' => '', 'length' => '255'), + 'body' => array('type' => 'string', 'null' => true, 'default' => '', 'length' => ''), + 'number' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), + 'created' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => '', 'length' => null) + ); + return $this->_schema; + } +} + + +class HelperTestComment extends Model { + + var $useTable = false; + + function schema() { + $this->_schema = array( + 'id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), + 'author_id' => array('type' => 'integer', 'null' => false, 'default' => '', 'length' => '8'), + 'title' => array('type' => 'string', 'null' => false, 'default' => '', 'length' => '255'), + 'body' => array('type' => 'string', 'null' => true, 'default' => '', 'length' => ''), + 'created' => array('type' => 'date', 'null' => true, 'default' => '', 'length' => ''), + 'modified' => array('type' => 'datetime', 'null' => true, 'default' => '', 'length' => null) + ); + return $this->_schema; + } +} + +/** + * Short description for class. + * + * @package cake.tests + * @subpackage cake.tests.cases.libs + */ +class HelperTest extends UnitTestCase { + + function setUp() { + Router::reload(); + $null = null; + $this->View = new View($null); + $this->Helper = new Helper(); + ClassRegistry::addObject('HelperTestPost', new HelperTestPost()); + ClassRegistry::addObject('HelperTestComment', new HelperTestComment()); + } + + function testFormFieldNameParsing() { + ob_start(); + $this->Helper->setEntity('HelperTestPost.id'); + $this->assertFalse($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'id'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + + $this->Helper->setEntity('HelperTestComment.body'); + $this->assertFalse($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestComment'); + $this->assertEqual($this->View->field, 'body'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, null); + + $this->Helper->setEntity('HelperTestPost', true); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, null); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, null); + + $this->Helper->setEntity('id'); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'id'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, null); + + $this->Helper->setEntity('HelperTestComment.body'); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'body'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, 'HelperTestComment'); + $this->assertEqual($this->View->fieldSuffix, null); + + $this->Helper->setEntity('body'); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'body'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, null); + + $this->Helper->setEntity('5.id.time'); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'id'); + $this->assertEqual($this->View->modelId, '5'); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, 'time'); + + $this->Helper->setEntity('HelperTestComment.id.time'); + $this->assertTrue($this->View->modelScope); + $this->assertEqual($this->View->model, 'HelperTestPost'); + $this->assertEqual($this->View->field, 'id'); + $this->assertEqual($this->View->modelId, '5'); + $this->assertEqual($this->View->association, 'HelperTestComment'); + $this->assertEqual($this->View->fieldSuffix, 'time'); + + $this->Helper->setEntity(null); + $this->Helper->setEntity('ModelThatDoesntExist.field_that_doesnt_exist'); + $this->assertFalse($this->View->modelScope); + $this->assertEqual($this->View->model, 'ModelThatDoesntExist'); + $this->assertEqual($this->View->field, 'field_that_doesnt_exist'); + $this->assertEqual($this->View->modelId, null); + $this->assertEqual($this->View->association, null); + $this->assertEqual($this->View->fieldSuffix, null); + } + + function tearDown() { + unset($this->Helper, $this->View); + ClassRegistry::flush(); + } +} + +?> \ No newline at end of file diff --git a/cake/tests/cases/libs/view/helpers/form.test.php b/cake/tests/cases/libs/view/helpers/form.test.php index 6b79b9baa..3dfb6c825 100644 --- a/cake/tests/cases/libs/view/helpers/form.test.php +++ b/cake/tests/cases/libs/view/helpers/form.test.php @@ -48,15 +48,20 @@ class Contact extends CakeTestModel { var $primaryKey = 'id'; var $useTable = false; var $name = 'Contact'; + var $validate = array('non_existing' => array()); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), + 'email' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), + 'phone' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), + 'password' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), 'published' => array('type' => 'date', 'null' => true, 'default' => null, 'length' => null), 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''), 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null) ); + return $this->_schema; } } @@ -68,12 +73,16 @@ class UserForm extends CakeTestModel { var $hasMany = array('OpenidUrl' => array('className' => 'OpenidUrl', 'foreignKey' => 'user_form_id')); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'published' => array('type' => 'date', 'null' => true, 'default' => null, 'length' => null), + 'other' => array('type' => 'text', 'null' => true, 'default' => null, 'length' => null), + 'stuff' => array('type' => 'string', 'null' => true, 'default' => null, 'length' => 255), + 'something' => array('type' => 'string', 'null' => true, 'default' => null, 'length' => 255), 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''), 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null) ); + return $this->_schema; } } @@ -83,13 +92,15 @@ class OpenidUrl extends CakeTestModel { var $primaryKey = 'id'; var $name = 'OpenidUrl'; var $belongsTo = array('UserForm' => array('className' => 'UserForm', 'foreignKey' => 'user_form_id')); + var $validate = array('openid_not_registered' => array()); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'user_form_id' => array('type' => 'user_form_id', 'null' => '', 'default' => '', 'length' => '8'), 'url' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), ); + return $this->_schema; } function beforeValidate() { @@ -106,13 +117,14 @@ class ValidateUser extends CakeTestModel { var $hasOne = array('ValidateProfile' => array('className' => 'ValidateProfile', 'foreignKey' => 'user_id')); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), 'email' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''), 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null) ); + return $this->_schema; } function beforeValidate() { @@ -130,7 +142,7 @@ class ValidateProfile extends CakeTestModel { var $belongsTo = array('ValidateUser' => array('className' => 'ValidateUser', 'foreignKey' => 'user_id')); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'user_id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'full_name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), @@ -138,6 +150,7 @@ class ValidateProfile extends CakeTestModel { 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''), 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null) ); + return $this->_schema; } function beforeValidate() { @@ -155,7 +168,7 @@ class ValidateItem extends CakeTestModel { var $belongsTo = array('ValidateProfile' => array('className' => 'ValidateProfile', 'foreignKey' => 'profile_id')); function schema() { - return array( + $this->_schema = array( 'id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'profile_id' => array('type' => 'integer', 'null' => '', 'default' => '', 'length' => '8'), 'name' => array('type' => 'string', 'null' => '', 'default' => '', 'length' => '255'), @@ -163,6 +176,7 @@ class ValidateItem extends CakeTestModel { 'created' => array('type' => 'date', 'null' => '1', 'default' => '', 'length' => ''), 'updated' => array('type' => 'datetime', 'null' => '1', 'default' => '', 'length' => null) ); + return $this->_schema; } function beforeValidate() { @@ -204,11 +218,9 @@ class FormHelperTest extends CakeTestCase { function endTest($method) { parent::endTest($method); if (isset($this->Form)) { - unset($this->Form->Html); - unset($this->Form); + unset($this->Form->Html, $this->Form); } - unset($this->Controller); - unset($this->View); + unset($this->Controller, $this->View); } function testFormCreateWithSecurity() { @@ -239,9 +251,11 @@ class FormHelperTest extends CakeTestCase { function testFormSecurityFields() { $key = 'testKey'; - $fields = array('Model' => array('password', 'username', 'valid'), - '_Model' => array('valid' => '0'), - '__Token' => array('key' => $key)); + $fields = array( + 'Model' => array('password', 'username', 'valid'), + '_Model' => array('valid' => '0'), + '__Token' => array('key' => $key) + ); $this->Form->params['_Token']['key'] = $key; $result = $this->Form->secure($fields); $expected = urlencode(Security::hash(serialize($fields) . Configure::read('Security.salt'))); @@ -250,15 +264,11 @@ class FormHelperTest extends CakeTestCase { } function testFormSecuredInput() { - $fields = array('Model' => array( - '0' => 'field', - '1' => 'field2', - '2' => 'field4'), - '_Model'=> array( - 'field3' => '', - 'field4' => '0'), - '__Token'=>array( - 'key' => 'testKey')); + $fields = array( + 'Model' => array('0' => 'published', '1' => 'other', '2' => 'field4'), + '_Model' => array('field3' => '', 'field4' => '0'), + '__Token' => array('key' => 'testKey' + )); $fields = $this->__sortFields($fields); $fieldsKey = urlencode(Security::hash(serialize($fields) . Configure::read('Security.salt'))); @@ -270,29 +280,29 @@ class FormHelperTest extends CakeTestCase { $expected = '/^