[Form] Implemented checks to assert that values and indices generated in choice lists match their requirements
This commit is contained in:
parent
5f6f75c026
commit
399af275ac
@ -11,8 +11,10 @@
|
|||||||
|
|
||||||
namespace Symfony\Component\Form\Extension\Core\ChoiceList;
|
namespace Symfony\Component\Form\Extension\Core\ChoiceList;
|
||||||
|
|
||||||
|
use Symfony\Component\Form\Form;
|
||||||
use Symfony\Component\Form\Util\FormUtil;
|
use Symfony\Component\Form\Util\FormUtil;
|
||||||
use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
||||||
|
use Symfony\Component\Form\Exception\InvalidConfigurationException;
|
||||||
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
|
use Symfony\Component\Form\Extension\Core\View\ChoiceView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -429,8 +431,18 @@ class ChoiceList implements ChoiceListInterface
|
|||||||
{
|
{
|
||||||
$index = $this->createIndex($choice);
|
$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.');
|
||||||
|
}
|
||||||
|
|
||||||
|
$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.');
|
||||||
|
}
|
||||||
|
|
||||||
// Always store values as strings to facilitate comparisons
|
// Always store values as strings to facilitate comparisons
|
||||||
$value = $this->fixValue($this->createValue($choice));
|
$value = $this->fixValue($value);
|
||||||
$view = new ChoiceView($value, $label);
|
$view = new ChoiceView($value, $label);
|
||||||
|
|
||||||
$this->choices[$index] = $this->fixChoice($choice);
|
$this->choices[$index] = $this->fixChoice($choice);
|
||||||
|
@ -1063,14 +1063,8 @@ class Form implements \IteratorAggregate, FormInterface
|
|||||||
/**
|
/**
|
||||||
* Validates whether the given variable is a valid form name.
|
* Validates whether the given variable is a valid form name.
|
||||||
*
|
*
|
||||||
* A name is accepted if it
|
|
||||||
*
|
|
||||||
* * is empty
|
|
||||||
* * starts with a letter, digit or underscore
|
|
||||||
* * contains only letters, digits, numbers, underscores ("_"),
|
|
||||||
* hyphens ("-") and colons (":")
|
|
||||||
*
|
|
||||||
* @param string $name The tested form name.
|
* @param string $name The tested form name.
|
||||||
|
*
|
||||||
* @throws UnexpectedTypeException If the name is not a string.
|
* @throws UnexpectedTypeException If the name is not a string.
|
||||||
* @throws \InvalidArgumentException If the name contains invalid characters.
|
* @throws \InvalidArgumentException If the name contains invalid characters.
|
||||||
*/
|
*/
|
||||||
@ -1080,11 +1074,30 @@ class Form implements \IteratorAggregate, FormInterface
|
|||||||
throw new UnexpectedTypeException($name, 'string');
|
throw new UnexpectedTypeException($name, 'string');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($name !== '' && !preg_match('/^[a-zA-Z0-9_][a-zA-Z0-9_\-:]*$/D', $name)) {
|
if (!self::isValidName($name)) {
|
||||||
throw new \InvalidArgumentException(sprintf(
|
throw new \InvalidArgumentException(sprintf(
|
||||||
'The name "%s" contains illegal characters. Names should start with a letter, digit or underscore and only contains letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").',
|
'The name "%s" contains illegal characters. Names should start with a letter, digit or underscore and only contains letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").',
|
||||||
$name
|
$name
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether the given variable contains a valid form name.
|
||||||
|
*
|
||||||
|
* A name is accepted if it
|
||||||
|
*
|
||||||
|
* * is empty
|
||||||
|
* * starts with a letter, digit or underscore
|
||||||
|
* * contains only letters, digits, numbers, underscores ("_"),
|
||||||
|
* hyphens ("-") and colons (":")
|
||||||
|
*
|
||||||
|
* @param string $name The tested form name.
|
||||||
|
*
|
||||||
|
* @return Boolean Whether the name is valid.
|
||||||
|
*/
|
||||||
|
static public function isValidName($name)
|
||||||
|
{
|
||||||
|
return $name === '' || preg_match('/^[a-zA-Z0-9_][a-zA-Z0-9_\-:]*$/D', $name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,6 +87,34 @@ class ChoiceListTest extends \PHPUnit_Framework_TestCase
|
|||||||
), $this->list->getRemainingViews());
|
), $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()
|
public function testGetIndicesForChoices()
|
||||||
{
|
{
|
||||||
$choices = array($this->obj2, $this->obj3);
|
$choices = array($this->obj2, $this->obj3);
|
||||||
|
Reference in New Issue
Block a user