ZF2形式和教义2修改value_options(ZF2 Form and Doctrine 2 m

2019-10-21 09:29发布

我在我的Zend Framework 2项目使用Doctrine 2。 我现在已经创建了一个表格,并创建从数据库值我下拉框之一。 我现在的问题是,我想改变使用该值,而不是一个我回来从我的存储库。 好吧,这里的一些代码以便更好地理解:

$this->add(
            array(
                    'type' => 'DoctrineModule\Form\Element\ObjectSelect',
                    'name' => 'county',

                    'options' => array(
                            'object_manager' => $this->getObjectManager(),
                            'label' => 'County',
                            'target_class'   => 'Advert\Entity\Geolocation',
                            'property'       => 'county',
                            'is_method' => true,
                            'empty_option' => '--- select county ---',
                            'value_options'=> function($targetEntity) {
                                $values = array($targetEntity->getCounty() => $targetEntity->getCounty());
                                return $values;
                            },

                            'find_method'        => array(
                                    'name'   => 'getCounties',
                            ),
                    ),
                    'allow_empty'  => true,
                    'required'     => false,
                    'attributes' => array(
                            'id' => 'county',
                            'multiple' => false,
                    )
            )
    ); 

我要为我的选择是县名,而不是ID值。 我以为我会需要“value_options”,这需要一个数组。 我试了一下上面的一样,但得到的

错误消息: 传递给Zend的\表格\元素\选择:: setValueOptions(参数1)必须是类型的阵列,对象给出

这是可能的呢?

Answer 1:

我要建议修改你的代码,虽然检查后ObjectSelect代码,我很惊讶,(据我可以告诉),这实际上不可能不扩展类。 这是因为该值总是从ID生成 。

我创建使用的工厂 (不包括所有的表单元素ObjectSelect ),尤其是复杂的,需要不同的列表。

另一种解决方案

首先创建一个返回正确的数组存储库的新方法。 这将允许你重用你应该需要任何其他地方同样的方法(不只是形式!)。

class FooRepository extends Repository
{
    public function getCounties()
    {
        // normal method unchanged, returns a collection
        // of counties
    }

    public function getCountiesAsArrayKeyedByCountyName()
    {
        $counties = array();
        foreach($this->getCounties() as $county) {
            $counties[$county->getName()] = $county->getName();
        }
        return $counties;
    }
}

接下来创建一个自定义选择的一家工厂,将值设置选项供您。

namespace MyModule\Form\Element;

use Zend\Form\Element\Select;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\FactoryInterface;

class CountiesByNameSelectFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $formElementManager)
    {
        $element = new Select;
        $element->setValueOptions($this->loadValueOptions($formElementManager));

        // set other select options etc
        $element->setName('foo')
                ->setOptions(array('foo' => 'bar'));

        return $element;
    }

    protected function loadValueOptions(ServiceLocatorInterface $formElementManager)
    {
        $serviceManager = $formElementManager->getServiceLocator();
        $repository = $serviceManager->get('DoctrineObjectManager')->getRepository('Foo/Entity/Bar');

        return $repository->getCountiesAsArrayKeyedByCountyName();
    }

}

通过添加新条目注册与服务管理的新元素Module.phpmodule.config.php

// Module.php
public function getFormElementConfig()
{
    return array(
        'factories' => array(
            'MyModule\Form\Element\CountiesByNameSelect'
                => 'MyModule\Form\Element\CountiesByNameSelectFactory',
        ),
    );
}

最后改变形式和删除当前选择元素,并添加新的(使用你的服务管理作为类型键注册的名称)

$this->add(array(
    'name' => 'counties',
    'type' => 'MyModule\Form\Element\CountiesByNameSelect',
));

这似乎是很多更多的代码(因为它),但是你会从它是关注一个更清晰的分离中获益,你现在可以重用在多个表单元素,只需要配置它在一个地方。



文章来源: ZF2 Form and Doctrine 2 modify the value_options