[Form] Adapted constructor of CollectionField to match the constructors of the other fields. The field prototype is now optional.

This commit is contained in:
Bernhard Schussek 2011-02-02 14:44:36 +01:00
parent 265cdd148f
commit c923af2879
2 changed files with 46 additions and 37 deletions

View File

@ -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;
}
}

View File

@ -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'));