[Form] Adapted constructor of CollectionField to match the constructors of the other fields. The field prototype is now optional.
This commit is contained in:
parent
265cdd148f
commit
c923af2879
@ -26,30 +26,12 @@ use Symfony\Component\Form\Exception\UnexpectedTypeException;
|
||||
*/
|
||||
class CollectionField extends Form
|
||||
{
|
||||
/**
|
||||
* The prototype for the inner fields
|
||||
* @var FieldInterface
|
||||
*/
|
||||
protected $prototype;
|
||||
|
||||
/**
|
||||
* Remembers which fields were removed upon submitting
|
||||
* @var array
|
||||
*/
|
||||
protected $removedFields = array();
|
||||
|
||||
/**
|
||||
* Repeats the given field multiple times based in the internal collection.
|
||||
*
|
||||
* @param FieldInterface $innerField
|
||||
*/
|
||||
public function __construct(FieldInterface $innerField, array $options = array())
|
||||
{
|
||||
$this->prototype = $innerField;
|
||||
|
||||
parent::__construct($innerField->getKey(), $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* Available options:
|
||||
*
|
||||
@ -61,6 +43,7 @@ class CollectionField extends Form
|
||||
*/
|
||||
protected function configure()
|
||||
{
|
||||
$this->addOption('prototype');
|
||||
$this->addOption('modifiable', false);
|
||||
|
||||
if ($this->getOption('modifiable')) {
|
||||
@ -92,28 +75,28 @@ class CollectionField extends Form
|
||||
parent::setData($collection);
|
||||
}
|
||||
|
||||
public function submit($taintedData)
|
||||
public function submit($data)
|
||||
{
|
||||
$this->removedFields = array();
|
||||
|
||||
if (null === $taintedData) {
|
||||
$taintedData = array();
|
||||
if (null === $data) {
|
||||
$data = array();
|
||||
}
|
||||
|
||||
foreach ($this as $name => $field) {
|
||||
if (!isset($taintedData[$name]) && $this->getOption('modifiable') && '$$key$$' != $name) {
|
||||
if (!isset($data[$name]) && $this->getOption('modifiable') && '$$key$$' != $name) {
|
||||
$this->remove($name);
|
||||
$this->removedFields[] = $name;
|
||||
}
|
||||
}
|
||||
|
||||
foreach ($taintedData as $name => $value) {
|
||||
foreach ($data as $name => $value) {
|
||||
if (!isset($this[$name]) && $this->getOption('modifiable')) {
|
||||
$this->add($this->newField($name, $name));
|
||||
}
|
||||
}
|
||||
|
||||
parent::submit($taintedData);
|
||||
parent::submit($data);
|
||||
}
|
||||
|
||||
protected function writeObject(&$objectOrArray)
|
||||
@ -127,9 +110,20 @@ class CollectionField extends Form
|
||||
|
||||
protected function newField($key, $propertyPath)
|
||||
{
|
||||
$field = clone $this->prototype;
|
||||
$field->setKey($key);
|
||||
$field->setPropertyPath(null === $propertyPath ? null : '['.$propertyPath.']');
|
||||
if (null !== $propertyPath) {
|
||||
$propertyPath = '['.$propertyPath.']';
|
||||
}
|
||||
|
||||
if ($this->getOption('prototype')) {
|
||||
$field = clone $this->getOption('prototype');
|
||||
$field->setKey($key);
|
||||
$field->setPropertyPath($propertyPath);
|
||||
} else {
|
||||
$field = new TextField($key, array(
|
||||
'property_path' => $propertyPath,
|
||||
));
|
||||
}
|
||||
|
||||
return $field;
|
||||
}
|
||||
}
|
@ -21,13 +21,17 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
{
|
||||
public function testContainsNoFieldsByDefault()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'));
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
));
|
||||
$this->assertEquals(0, count($field));
|
||||
}
|
||||
|
||||
public function testSetDataAdjustsSize()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'));
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
));
|
||||
$field->setData(array('foo@foo.com', 'foo@bar.com'));
|
||||
|
||||
$this->assertTrue($field[0] instanceof TestField);
|
||||
@ -45,7 +49,8 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testSetDataAdjustsSizeIfModifiable()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'), array(
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
'modifiable' => true,
|
||||
));
|
||||
$field->setData(array('foo@foo.com', 'foo@bar.com'));
|
||||
@ -64,14 +69,17 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testThrowsExceptionIfObjectIsNotTraversable()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'));
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
));
|
||||
$this->setExpectedException('Symfony\Component\Form\Exception\UnexpectedTypeException');
|
||||
$field->setData(new \stdClass());
|
||||
}
|
||||
|
||||
public function testModifiableCollectionsContainExtraField()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'), array(
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
'modifiable' => true,
|
||||
));
|
||||
$field->setData(array('foo@bar.com'));
|
||||
@ -83,7 +91,9 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testNotResizedIfSubmittedWithMissingData()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'));
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
));
|
||||
$field->setData(array('foo@foo.com', 'bar@bar.com'));
|
||||
$field->submit(array('foo@bar.com'));
|
||||
|
||||
@ -95,7 +105,8 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testResizedIfSubmittedWithMissingDataAndModifiable()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'), array(
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
'modifiable' => true,
|
||||
));
|
||||
$field->setData(array('foo@foo.com', 'bar@bar.com'));
|
||||
@ -108,7 +119,9 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testNotResizedIfSubmittedWithExtraData()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'));
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
));
|
||||
$field->setData(array('foo@bar.com'));
|
||||
$field->submit(array('foo@foo.com', 'bar@bar.com'));
|
||||
|
||||
@ -119,7 +132,8 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testResizedUpIfSubmittedWithExtraDataAndModifiable()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'), array(
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
'modifiable' => true,
|
||||
));
|
||||
$field->setData(array('foo@bar.com'));
|
||||
@ -134,7 +148,8 @@ class CollectionFieldTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
public function testResizedDownIfSubmittedWithLessDataAndModifiable()
|
||||
{
|
||||
$field = new CollectionField(new TestField('emails'), array(
|
||||
$field = new CollectionField('emails', array(
|
||||
'prototype' => new TestField(),
|
||||
'modifiable' => true,
|
||||
));
|
||||
$field->setData(array('foo@bar.com', 'bar@bar.com'));
|
||||
|
Reference in New Issue
Block a user