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

Commit

Permalink
Merge pull request #5456 from carnage/master
Browse files Browse the repository at this point in the history
Enable input filter config from annotations to be passed on via composed collections
  • Loading branch information
weierophinney committed Nov 11, 2013
2 parents 7787623 + 78046b9 commit 92b32c2
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 12 deletions.
40 changes: 28 additions & 12 deletions library/Zend/Form/Annotation/ElementAnnotationsListener.php
Expand Up @@ -125,28 +125,44 @@ public function handleComposedObjectAnnotation($e)
$elementSpec = $e->getParam('elementSpec');
$filterSpec = $e->getParam('filterSpec');

// Compose input filter into parent input filter
$inputFilter = $specification['input_filter'];
if (!isset($inputFilter['type'])) {
$inputFilter['type'] = 'Zend\InputFilter\InputFilter';
}
$e->setParam('inputSpec', $inputFilter);
unset($specification['input_filter']);

// Compose specification as a fieldset into parent form/fieldset
if (!isset($specification['type'])) {
$specification['type'] = 'Zend\Form\Fieldset';
}
if ($annotation->isCollection()) {
// Compose specification as a fieldset into parent form/fieldset
if (!isset($specification['type'])) {
//use input filter provider fieldset so we can compose the input filter into the fieldset
//it is assumed that if someone uses a custom fieldset, they will take care of the input
//filtering themselves or consume the input_filter_spec option.
$specification['type'] = 'Zend\Form\InputFilterProviderFieldset';
}

$inputFilter = $specification['input_filter'];
if (!isset($inputFilter['type'])) {
$inputFilter['type'] = 'Zend\InputFilter\InputFilter';
}
unset($specification['input_filter']);

$elementSpec['spec']['type'] = 'Zend\Form\Element\Collection';
$elementSpec['spec']['name'] = $name;
$elementSpec['spec']['options'] = new ArrayObject($annotation->getOptions());
$elementSpec['spec']['options']['target_element'] = $specification;
$elementSpec['spec']['options']['target_element']['options']['input_filter_spec'] = $inputFilter;

if (isset($specification['hydrator'])) {
$elementSpec['spec']['hydrator'] = $specification['hydrator'];
}
} else {
// Compose input filter into parent input filter
$inputFilter = $specification['input_filter'];
if (!isset($inputFilter['type'])) {
$inputFilter['type'] = 'Zend\InputFilter\InputFilter';
}
$e->setParam('inputSpec', $inputFilter);
unset($specification['input_filter']);

// Compose specification as a fieldset into parent form/fieldset
if (!isset($specification['type'])) {
$specification['type'] = 'Zend\Form\Fieldset';
}

$elementSpec['spec'] = $specification;
$elementSpec['spec']['name'] = $name;
}
Expand Down
57 changes: 57 additions & 0 deletions library/Zend/Form/InputFilterProviderFieldset.php
@@ -0,0 +1,57 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\Form;

use Zend\InputFilter\InputFilterProviderInterface;

class InputFilterProviderFieldset extends Fieldset implements InputFilterProviderInterface
{
/**
* Holds the specification which will be returned by getInputFilterSpecification
*
* @var array|Traversable
*/
protected $filterSpec = array();

/**
* @return array|Traversable
*/
public function getInputFilterSpecification()
{
return $this->filterSpec;
}

/**
* @param array|Traversable $filterSpec
*/
public function setInputFilterSpecification($filterSpec)
{
$this->filterSpec = $filterSpec;
}

/**
* Set options for a fieldset. Accepted options are:
* - input_filter_spec: specification to be returned by getInputFilterSpecification
*
* @param array|Traversable $options
* @return Element|ElementInterface
* @throws Exception\InvalidArgumentException
*/
public function setOptions($options)
{
parent::setOptions($options);

if (isset($options['input_filter_spec'])) {
$this->setInputFilterSpecification($options['input_filter_spec']);
}

return $this;
}
}
43 changes: 43 additions & 0 deletions tests/ZendTest/Form/InputFilterProviderFieldsetTest.php
@@ -0,0 +1,43 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace ZendTest\Form;

use PHPUnit_Framework_TestCase as TestCase;
use Zend\Form\InputFilterProviderFieldset;

class InputFilterProviderFieldsetTest extends TestCase
{
public function setUp()
{
$this->fieldset = new InputFilterProviderFieldset();
}

public function testCanSetInputFilterSpec()
{
$filterSpec = array('filter'=>array('filter_options'));

$this->fieldset->setInputFilterSpecification($filterSpec);
$this->assertEquals($filterSpec, $this->fieldset->getInputFilterSpecification());
}

public function testCanSetInputFilterSpecViaOptions()
{
$filterSpec = array('filter'=>array('filter_options'));

$this->fieldset->setOptions(array('input_filter_spec'=>$filterSpec));
$this->assertEquals($filterSpec, $this->fieldset->getInputFilterSpecification());
}

public function testFilterSpecIsInitiallyEmpty()
{
$this->assertEmpty($this->fieldset->getInputFilterSpecification());
}

}

0 comments on commit 92b32c2

Please sign in to comment.