[Form] Simplified choice list API
This commit is contained in:
parent
26451201e0
commit
2e07256921
@ -158,14 +158,11 @@ UPGRADE FROM 2.0 to 2.1
|
||||
`getChoices()` and `getChoicesByValues()`. For the latter two, no
|
||||
replacement exists.
|
||||
|
||||
* The strategy for generating the `id` and `name` HTML attributes for choices
|
||||
in a choice field has changed.
|
||||
* The strategy for generating the `id` and `name` HTML attributes for
|
||||
checkboxes and radio buttons 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 the old behavior. If you
|
||||
can guarantee that your choice values only contain ASCII letters, digits,
|
||||
colons and underscores, you can restore the old behavior by setting the
|
||||
`index_strategy` choice field option to `ChoiceList::COPY_CHOICE`.
|
||||
by default. Take care if your JavaScript relies on that.
|
||||
|
||||
* In the choice field type's template, the structure of the `choices` variable
|
||||
has changed.
|
||||
|
@ -319,7 +319,7 @@ class EntityChoiceList extends ObjectChoiceList
|
||||
protected function createValue($entity)
|
||||
{
|
||||
if (count($this->identifier) === 1) {
|
||||
return current($this->getIdentifierValues($entity));
|
||||
return (string) current($this->getIdentifierValues($entity));
|
||||
}
|
||||
|
||||
return parent::createValue($entity);
|
||||
|
@ -304,7 +304,7 @@ class ModelChoiceList extends ObjectChoiceList
|
||||
protected function createValue($model)
|
||||
{
|
||||
if (1 === count($this->identifier)) {
|
||||
return current($this->getIdentifierValues($model));
|
||||
return (string) current($this->getIdentifierValues($model));
|
||||
}
|
||||
|
||||
return parent::createValue($model);
|
||||
|
@ -32,29 +32,6 @@ use Symfony\Component\Form\Extension\Core\View\ChoiceView;
|
||||
*/
|
||||
class ChoiceList implements ChoiceListInterface
|
||||
{
|
||||
/**
|
||||
* Strategy creating new indices/values by creating a copy of the choice.
|
||||
*
|
||||
* This strategy can only be used for index creation if choices are
|
||||
* guaranteed to only contain ASCII letters, digits and underscores.
|
||||
*
|
||||
* It can be used for value creation if choices can safely be cast into
|
||||
* a (unique) string.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
const COPY_CHOICE = 0;
|
||||
|
||||
/**
|
||||
* Strategy creating new indices/values by generating a new integer.
|
||||
*
|
||||
* This strategy can always be applied, but leads to loss of information
|
||||
* in the HTML source code.
|
||||
*
|
||||
* @var integer
|
||||
*/
|
||||
const GENERATE = 1;
|
||||
|
||||
/**
|
||||
* The choices with their indices as keys.
|
||||
*
|
||||
@ -85,24 +62,6 @@ class ChoiceList implements ChoiceListInterface
|
||||
*/
|
||||
private $remainingViews = array();
|
||||
|
||||
/**
|
||||
* The strategy used for creating choice indices.
|
||||
*
|
||||
* @var integer
|
||||
* @see COPY_CHOICE
|
||||
* @see GENERATE
|
||||
*/
|
||||
private $indexStrategy;
|
||||
|
||||
/**
|
||||
* The strategy used for creating choice values.
|
||||
*
|
||||
* @var integer
|
||||
* @see COPY_CHOICE
|
||||
* @see GENERATE
|
||||
*/
|
||||
private $valueStrategy;
|
||||
|
||||
/**
|
||||
* Creates a new choice list.
|
||||
*
|
||||
@ -115,16 +74,9 @@ class ChoiceList implements ChoiceListInterface
|
||||
* should match the structure of $choices.
|
||||
* @param array $preferredChoices A flat array of choices that should be
|
||||
* presented to the user with priority.
|
||||
* @param integer $valueStrategy The strategy used to create choice values.
|
||||
* One of COPY_CHOICE and GENERATE.
|
||||
* @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 = self::GENERATE, $indexStrategy = self::GENERATE)
|
||||
public function __construct($choices, array $labels, array $preferredChoices = array())
|
||||
{
|
||||
$this->valueStrategy = $valueStrategy;
|
||||
$this->indexStrategy = $indexStrategy;
|
||||
|
||||
$this->initialize($choices, $labels, $preferredChoices);
|
||||
}
|
||||
|
||||
@ -191,13 +143,6 @@ class ChoiceList implements ChoiceListInterface
|
||||
public function getChoicesForValues(array $values)
|
||||
{
|
||||
$values = $this->fixValues($values);
|
||||
|
||||
// If the values are identical to the choices, we can just return them
|
||||
// to improve performance a little bit
|
||||
if (self::COPY_CHOICE === $this->valueStrategy) {
|
||||
return $this->fixChoices(array_intersect($values, $this->values));
|
||||
}
|
||||
|
||||
$choices = array();
|
||||
|
||||
foreach ($values as $j => $givenValue) {
|
||||
@ -222,13 +167,6 @@ class ChoiceList implements ChoiceListInterface
|
||||
public function getValuesForChoices(array $choices)
|
||||
{
|
||||
$choices = $this->fixChoices($choices);
|
||||
|
||||
// If the values are identical to the choices, we can just return them
|
||||
// to improve performance a little bit
|
||||
if (self::COPY_CHOICE === $this->valueStrategy) {
|
||||
return $this->fixValues(array_intersect($choices, $this->choices));
|
||||
}
|
||||
|
||||
$values = array();
|
||||
|
||||
foreach ($this->choices as $i => $choice) {
|
||||
@ -398,17 +336,15 @@ class ChoiceList implements ChoiceListInterface
|
||||
$index = $this->createIndex($choice);
|
||||
|
||||
if ('' === $index || null === $index || !Form::isValidName((string)$index)) {
|
||||
throw new InvalidConfigurationException('The choice list index "' . $index . '" is invalid. Please set the choice field option "index_generation" to ChoiceList::GENERATE.');
|
||||
throw new InvalidConfigurationException('The index "' . $index . '" created by the choice list is invalid. It should be a valid, non-empty Form name.');
|
||||
}
|
||||
|
||||
$value = $this->createValue($choice);
|
||||
|
||||
if (!is_scalar($value)) {
|
||||
throw new InvalidConfigurationException('The choice list value of type "' . gettype($value) . '" should be a scalar. Please set the choice field option "value_generation" to ChoiceList::GENERATE.');
|
||||
if (!is_string($value)) {
|
||||
throw new InvalidConfigurationException('The value created by the choice list is of type "' . gettype($value) . '", but should be a string.');
|
||||
}
|
||||
|
||||
// Always store values as strings to facilitate comparisons
|
||||
$value = $this->fixValue($value);
|
||||
$view = new ChoiceView($value, $label);
|
||||
|
||||
$this->choices[$index] = $this->fixChoice($choice);
|
||||
@ -448,29 +384,23 @@ class ChoiceList implements ChoiceListInterface
|
||||
*/
|
||||
protected function createIndex($choice)
|
||||
{
|
||||
if (self::COPY_CHOICE === $this->indexStrategy) {
|
||||
return $choice;
|
||||
}
|
||||
|
||||
return count($this->choices);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new unique value for this choice.
|
||||
*
|
||||
* Extension point to change the value strategy.
|
||||
* By default, an integer is generated since it cannot be guaranteed that
|
||||
* all values in the list are convertible to (unique) strings. Subclasses
|
||||
* can override this behaviour if they can guarantee this property.
|
||||
*
|
||||
* @param mixed $choice The choice to create a value for
|
||||
*
|
||||
* @return integer|string A unique value without character limitations.
|
||||
* @return string A unique string.
|
||||
*/
|
||||
protected function createValue($choice)
|
||||
{
|
||||
if (self::COPY_CHOICE === $this->valueStrategy) {
|
||||
return $choice;
|
||||
}
|
||||
|
||||
return count($this->values);
|
||||
return (string) count($this->values);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -14,17 +14,12 @@ namespace Symfony\Component\Form\Extension\Core\ChoiceList;
|
||||
/**
|
||||
* Contains choices that can be selected in a form field.
|
||||
*
|
||||
* Each choice has four different properties:
|
||||
* Each choice has three different properties:
|
||||
*
|
||||
* - Choice: The choice that should be returned to the application by the
|
||||
* choice field. Can be any scalar value or an object, but no
|
||||
* array.
|
||||
* - Label: A text representing the choice that is displayed to the user.
|
||||
* - Index: A uniquely identifying index that should only contain ASCII
|
||||
* characters, digits and underscores. This index is used to
|
||||
* identify the choice in the HTML "id" and "name" attributes.
|
||||
* It is also used as index of the arrays returned by the various
|
||||
* getters of this class.
|
||||
* - Value: A uniquely identifying value that can contain arbitrary
|
||||
* characters, but no arrays or objects. This value is displayed
|
||||
* in the HTML "value" attribute.
|
||||
|
@ -19,8 +19,8 @@ use Symfony\Component\Form\Exception\InvalidPropertyException;
|
||||
/**
|
||||
* A choice list for object choices.
|
||||
*
|
||||
* Supports generation of choice labels, choice groups, choice values and
|
||||
* choice indices by calling getters of the object (or associated objects).
|
||||
* Supports generation of choice labels, choice groups and choice values
|
||||
* by calling getters of the object (or associated objects).
|
||||
*
|
||||
* <code>
|
||||
* $choices = array($user1, $user2);
|
||||
@ -54,13 +54,6 @@ class ObjectChoiceList extends ChoiceList
|
||||
*/
|
||||
private $valuePath;
|
||||
|
||||
/**
|
||||
* The property path used to obtain the choice index.
|
||||
*
|
||||
* @var PropertyPath
|
||||
*/
|
||||
private $indexPath;
|
||||
|
||||
/**
|
||||
* Creates a new object choice list.
|
||||
*
|
||||
@ -82,18 +75,14 @@ class ObjectChoiceList extends ChoiceList
|
||||
* @param string $valuePath A property path pointing to the property used
|
||||
* for the choice values. If not given, integers
|
||||
* are generated instead.
|
||||
* @param string $indexPath A property path pointing to the property used
|
||||
* for the choice indices. If not given, integers
|
||||
* are generated instead.
|
||||
*/
|
||||
public function __construct($choices, $labelPath = null, array $preferredChoices = array(), $groupPath = null, $valuePath = null, $indexPath = null)
|
||||
public function __construct($choices, $labelPath = null, array $preferredChoices = array(), $groupPath = null, $valuePath = null)
|
||||
{
|
||||
$this->labelPath = $labelPath ? new PropertyPath($labelPath) : null;
|
||||
$this->groupPath = $groupPath ? new PropertyPath($groupPath) : null;
|
||||
$this->valuePath = $valuePath ? new PropertyPath($valuePath) : null;
|
||||
$this->indexPath = $indexPath ? new PropertyPath($indexPath) : null;
|
||||
|
||||
parent::__construct($choices, array(), $preferredChoices, self::GENERATE, self::GENERATE);
|
||||
parent::__construct($choices, array(), $preferredChoices);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -148,27 +137,6 @@ class ObjectChoiceList extends ChoiceList
|
||||
parent::initialize($choices, $labels, $preferredChoices);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new unique index for this choice.
|
||||
*
|
||||
* If a property path for the index was given at object creation,
|
||||
* the getter behind that path is now called to obtain a new value.
|
||||
*
|
||||
* Otherwise a new integer is generated.
|
||||
*
|
||||
* @param mixed $choice The choice to create an index for
|
||||
* @return integer|string A unique index containing only ASCII letters,
|
||||
* digits and underscores.
|
||||
*/
|
||||
protected function createIndex($choice)
|
||||
{
|
||||
if ($this->indexPath) {
|
||||
return $this->indexPath->getValue($choice);
|
||||
}
|
||||
|
||||
return parent::createIndex($choice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new unique value for this choice.
|
||||
*
|
||||
@ -183,7 +151,7 @@ class ObjectChoiceList extends ChoiceList
|
||||
protected function createValue($choice)
|
||||
{
|
||||
if ($this->valuePath) {
|
||||
return $this->valuePath->getValue($choice);
|
||||
return (string) $this->valuePath->getValue($choice);
|
||||
}
|
||||
|
||||
return parent::createValue($choice);
|
||||
|
@ -28,27 +28,6 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
||||
* ));
|
||||
* </code>
|
||||
*
|
||||
* The default value generation strategy is `ChoiceList::COPY_CHOICE`, because
|
||||
* choice values must be scalar, and the choices passed to this choice list
|
||||
* are guaranteed to be scalar.
|
||||
*
|
||||
* The default index generation strategy is `ChoiceList::GENERATE`, so that
|
||||
* your choices can also contain values that are illegal as indices. If your
|
||||
* choices are guaranteed to start with a letter, digit or underscore and only
|
||||
* contain letters, digits, underscores, hyphens and colons, you can set the
|
||||
* strategy to `ChoiceList::COPY_CHOICE` instead.
|
||||
*
|
||||
* <code>
|
||||
* $choices = array(
|
||||
* 'creditcard' => 'Credit card payment',
|
||||
* 'cash' => 'Cash payment',
|
||||
* );
|
||||
*
|
||||
* // value generation: COPY_CHOICE (the default)
|
||||
* // index generation: COPY_CHOICE (custom)
|
||||
* $choiceList = new SimpleChoiceList($choices, array(), ChoiceList::COPY_CHOICE, ChoiceList::COPY_CHOICE);
|
||||
* </code>
|
||||
*
|
||||
* @author Bernhard Schussek <bschussek@gmail.com>
|
||||
*/
|
||||
class SimpleChoiceList extends ChoiceList
|
||||
@ -64,15 +43,35 @@ class SimpleChoiceList extends ChoiceList
|
||||
* key pointing to the nested array.
|
||||
* @param array $preferredChoices A flat array of choices that should be
|
||||
* presented to the user with priority.
|
||||
* @param integer $valueStrategy The strategy used to create choice values.
|
||||
* One of COPY_CHOICE and GENERATE.
|
||||
* @param integer $indexStrategy The strategy used to create choice indices.
|
||||
* One of COPY_CHOICE and GENERATE.
|
||||
*/
|
||||
public function __construct(array $choices, array $preferredChoices = array(), $valueStrategy = self::COPY_CHOICE, $indexStrategy = self::GENERATE)
|
||||
public function __construct(array $choices, array $preferredChoices = array())
|
||||
{
|
||||
// Flip preferred choices to speed up lookup
|
||||
parent::__construct($choices, $choices, array_flip($preferredChoices), $valueStrategy, $indexStrategy);
|
||||
parent::__construct($choices, $choices, array_flip($preferredChoices));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getChoicesForValues(array $values)
|
||||
{
|
||||
$values = $this->fixValues($values);
|
||||
|
||||
// The values are identical to the choices, so we can just return them
|
||||
// to improve performance a little bit
|
||||
return $this->fixChoices(array_intersect($values, $this->getValues()));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getValuesForChoices(array $choices)
|
||||
{
|
||||
$choices = $this->fixChoices($choices);
|
||||
|
||||
// The choices are identical to the values, so we can just return them
|
||||
// to improve performance a little bit
|
||||
return $this->fixValues(array_intersect($choices, $this->getValues()));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -147,16 +146,21 @@ class SimpleChoiceList extends ChoiceList
|
||||
return $this->fixIndex($choice);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Converts the choices to valid PHP array keys.
|
||||
*
|
||||
* @param array $choices The choices.
|
||||
*
|
||||
* @return array Valid PHP array keys.
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function fixChoices(array $choices)
|
||||
{
|
||||
return $this->fixIndices($choices);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
protected function createValue($choice)
|
||||
{
|
||||
// Choices are guaranteed to be unique and scalar, so we can simply
|
||||
// convert them to strings
|
||||
return (string) $choice;
|
||||
}
|
||||
}
|
||||
|
@ -45,9 +45,7 @@ class ChoiceType extends AbstractType
|
||||
if (!$options['choice_list']) {
|
||||
$options['choice_list'] = new SimpleChoiceList(
|
||||
$options['choices'],
|
||||
$options['preferred_choices'],
|
||||
$options['value_strategy'],
|
||||
$options['index_strategy']
|
||||
$options['preferred_choices']
|
||||
);
|
||||
}
|
||||
|
||||
@ -159,8 +157,6 @@ class ChoiceType extends AbstractType
|
||||
'choice_list' => null,
|
||||
'choices' => null,
|
||||
'preferred_choices' => array(),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::GENERATE,
|
||||
'empty_data' => $multiple || $expanded ? array() : '',
|
||||
'empty_value' => $multiple || $expanded || !isset($options['empty_value']) ? null : '',
|
||||
'error_bubbling' => false,
|
||||
|
@ -24,8 +24,6 @@ class CountryType extends AbstractType
|
||||
{
|
||||
return array(
|
||||
'choices' => Locale::getDisplayCountries(\Locale::getDefault()),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -89,20 +89,14 @@ class DateType extends AbstractType
|
||||
// Only pass a subset of the options to children
|
||||
$yearOptions = array(
|
||||
'choices' => $years,
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['year'],
|
||||
);
|
||||
$monthOptions = array(
|
||||
'choices' => $this->formatMonths($formatter, $months),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['month'],
|
||||
);
|
||||
$dayOptions = array(
|
||||
'choices' => $days,
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['day'],
|
||||
);
|
||||
|
||||
|
@ -24,7 +24,6 @@ class LanguageType extends AbstractType
|
||||
{
|
||||
return array(
|
||||
'choices' => Locale::getDisplayLanguages(\Locale::getDefault()),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -24,7 +24,6 @@ class LocaleType extends AbstractType
|
||||
{
|
||||
return array(
|
||||
'choices' => Locale::getDisplayLocales(\Locale::getDefault()),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -59,14 +59,10 @@ class TimeType extends AbstractType
|
||||
// Only pass a subset of the options to children
|
||||
$hourOptions = array(
|
||||
'choices' => $hours,
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['hour'],
|
||||
);
|
||||
$minuteOptions = array(
|
||||
'choices' => $minutes,
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['minute'],
|
||||
);
|
||||
|
||||
@ -79,8 +75,6 @@ class TimeType extends AbstractType
|
||||
|
||||
$secondOptions = array(
|
||||
'choices' => $seconds,
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'index_strategy' => ChoiceList::COPY_CHOICE,
|
||||
'empty_value' => $options['empty_value']['second'],
|
||||
);
|
||||
}
|
||||
|
@ -27,9 +27,7 @@ class TimezoneType extends AbstractType
|
||||
*/
|
||||
public function getDefaultOptions(array $options)
|
||||
{
|
||||
$defaultOptions = array(
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
);
|
||||
$defaultOptions = array();
|
||||
|
||||
if (empty($options['choice_list']) && empty($options['choices'])) {
|
||||
$defaultOptions['choices'] = self::getTimezones();
|
||||
|
@ -87,34 +87,6 @@ class ChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Symfony\Component\Form\Exception\InvalidConfigurationException
|
||||
*/
|
||||
public function testInitIndexCopyChoiceWithInvalidIndex()
|
||||
{
|
||||
new ChoiceList(
|
||||
array('a.'),
|
||||
array('A'),
|
||||
array(),
|
||||
ChoiceList::GENERATE,
|
||||
ChoiceList::COPY_CHOICE
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException Symfony\Component\Form\Exception\InvalidConfigurationException
|
||||
*/
|
||||
public function testInitValueCopyChoiceWithInvalidValue()
|
||||
{
|
||||
new ChoiceList(
|
||||
array($this->obj1),
|
||||
array('A'),
|
||||
array(),
|
||||
ChoiceList::COPY_CHOICE,
|
||||
ChoiceList::GENERATE
|
||||
);
|
||||
}
|
||||
|
||||
public function testGetIndicesForChoices()
|
||||
{
|
||||
$choices = array($this->obj2, $this->obj3);
|
||||
|
@ -176,28 +176,6 @@ class ObjectChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertEquals(array(0 => new ChoiceView('10', 'A'), 3 => new ChoiceView('40', 'D')), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testInitArrayWithIndexPath()
|
||||
{
|
||||
$this->obj1 = (object) array('name' => 'A', 'id' => 10);
|
||||
$this->obj2 = (object) array('name' => 'B', 'id' => 20);
|
||||
$this->obj3 = (object) array('name' => 'C', 'id' => 30);
|
||||
$this->obj4 = (object) array('name' => 'D', 'id' => 40);
|
||||
|
||||
$this->list = new ObjectChoiceList(
|
||||
array($this->obj1, $this->obj2, $this->obj3, $this->obj4),
|
||||
'name',
|
||||
array($this->obj2, $this->obj3),
|
||||
null,
|
||||
null,
|
||||
'id'
|
||||
);
|
||||
|
||||
$this->assertSame(array(10 => $this->obj1, 20 => $this->obj2, 30 => $this->obj3, 40 => $this->obj4), $this->list->getChoices());
|
||||
$this->assertSame(array(10 => '0', 20 => '1', 30 => '2', 40 => '3'), $this->list->getValues());
|
||||
$this->assertEquals(array(20 => new ChoiceView('1', 'B'), 30 => new ChoiceView('2', 'C')), $this->list->getPreferredViews());
|
||||
$this->assertEquals(array(10 => new ChoiceView('0', 'A'), 40 => new ChoiceView('3', 'D')), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testInitArrayUsesToString()
|
||||
{
|
||||
$this->obj1 = new ObjectChoiceListTest_EntityWithToString('A');
|
||||
|
@ -34,10 +34,10 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
'Group 2' => array(2 => 'C', 3 => 'D'),
|
||||
);
|
||||
|
||||
$this->list = new SimpleChoiceList($choices, array('b', 'c'), ChoiceList::GENERATE, ChoiceList::GENERATE);
|
||||
$this->list = new SimpleChoiceList($choices, array('b', 'c'));
|
||||
|
||||
// Use COPY_CHOICE strategy to test for the various associated problems
|
||||
$this->numericList = new SimpleChoiceList($numericChoices, array(1, 2), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE);
|
||||
$this->numericList = new SimpleChoiceList($numericChoices, array(1, 2));
|
||||
}
|
||||
|
||||
protected function tearDown()
|
||||
@ -51,18 +51,7 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
public function testInitArray()
|
||||
{
|
||||
$choices = array('a' => 'A', 'b' => 'B', 'c' => 'C');
|
||||
$this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::GENERATE, ChoiceList::GENERATE);
|
||||
|
||||
$this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices());
|
||||
$this->assertSame(array(0 => '0', 1 => '1', 2 => '2'), $this->list->getValues());
|
||||
$this->assertEquals(array(1 => new ChoiceView('1', 'B')), $this->list->getPreferredViews());
|
||||
$this->assertEquals(array(0 => new ChoiceView('0', 'A'), 2 => new ChoiceView('2', 'C')), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testInitArrayValueCopyChoice()
|
||||
{
|
||||
$choices = array('a' => 'A', 'b' => 'B', 'c' => 'C');
|
||||
$this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE);
|
||||
$this->list = new SimpleChoiceList($choices, array('b'));
|
||||
|
||||
$this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getChoices());
|
||||
$this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c'), $this->list->getValues());
|
||||
@ -70,28 +59,17 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
$this->assertEquals(array(0 => new ChoiceView('a', 'A'), 2 => new ChoiceView('c', 'C')), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testInitArrayIndexCopyChoice()
|
||||
{
|
||||
$choices = array('a' => 'A', 'b' => 'B', 'c' => 'C');
|
||||
$this->list = new SimpleChoiceList($choices, array('b'), ChoiceList::GENERATE, ChoiceList::COPY_CHOICE);
|
||||
|
||||
$this->assertSame(array('a' => 'a', 'b' => 'b', 'c' => 'c'), $this->list->getChoices());
|
||||
$this->assertSame(array('a' => '0', 'b' => '1', 'c' => '2'), $this->list->getValues());
|
||||
$this->assertEquals(array('b' => new ChoiceView('1', 'B')), $this->list->getPreferredViews());
|
||||
$this->assertEquals(array('a' => new ChoiceView('0', 'A'), 'c' => new ChoiceView('2', 'C')), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
public function testInitNestedArray()
|
||||
{
|
||||
$this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getChoices());
|
||||
$this->assertSame(array(0 => '0', 1 => '1', 2 => '2', 3 => '3'), $this->list->getValues());
|
||||
$this->assertSame(array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd'), $this->list->getValues());
|
||||
$this->assertEquals(array(
|
||||
'Group 1' => array(1 => new ChoiceView('1', 'B')),
|
||||
'Group 2' => array(2 => new ChoiceView('2', 'C'))
|
||||
'Group 1' => array(1 => new ChoiceView('b', 'B')),
|
||||
'Group 2' => array(2 => new ChoiceView('c', 'C'))
|
||||
), $this->list->getPreferredViews());
|
||||
$this->assertEquals(array(
|
||||
'Group 1' => array(0 => new ChoiceView('0', 'A')),
|
||||
'Group 2' => array(3 => new ChoiceView('3', 'D'))
|
||||
'Group 1' => array(0 => new ChoiceView('a', 'A')),
|
||||
'Group 2' => array(3 => new ChoiceView('d', 'D'))
|
||||
), $this->list->getRemainingViews());
|
||||
}
|
||||
|
||||
@ -116,13 +94,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testGetIndicesForValues()
|
||||
{
|
||||
$values = array('1', '2');
|
||||
$values = array('b', 'c');
|
||||
$this->assertSame(array(1, 2), $this->list->getIndicesForValues($values));
|
||||
}
|
||||
|
||||
public function testGetIndicesForValuesIgnoresNonExistingValues()
|
||||
{
|
||||
$values = array('1', '2', '100');
|
||||
$values = array('b', 'c', '100');
|
||||
$this->assertSame(array(1, 2), $this->list->getIndicesForValues($values));
|
||||
}
|
||||
|
||||
@ -135,13 +113,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testGetChoicesForValues()
|
||||
{
|
||||
$values = array('1', '2');
|
||||
$values = array('b', 'c');
|
||||
$this->assertSame(array('b', 'c'), $this->list->getChoicesForValues($values));
|
||||
}
|
||||
|
||||
public function testGetChoicesForValuesIgnoresNonExistingValues()
|
||||
{
|
||||
$values = array('1', '2', '100');
|
||||
$values = array('b', 'c', '100');
|
||||
$this->assertSame(array('b', 'c'), $this->list->getChoicesForValues($values));
|
||||
}
|
||||
|
||||
@ -155,13 +133,13 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
public function testGetValuesForChoices()
|
||||
{
|
||||
$choices = array('b', 'c');
|
||||
$this->assertSame(array('1', '2'), $this->list->getValuesForChoices($choices));
|
||||
$this->assertSame(array('b', 'c'), $this->list->getValuesForChoices($choices));
|
||||
}
|
||||
|
||||
public function testGetValuesForChoicesIgnoresNonExistingValues()
|
||||
{
|
||||
$choices = array('b', 'c', 'foobar');
|
||||
$this->assertSame(array('1', '2'), $this->list->getValuesForChoices($choices));
|
||||
$this->assertSame(array('b', 'c'), $this->list->getValuesForChoices($choices));
|
||||
}
|
||||
|
||||
public function testGetValuesForChoicesDealsWithNumericValues()
|
||||
@ -187,7 +165,7 @@ class SimpleChoiceListTest extends \PHPUnit_Framework_TestCase
|
||||
);
|
||||
|
||||
// use COPY_CHOICE strategy to test the problems
|
||||
$this->list = new SimpleChoiceList($choices, array(), ChoiceList::COPY_CHOICE, ChoiceList::GENERATE);
|
||||
$this->list = new SimpleChoiceList($choices, array());
|
||||
|
||||
$this->assertSame(array($value), $this->list->getValuesForChoices(array($choice)));
|
||||
}
|
||||
|
@ -408,8 +408,7 @@ class ChoiceTypeTest extends TypeTestCase
|
||||
'' => 'Empty',
|
||||
1 => 'Not Empty',
|
||||
2 => 'Not Empty 2',
|
||||
),
|
||||
'value_strategy' => ChoiceList::COPY_CHOICE,
|
||||
)
|
||||
));
|
||||
|
||||
$form->bind(array('', '2'));
|
||||
|
@ -23,11 +23,12 @@ class CountryTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
$choices = $view->get('choices');
|
||||
|
||||
$this->assertEquals(new ChoiceView('DE', 'Deutschland'), $choices['DE']);
|
||||
$this->assertEquals(new ChoiceView('GB', 'Vereinigtes Königreich'), $choices['GB']);
|
||||
$this->assertEquals(new ChoiceView('US', 'Vereinigte Staaten'), $choices['US']);
|
||||
$this->assertEquals(new ChoiceView('FR', 'Frankreich'), $choices['FR']);
|
||||
$this->assertEquals(new ChoiceView('MY', 'Malaysia'), $choices['MY']);
|
||||
// Don't check objects for identity
|
||||
$this->assertContains(new ChoiceView('DE', 'Deutschland'), $choices, '', false, false);
|
||||
$this->assertContains(new ChoiceView('GB', 'Vereinigtes Königreich'), $choices, '', false, false);
|
||||
$this->assertContains(new ChoiceView('US', 'Vereinigte Staaten'), $choices, '', false, false);
|
||||
$this->assertContains(new ChoiceView('FR', 'Frankreich'), $choices, '', false, false);
|
||||
$this->assertContains(new ChoiceView('MY', 'Malaysia'), $choices, '', false, false);
|
||||
}
|
||||
|
||||
public function testUnknownCountryIsNotIncluded()
|
||||
@ -36,6 +37,10 @@ class CountryTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
$choices = $view->get('choices');
|
||||
|
||||
$this->assertArrayNotHasKey('ZZ', $choices);
|
||||
foreach ($choices as $choice) {
|
||||
if ('ZZ' === $choice->getValue()) {
|
||||
$this->fail('Should not contain choice "ZZ"');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -325,8 +325,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
2010 => new ChoiceView('2010', '2010'),
|
||||
2011 => new ChoiceView('2011', '2011'),
|
||||
new ChoiceView('2010', '2010'),
|
||||
new ChoiceView('2011', '2011'),
|
||||
), $view->getChild('year')->get('choices'));
|
||||
}
|
||||
|
||||
@ -339,8 +339,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('month')->get('choices'));
|
||||
}
|
||||
|
||||
@ -354,8 +354,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('month')->get('choices'));
|
||||
}
|
||||
|
||||
@ -369,8 +369,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
1 => new ChoiceView('1', 'Jän'),
|
||||
4 => new ChoiceView('4', 'Apr')
|
||||
new ChoiceView('1', 'Jän'),
|
||||
new ChoiceView('4', 'Apr')
|
||||
), $view->getChild('month')->get('choices'));
|
||||
}
|
||||
|
||||
@ -384,8 +384,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
1 => new ChoiceView('1', 'Jänner'),
|
||||
4 => new ChoiceView('4', 'April'),
|
||||
new ChoiceView('1', 'Jänner'),
|
||||
new ChoiceView('4', 'April'),
|
||||
), $view->getChild('month')->get('choices'));
|
||||
}
|
||||
|
||||
@ -399,8 +399,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
1 => new ChoiceView('1', 'Jänner'),
|
||||
4 => new ChoiceView('4', 'April'),
|
||||
new ChoiceView('1', 'Jänner'),
|
||||
new ChoiceView('4', 'April'),
|
||||
), $view->getChild('month')->get('choices'));
|
||||
}
|
||||
|
||||
@ -413,8 +413,8 @@ class DateTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('day')->get('choices'));
|
||||
}
|
||||
|
||||
|
@ -243,8 +243,8 @@ class TimeTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('hour')->get('choices'));
|
||||
}
|
||||
|
||||
@ -257,8 +257,8 @@ class TimeTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('minute')->get('choices'));
|
||||
}
|
||||
|
||||
@ -272,8 +272,8 @@ class TimeTypeTest extends LocalizedTestCase
|
||||
$view = $form->createView();
|
||||
|
||||
$this->assertEquals(array(
|
||||
6 => new ChoiceView('6', '06'),
|
||||
7 => new ChoiceView('7', '07'),
|
||||
new ChoiceView('6', '06'),
|
||||
new ChoiceView('7', '07'),
|
||||
), $view->getChild('second')->get('choices'));
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user