【问题标题】:Zf2 - Set value in element inside collectionZf2 - 在集合内的元素中设置值
【发布时间】:2013-11-26 12:30:32
【问题描述】:

我有一个用于表单的集合,我知道如果我想在我使用的普通元素中设置一个值:

$form->get('submit')->setValue('Update');

如何在集合“我使用 zend Framework 2”中的“地址“例如”字段中设置值。

$companies = $this->getCompaniesTable()->getCompanies($id);
$form = new CompaniesForm();
$form->bind($companies);
$form->get('submit')->setValue('Update');
$form->get('submit')->setValue('Update');
$form->get('address')->setValue('test address');

上一页的最后一行。代码不起作用,怎么了?!

表格代码为:

<?php

namespace Companies\Form;

//use Zend\Form\Element;
use Zend\Form\Form;

class CompaniesForm extends Form {

    public function __construct($name = null) {
        parent::__construct('companies');
        $this->setAttribute('method', 'post');
        $this->setAttribute('enctype', 'multipart/form-data');

        $this->add(array(
            'name' => 'id',
            'type' => 'Hidden'
        ));

        $this->add(array(
            'name' => 'name',
            'type' => 'Text'
        ));

        // address field
        $this->add(array(
            'type' => 'Zend\Form\Element\Collection',
            'name' => 'address',
            'options' => array(
                'count' => 1,
                'should_create_template' => false,
                'allow_add' => true,
                'template_placeholder' => '__placeholder__',
                'target_element' => array(
                    'type' => 'Companies\Form\AddressFieldset'
                )
            ),
        ));
        // address field

        // email field
        $this->add(array(
            'name' => 'email',
            'type' => 'text',
            'options' => array('label' => 'Email:'),
        ));

        $this->add(array(
            'name' => 'submit',
            'type' => 'Submit',
            'attributes' => array(
                'value' => 'Go',
                'id' => 'submitbutton'
            )
        ));
    }

}

addressFieldset 文件:

<?php

namespace Companies\Form;

use Companies\Entity\Address;
use Zend\Form\Fieldset;
use Zend\InputFilter\InputFilterProviderInterface;
use Zend\Stdlib\Hydrator\ClassMethods as ClassMethodsHydrator;

class AddressField {

    /**
     * @var string
      \ */
    protected $name;

    /**
     * @param string $name
     * @return Address
      \ */
    public function setName($name) {
        $this->name = $name;
        return $this;
    }

    /**
     * @return string
      \ */
    public function getName() {
        return $this->name;
    }

}

class AddressFieldset extends Fieldset implements InputFilterProviderInterface {

    public function __construct() {
        parent::__construct('Address');
        $this->setHydrator(new ClassMethodsHydrator(false))->setObject(new AddressField());

        $this->add(array(
            'name' => 'name',
            'options' => array(
                'label' => 'Address: '
            )
        ));
    }

    /**
     * @return array
      \ */
    public function getInputFilterSpecification() {
        return array(
            'name' => array(
                //'required' => true,
            )
        );
    }

}

【问题讨论】:

  • 如果您不提供表单代码,则无法回答。
  • 我在上面的帖子中添加了表单代码。
  • 您到底想改变什么? ;) Phone-Fieldsets 之一的某个值?这有点重要^^
  • 这是 AddressFieldset 而不是 TelephoneFieldset “我错了”,所以我想更改地址字段之一。
  • 问题到底是什么目的?在这种情况下,集合是字段集的数组。因此,如果要更改值,则需要更改字段集。更改 MULTIPLE 呈现的字段集中的一个的单个值有点糟糕(然后是巨大的设计缺陷)。

标签: php zend-framework2


【解决方案1】:

您需要将集合作为表单中的元素,并获得集合的字段集列表。 在你看来:

$collection = $form->get('address');
$fieldSets = $collection->getFieldsets();

// In your example you use one element as field set count = 1
// I guess you want to change field named address in your collection of the same name

$address = $fieldSets[0]->get('address');
$address->setValue('test adress');

//If you have more field sets in your collection for example count = 3 and you want this    
//value for all of them just iterate your field sets.

foreach($fieldsets as $fieldset){
    $fieldset->get('address')->setValue('test adress');
}

【讨论】:

  • 在表单中找不到[address]名称的元素,行错误:$address = $fieldSets[0]->get('address');
  • 您的姓名“地址”集合中有元素吗?请向我们展示 Companies\Form\AddressFieldset
  • 我现在在原帖中添加了“地址字段集文件”
  • 您在字段集AddressFieldset 中具有标签地址的元素具有“名称”的name。将其更改为“地址”并再次检查我的代码。
  • 这个 hacky 解决方案确实有效,但它只是错误的方法:S 这根本不需要。但如果它有效,我该判断谁;)
【解决方案2】:

您可以使用 Form populateValues() 而不是 setValue() 方法来执行此操作:http://framework.zend.com/apidoc/2.3/classes/Zend.Form.Form.html#populateValues

所以在你的情况下,你应该把你的控制器:

$form = new CompaniesForm();
$addresses = array(
    array(
        'name' => 'address field 1 name'
    ),
    array(
        'name' => 'address field 2 name'
    ),
);
$form->get('address')->populateValues($addresses);

例如,您可以使用数据库中的数据生成地址数组。

【讨论】:

    【解决方案3】:

    好的,看来这里有些事情搞混了。您尝试在EditForm 中手动分配字段值。这……不好。

    想象一个简单的表单

    UserForm
       textInput ("name")
       textInput ("surname")
       numberInput ("age")
    

    现在您要编辑User。所以你从数据库中获取数据

    //$userData = $db->get('userdata')...
    $userData = array(
        'name'    => 'Peter',
        'surname' => 'Parker',
        'age'     => 23
    );
    

    要将现有值放入表单中,您只需将 FORM 设置到此数据中即可。

    $form->setData($userData);
    

    仅此而已。在您的情况下,显然数据结构有点不同且更困难。您必须有一个可以使用$form-&gt;bind() 的主对象,或者需要修改使用$form-&gt;setData() 将表单数据设置为的数组。在您的情况下,这将是:

    $data = array(
        'id' => 1, // your objects id
        'name' => 'someName',
        'email' => 'foo@bar.baz',
        'address' => array(
            0 => array(
                'streetName'   => 'FooStreet',
                'streetNumber' => 42
            ),
            1 => array(
                'streetName'   => 'OofStreet',
                'streetNumber' => 24
            ),
        )
    )
    

    当您使用上述情况执行$form-&gt;setData($data) 时,您的表单将预先填充来自数组的数据。当然,您必须从数据库中获取数据,而不是手动编写数组。

    【讨论】:

    • 我使用 $form->bind($companies);在其他模块中没有集合也没有多表但我不知道如何在这里使用它时,是否有针对这种情况的完整示例教程?
    • 您的公司对象需要有一个getAddress() 函数,该函数返回AddressFieldset 需要的对象数组。
    • 我写这个code foreach ($addresses as $address) { $companies->address = $address; } code $form->bind($companies); 之前它被添加到 $companies 但没有读取它的表单。
    【解决方案4】:

    如果您想在控制器中执行此操作,则使用 getTargetElement() 将返回集合中分配的元素或字段集。

    $fieldset = $form->get('parent_fieldset');
    $collection = $fieldset->get('collection');
    $collectionFieldset = $collection->getTargetElement();
    $collectionFieldset->get('element')->setValue($value);
    

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 1970-01-01
      • 1970-01-01
      • 2014-12-23
      • 2016-08-17
      • 1970-01-01
      • 2013-10-18
      • 2014-06-02
      • 1970-01-01
      相关资源
      最近更新 更多