Skip to content
This repository has been archived by the owner on Jan 30, 2020. It is now read-only.

Commit

Permalink
Merge pull request #106 from svycka/hotfix/issue-102-BC-break-because…
Browse files Browse the repository at this point in the history
…-of-collections-fix

Hotfix for #102 BC break validationGroup ignored for collections
  • Loading branch information
weierophinney committed Sep 14, 2016
2 parents 2d60b97 + 8991ddb commit 2674c45
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 6 deletions.
6 changes: 4 additions & 2 deletions src/Element/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -261,16 +261,18 @@ public function allowValueBinding()
* Bind values to the object
*
* @param array $values
* @param array $validationGroup
*
* @return array|mixed|void
*/
public function bindValues(array $values = [])
public function bindValues(array $values = [], array $validationGroup = null)
{
$collection = [];
foreach ($values as $name => $value) {
$element = $this->get($name);

if ($element instanceof FieldsetInterface) {
$collection[] = $element->bindValues($value);
$collection[] = $element->bindValues($value, $validationGroup);
} else {
$collection[] = $value;
}
Expand Down
10 changes: 8 additions & 2 deletions src/Fieldset.php
Original file line number Diff line number Diff line change
Expand Up @@ -557,9 +557,11 @@ public function allowValueBinding()
* Bind values to the bound object
*
* @param array $values
* @param array $validationGroup
*
* @return mixed|void
*/
public function bindValues(array $values = [])
public function bindValues(array $values = [], array $validationGroup = null)
{
$objectData = $this->extract();
$hydrator = $this->getHydrator();
Expand All @@ -568,6 +570,10 @@ public function bindValues(array $values = [])
foreach ($this->iterator as $element) {
$name = $element->getName();

if ($validationGroup && (array_key_exists($name, $validationGroup) || !in_array($name, $validationGroup))) {
continue;
}

if (!array_key_exists($name, $values)) {
if (!($element instanceof Collection)) {
continue;
Expand All @@ -579,7 +585,7 @@ public function bindValues(array $values = [])
$value = $values[$name];

if ($element instanceof FieldsetInterface && $element->allowValueBinding()) {
$value = $element->bindValues($value);
$value = $element->bindValues($value, empty($validationGroup[$name]) ? null : $validationGroup[$name]);
}

// skip post values for disabled elements, get old value from object
Expand Down
5 changes: 3 additions & 2 deletions src/Form.php
Original file line number Diff line number Diff line change
Expand Up @@ -357,13 +357,14 @@ public function bindValues(array $values = [])
}

$data = $this->prepareBindData($data, $this->data);
$validationGroup = $this->getValidationGroup();

// If there is a base fieldset, only hydrate beginning from the base fieldset
if ($this->baseFieldset !== null) {
$data = $data[$this->baseFieldset->getName()];
$this->object = $this->baseFieldset->bindValues($data);
$this->object = $this->baseFieldset->bindValues($data, $validationGroup[$this->baseFieldset->getName()]);
} else {
$this->object = parent::bindValues($data);
$this->object = parent::bindValues($data, $validationGroup);
}
}

Expand Down
29 changes: 29 additions & 0 deletions test/FormTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,35 @@ public function testSettingValidationGroupBindsOnlyThoseValuesToModel()
$this->assertObjectNotHasAttribute('foobar', $model);
}

public function testSettingValidationGroupWithoutCollectionBindsOnlyThoseValuesToModel()
{
$model = new stdClass;
$dataWithoutCollection = [
'foo' => 'abcde'
];
$this->populateForm();
$this->form->add([
'type' => 'Zend\Form\Element\Collection',
'name' => 'categories',
'options' => [
'count' => 0,
'target_element' => [
'type' => 'ZendTest\Form\TestAsset\CategoryFieldset'
]
]
]);
$this->form->setHydrator(new Hydrator\ObjectProperty());
$this->form->bind($model);
$this->form->setData($dataWithoutCollection);
$this->form->setValidationGroup(['foo']);
$this->form->isValid();

$this->assertObjectHasAttribute('foo', $model);
$this->assertEquals('abcde', $model->foo);
$this->assertObjectNotHasAttribute('categories', $model);
$this->assertObjectNotHasAttribute('foobar', $model);
}

public function testCanBindModelsToArraySerializableObjects()
{
$model = new TestAsset\Model();
Expand Down

0 comments on commit 2674c45

Please sign in to comment.