ZF2,控制器不会填充附在表格上的水合物体的表格元素

时间:2016-10-10 21:37:09

标签: zend-framework zend-framework2 zend-form

在ZF2中,我有一个包含两个字段集的表单。 2个字段集基本上用于与聚会相关的信息(聚会=人或公司)和电话相关信息。使用类似

的表单的init方法调用字段集
class PhoneRegistrationForm extends RegistrationForm implements InputFilterAwareInterface
{
    public function __construct()
    {
        parent::__construct();

        $this
            ->setAttribute('method', 'post')
            ->setHydrator(new ClassMethods(false))
            ->setObject(new Phone());

        $this->add([
            'type' => 'Zend\Form\Element\Button',
            'name' => 'submitButton',
            'attributes' => [
                'id' => 'submit-phone-button',
                'class' => 'btn2 submit-button',
                'type' => 'submit',
            ],
            'options' => [
                'label' => 'Сохранить',
            ],
        ]);
    }

    public function init()
    {
        $this->add([
            'type' => 'Parties\Forms\Fieldsets\PhoneFieldset',
            'name' => 'phoneFieldset'
        ]);

        $this->add([
            'type' => 'Parties\Forms\Fieldsets\PartyIdAndRolesFieldset',
            'name' => 'partyFieldset'
        ]);
    }
}

在控制器的编辑操作中,我使用数据库中的值创建并保存PhoneObject和PartyObject(PhoneObject和PartyObjects只是getter和setter的集合)。然后我将水合物体设置为场集:

$this->form->get('phoneFieldset')->setObject($phone);
$this->form->get('partyFieldset')->setObject($party);

这是我的问题,如果我将表单实例返回给控制器,表单输入没有来自附加的水合物体的值。

如何使表格输入填充附加到字段集的水合物体的值?

我尝试绑定$this->form->bind($phone),但无济于事。田野集也设置了ClassMethods()水合物。

问题是什么?有线索吗?

编辑:@hooli回答后,这是我使用的字段集的代码。

class PhoneFieldsetFactory extends Fieldset implements InputFilterProviderInterface
{
    public function __invoke(FormElementManager $formElementManager)
    {
        $this
            ->setHydrator(new ClassMethods())
            ->setObject(new Phone());

        $this->add([
            'type' => 'hidden',
            'name' => 'id',
        ]);

        $this->add(
            $formElementManager
                ->get('Parties\Forms\Elements\ContactMechanismTypeSelect',
                    ['mechanismType' => 'телефон'])
        );

        $this->add(
            $formElementManager
                ->get('Parties\Forms\Elements\CountrySelect')
        );

        $this->add(
            $formElementManager
                ->get('Parties\Forms\Elements\ContactMechanismPurposeTypeMultiCheckbox',
                    ['mechanismType' => 'телефон'])
        );

        $this->add([
            'type' => 'text',
            'name' => 'areaCode',
            'attributes' => [
                'id' => 'area-code',
                'placeholder' => '1234',
            ],
            'options' => [
                'label' => 'Код области'
            ],
        ]);

        $this->add([
            'type' => 'text',
            'name' => 'phoneNbr',
            'attributes' => [
                'id' => 'phone-nbr',
                'placeholder' => '1234567890',
            ],
            'options' => [
                'label' => 'Номер телефона',
            ],
        ]);

        $this->add([
            'type' => 'text',
            'name' => 'extension',
            'attributes' => [
                'id' => 'extension',
                'placeholder' => '1234567890',
            ],
            'options' => [
                'label' => 'Добавочный',
            ],
        ]);

        $this->add([
            'type' => 'text',
            'name' => 'comment',
            'attributes' => [
                'id' => 'comment',
                'placeholder' => 'общий телефон организации',
            ],
            'options' => [
                'label' => 'Примечание',
            ],
        ]);

        return $this;
    }
}

2 个答案:

答案 0 :(得分:1)

以下是我对您的问题的理解:

当你宣布这个时:

$this
        ->setAttribute('method', 'post')
        ->setHydrator(new ClassMethods(false))
        ->setObject(new Phone());

当您使用bind方法时,PhoneRegistrationForm对象将填充您的电话对象,但您在该直接PhoneRegistrationForm中没有任何电话对象字段,因为您使用了字段集。

然后你应该更新你的字段集以设置正确的保湿策略。

另外,对于其他字段集,它也是相同的解决方案。

我通常使用教义和实体,但这是相同的逻辑。

答案 1 :(得分:0)

这不是一个非常好的解决方案,请随意提出更好的变化!如果它更好,我会接受你的回答。

经过一天的试验和错误仍然无法弄清楚为什么表单输入不会根据附加到字段集的对象进行填充。不过,我找到了解决方法。

ZF2 Fieldset实现方法populateValues()。如果你使用这样的东西

$this->form->get('neededFieldset')->populateValues(
    $this->form->getHydrator()->extract($objectWhoseValuesWillBeExtracted));

您的表单输入中填充了相应对象的数据。