diff --git a/UPGRADE-2.1.md b/UPGRADE-2.1.md
index 8d13a18f4b..c365f1e978 100644
--- a/UPGRADE-2.1.md
+++ b/UPGRADE-2.1.md
@@ -79,40 +79,45 @@ UPGRADE FROM 2.0 to 2.1
the parent form.
* In the template of the choice type, instead of a single "choices" variable
- there are now two variables: "choices" and "choice_labels".
- "choices" contains the choices in the values (before they were in the keys)
- and "choice_labels" contains the matching labels. Both arrays have
- identical keys.
+ there are now two variables: "choices" and "choice_labels"
+
+ "choices" contains the choices in the values (before they were in the keys)
+ and "choice_labels" contains the matching labels. Both arrays have
+ identical keys.
- Before:
+ Before:
- {% for choice, label in choices %}
-
- {% endfor %}
+ {% for choice, label in choices %}
+
+ {% endfor %}
- After:
+ After:
- {% for index, choice in choices %}
-
- {% endfor %}
+ {% for index, choice in choices %}
+
+ {% endfor %}
* The strategy for generating the HTML attributes "id" and "name"
- of choices in a choice field has changed. Instead of appending the choice
- value, a generated integer is now appended by default. Take care if your
- Javascript relies on that. If you can guarantee that your choice values only
- contain ASCII letters, digits, letters, colons and underscores, you can
- restore the old behaviour by setting the option "index_strategy" of the
- choice field to `ChoiceList::COPY_CHOICE`.
+ of choices in a choice field has changed
+
+ Instead of appending the choice value, a generated integer is now appended
+ by default. Take care if your Javascript relies on that. If you can
+ guarantee that your choice values only contain ASCII letters, digits,
+ letters, colons and underscores, you can restore the old behaviour by
+ setting the option "index_strategy" of the choice field to
+ `ChoiceList::COPY_CHOICE`.
* The strategy for generating the HTML attributes "value" of choices in a
- choice field has changed. Instead of using the choice value, a generated
- integer is now stored. Again, take care if your Javascript reads this value.
- If your choice field is a non-expanded single-choice field, or if
- the choices are guaranteed not to contain the empty string '' (which is the
- case when you added it manually or when the field is a single-choice field
- and is not required), you can restore the old behaviour by setting the
- option "value_strategy" to `ChoiceList::COPY_CHOICE`.
+ choice field has changed
+
+ Instead of using the choice value, a generated integer is now stored.
+ Again, take care if your Javascript reads this value. If your choice field
+ is a non-expanded single-choice field, or if the choices are guaranteed not
+ to contain the empty string '' (which is the case when you added it manually
+ or when the field is a single-choice field and is not required), you can
+ restore the old behaviour by setting the option "value_strategy" to
+ `ChoiceList::COPY_CHOICE`.
diff --git a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php
index ddda8141a3..34a73d1a03 100644
--- a/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php
+++ b/src/Symfony/Bridge/Doctrine/Form/ChoiceList/EntityChoiceList.php
@@ -386,7 +386,7 @@ class EntityChoiceList extends ObjectChoiceList
// The third parameter $preferredChoices is currently not supported
parent::initialize($entities, array(), array());
} catch (StringCastException $e) {
- throw new StringCastException('Objects in the entity field must have a "__toString()" method defined. Alternatively you can set the "property" option.', null, $e);
+ throw new StringCastException(str_replace('argument $labelPath', 'option "property"', $e->getMessage()), null, $e);
}
$this->loaded = true;
diff --git a/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php b/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php
index 94ff98359e..2fa93356e4 100644
--- a/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php
+++ b/src/Symfony/Bridge/Doctrine/Form/DataTransformer/CollectionToArrayTransformer.php
@@ -26,9 +26,9 @@ class CollectionToArrayTransformer implements DataTransformerInterface
/**
* Transforms a collection into an array.
*
- * @param Collection|object $collection A collection of entities, a single entity or NULL
+ * @param Collection $collection A collection of entities
*
- * @return mixed An array of choice keys, a single key or NULL
+ * @return mixed An array of entities
*/
public function transform($collection)
{
@@ -46,9 +46,9 @@ class CollectionToArrayTransformer implements DataTransformerInterface
/**
* Transforms choice keys into entities.
*
- * @param mixed $keys An array of keys, a single key or NULL
+ * @param mixed $keys An array of entities
*
- * @return Collection|object A collection of entities, a single entity or NULL
+ * @return Collection A collection of entities
*/
public function reverseTransform($array)
{
diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php
index f77eb205be..9605d211ce 100644
--- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php
+++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ChoiceList.php
@@ -19,7 +19,7 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException;
*
* @author Bernhard Schussek
*/
-abstract class ChoiceList implements ChoiceListInterface
+class ChoiceList implements ChoiceListInterface
{
/**
* Strategy creating new indices/values by creating a copy of the choice.
@@ -132,8 +132,7 @@ abstract class ChoiceList implements ChoiceListInterface
* @param integer $indexStrategy The strategy used to create choice indices.
* One of COPY_CHOICE and GENERATE.
*/
- public function __construct($choices, array $labels,
- array $preferredChoices = array(), $valueStrategy, $indexStrategy)
+ public function __construct($choices, array $labels, array $preferredChoices = array(), $valueStrategy = self::GENERATE, $indexStrategy = self::GENERATE)
{
$this->valueStrategy = $valueStrategy;
$this->indexStrategy = $indexStrategy;
@@ -152,10 +151,6 @@ abstract class ChoiceList implements ChoiceListInterface
*/
protected function initialize($choices, array $labels, array $preferredChoices)
{
- if (!is_array($choices) && !$choices instanceof \Traversable) {
- throw new UnexpectedTypeException($choices, 'array or \Traversable');
- }
-
$this->choices = array();
$this->values = array();
$this->labels = array();
@@ -277,7 +272,7 @@ abstract class ChoiceList implements ChoiceListInterface
// If the values are identical to the choices, we can just return them
// to improve performance a little bit
- if ($this->valueStrategy === self::COPY_CHOICE) {
+ if (self::COPY_CHOICE === $this->valueStrategy) {
return $this->fixChoices(array_intersect($values, $this->values));
}
@@ -289,7 +284,7 @@ abstract class ChoiceList implements ChoiceListInterface
$choices[] = $this->choices[$i];
unset($values[$j]);
- if (count($values) === 0) {
+ if (0 === count($values)) {
break 2;
}
}
@@ -314,7 +309,7 @@ abstract class ChoiceList implements ChoiceListInterface
// If the values are identical to the choices, we can just return them
// to improve performance a little bit
- if ($this->valueStrategy === self::COPY_CHOICE) {
+ if (self::COPY_CHOICE === $this->valueStrategy) {
return $this->fixValues(array_intersect($choices, $this->choices));
}
@@ -326,7 +321,7 @@ abstract class ChoiceList implements ChoiceListInterface
$values[] = $this->values[$i];
unset($choices[$j]);
- if (count($choices) === 0) {
+ if (0 === count($choices)) {
break 2;
}
}
@@ -356,7 +351,7 @@ abstract class ChoiceList implements ChoiceListInterface
$indices[] = $i;
unset($choices[$j]);
- if (count($choices) === 0) {
+ if (0 === count($choices)) {
break 2;
}
}
@@ -386,7 +381,7 @@ abstract class ChoiceList implements ChoiceListInterface
$indices[] = $i;
unset($values[$j]);
- if (count($values) === 0) {
+ if (0 === count($values)) {
break 2;
}
}
@@ -413,6 +408,10 @@ abstract class ChoiceList implements ChoiceListInterface
*/
protected function addChoices(&$bucketForPreferred, &$bucketForRemaining, $choices, $labels, array $preferredChoices)
{
+ if (!is_array($choices) && !$choices instanceof \Traversable) {
+ throw new UnexpectedTypeException($choices, 'array or \Traversable');
+ }
+
// Add choices to the nested buckets
foreach ($choices as $group => $choice) {
if (is_array($choice)) {
@@ -537,7 +536,7 @@ abstract class ChoiceList implements ChoiceListInterface
*/
protected function createIndex($choice)
{
- if ($this->indexStrategy === self::COPY_CHOICE) {
+ if (self::COPY_CHOICE === $this->indexStrategy) {
return $choice;
}
@@ -555,7 +554,7 @@ abstract class ChoiceList implements ChoiceListInterface
*/
protected function createValue($choice)
{
- if ($this->valueStrategy === self::COPY_CHOICE) {
+ if (self::COPY_CHOICE === $this->valueStrategy) {
return $choice;
}
diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ComplexChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ComplexChoiceList.php
deleted file mode 100644
index 3528042387..0000000000
--- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ComplexChoiceList.php
+++ /dev/null
@@ -1,44 +0,0 @@
-
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Symfony\Component\Form\Extension\Core\ChoiceList;
-
-use Symfony\Component\Form\Util\FormUtil;
-
-use Symfony\Component\Form\Exception\UnexpectedTypeException;
-
-/**
- * A choice list that can store arbitrary scalar and object choices.
- *
- * Arrays as choices are not supported.
- *
- * @author Bernhard Schussek
- */
-class ComplexChoiceList extends ChoiceList
-{
- /**
- * Creates a new complex choice list.
- *
- * @param array $choices The array of choices. Choices may also be given
- * as hierarchy of unlimited depth. Hierarchies are
- * created by creating nested arrays. The title of
- * the sub-hierarchy can be stored in the array
- * key pointing to the nested array.
- * @param array $labels The array of labels. The structure of this array
- * should match the structure of $choices.
- * @param array $preferredChoices A flat array of choices that should be
- * presented to the user with priority.
- */
- public function __construct(array $choices, array $labels, array $preferredChoices = array())
- {
- parent::__construct($choices, $labels, $preferredChoices, self::GENERATE, self::GENERATE);
- }
-}
diff --git a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php
index 08225ba6a0..f5ea145437 100644
--- a/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php
+++ b/src/Symfony/Component/Form/Extension/Core/ChoiceList/ObjectChoiceList.php
@@ -121,7 +121,7 @@ class ObjectChoiceList extends ChoiceList
$group = null;
}
- if ($group === null) {
+ if (null === $group) {
$groupedChoices[$i] = $choice;
} else {
if (!isset($groupedChoices[$group])) {
@@ -194,7 +194,7 @@ class ObjectChoiceList extends ChoiceList
} elseif (method_exists($choice, '__toString')) {
$labels[$i] = (string) $choice;
} else {
- throw new StringCastException('Objects passed to the choice field must have a "__toString()" method defined. Alternatively you can set the $labelPath argument to choose the property used as label.');
+ throw new StringCastException('A "__toString()" method was not found on the objects of type "' . get_class($choice) . '" passed to the choice field. To read a custom getter instead, set the argument $labelPath to the desired property path.');
}
}
}
diff --git a/tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ComplexChoiceListTest.php b/tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ChoiceListTest.php
similarity index 95%
rename from tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ComplexChoiceListTest.php
rename to tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ChoiceListTest.php
index 4b61c16df3..9dc537a6ee 100644
--- a/tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ComplexChoiceListTest.php
+++ b/tests/Symfony/Tests/Component/Form/Extension/Core/ChoiceList/ChoiceListTest.php
@@ -11,9 +11,9 @@
namespace Symfony\Tests\Component\Form\Extension\Core\ChoiceList;
-use Symfony\Component\Form\Extension\Core\ChoiceList\ComplexChoiceList;
+use Symfony\Component\Form\Extension\Core\ChoiceList\ChoiceList;
-class ComplexChoiceListTest extends \PHPUnit_Framework_TestCase
+class ChoiceListTest extends \PHPUnit_Framework_TestCase
{
private $obj1;
@@ -34,7 +34,7 @@ class ComplexChoiceListTest extends \PHPUnit_Framework_TestCase
$this->obj3 = new \stdClass();
$this->obj4 = new \stdClass();
- $this->list = new ComplexChoiceList(
+ $this->list = new ChoiceList(
array(
'Group 1' => array($this->obj1, $this->obj2),
'Group 2' => array($this->obj3, $this->obj4),
@@ -60,7 +60,7 @@ class ComplexChoiceListTest extends \PHPUnit_Framework_TestCase
public function testInitArray()
{
- $this->list = new ComplexChoiceList(
+ $this->list = new ChoiceList(
array($this->obj1, $this->obj2, $this->obj3, $this->obj4),
array('A', 'B', 'C', 'D'),
array($this->obj2)