【问题标题】:ZF2 Nested Collection element has no valueZF2 嵌套集合元素没有值
【发布时间】:2014-09-06 15:56:18
【问题描述】:

我创建了一个表单,其中包含嵌套的 Collection Customer(Form) -> Categories(Collection/Fieldset) -> Tags(Collection/Fieldset)。

它是: 一个(客户)-> 许多(类别) 一个(Catogrie)-> 许多(标签)

将客户绑定到表单后,看起来一切正常。 Hydrator 获取在标签中创建的对象和元素。

但是在视图中标签元素没有价值......

我检查了 Hydrator 是否有拼写错误,但一切都很好,我复制/粘贴索引以确保。当我 var_dump 标记集合时,具有值的对象被绑定。

我真的不知道错误在哪里,这就是为什么我不在这里输入一些代码的原因,我认为它会太多。当您有想法时,我可以向您展示您猜测错误所在的代码。

您好。

铁加。

编辑:

好的,我会尽力为您提供可读的代码:)

class KontakteController extends AbstractActionController {



public function getKontaktAction()
{
    $formManager = $this->serviceLocator->get('FormElementManager');
    $kontaktForm = $formManager->get('KontakteManager\Form\KontakteForm');

    $id = $this->params()->fromRoute('id');
    $kontakt = $this->getKontakte()->getKontakt($id);
    if (!$id || !$kontakt) {
        return $this->redirect()->toRoute('kontakte', array(
            'action' => 'addKontakt'
        ));
    }

    $kontakt->initFirmaKommunikation($this->getKommunikation());
    $kontakt->initAdressen($this->getAdressen());
    $kontakt->initAnsprechpartner($this->getKontakte());
    $kontakt->initBankverbindungen($this->getBankverbindung());
    $kontakt->initFirmaKategorien($this->getKontakteKategorie());
    $kontakt->initPersonKategoiern($this->getKontakteKategorie());
    $kontaktForm->bind($kontakt);

    return new ViewModel(array(
        'kontaktForm'       => $kontaktForm,
        'geloescht'         => $kontakt->geloescht,
        'tags'              => $this->ladeTags(),
    ));
}

客户字段集:

class KontakteForm extends Form implements InputFilterProviderInterface {


public function __construct()
{
    parent::__construct('kontakt');

    $this->setHydrator(new KontaktHydrator())
        ->setObject(new Kontakt());

    $this->add(array(
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'firmaKategorien',
        'options' => array(
            'count' => 0,
            'allow_add'      => true,
            'allow_remove'   => true,
            'should_create_template' => false,
            'target_element' => array(
                'type' => 'KontakteManager\Form\KontaktKategorieFieldset'
            )
        )
    ));

}

/**
 * @return array
\*/
public function getInputFilterSpecification()
{
    return array();
}

类别字段集:

class KontaktKategorieFieldset extends Fieldset {

public function __construct()
{
    parent::__construct('kontakteKategorie');
    $this->setHydrator(new KontaktKategorieFieldsetHydrator())
        ->setObject(new KontaktKategorie());

    $this->add(array(
        'name' => 'id',
        'type' => 'Zend\Form\Element\Hidden',
        'attributes' => array(
            'class' => 'form-control',
        ),
    ));

    $this->add(array(
        'name' => 'bezeichnung',
        'type' => 'Zend\Form\Element\Text',
        'attributes' => array(
            'class' => 'form-control',
        ),
        'options'   => array(
            'label' => 'Kategorie',
        ),
    ));

    $this->add(array(
        'type' => 'Zend\Form\Element\Collection',
        'name' => 'tags',
        'options' => array(
            'count' => 0,
            'allow_add'      => true,
            'allow_remove'   => true,
            'should_create_template' => false,
            'target_element' => array(
                'type' => 'KontakteManager\Form\TagFieldset'
            )
        )
    ));

} 

还有 TagFielset:

class TagFieldset extends Fieldset implements InputFilterProviderInterface {

public function __construct()
{
    parent::__construct('Tag');
    $this->setHydrator(new TagHydrator())
        ->setObject(new Tag());

    $this->add(array(
        'name' => 'id',
        'type' => 'Zend\Form\Element\Hidden',
        'attributes' => array(
            'class' => 'form-control',
        ),
    ));

    $this->add(array(
        'name' => 'mehrsprachig',
        'type' => 'Zend\Form\Element\Hidden',
        'attributes' => array(
            'class' => 'form-control',
        ),
        'options'   => array(
            'label' => 'Mehrsprachig',
        ),
    ));

    $this->add(array(
        'name' => 'kategorieID',
        'type' => 'Zend\Form\Element\Hidden',
        'attributes' => array(
            'class' => 'form-control',
        ),
    ));

    $this->add(array(
        'name' => 'bezeichnung',
        'type' => 'Zend\Form\Element\Text',
        'attributes' => array(
            'class'     => 'form-control',
            'readonly'  => 'readonly',
        ),
        'options'   => array(
            'label' => 'Bezeichnung',
        ),
    ));
}


/**
 * @return array
\*/
public function getInputFilterSpecification()
{
    return array();
}

以及查看代码我如何尝试显示集合

                        <h5 class="text-primary"><strong>Kategorien</strong></h5>
                    <hr>
                    <?php foreach($kontaktForm->get('firmaKategorien') as $element): ?>
                    <div class="row">
                        <div class="col-lg-12">
                            <div class="col-lg-6">
                                <?php echo $this->formElement($element->get('bezeichnung')); ?>
                            </div>
                            <div class="col-lg-6">
                                <?php foreach($element->get('tags') as $tag): ?>
                                    <?php echo $this->formElement($tag->get('bezeichnung')); ?>
                                <?php endforeach; ?>
                            </div>
                        </div>
                    </div>
                    <?php endforeach; ?>

这里是一个示例结果:

<h5 class="text-primary"><strong>Kategorien</strong></h5>
<hr>
<div class="row">
<div class="col-lg-12">
    <div class="col-lg-6">
        <input type="text" name="firmaKategorien[0][bezeichnung]" class="form-control" value="Druckerei">
    </div>
    <div class="col-lg-6">
        <input type="text" name="firmaKategorien[0][tags][0][bezeichnung]" class="form-control" readonly="readonly" value="">
        <input type="text" name="firmaKategorien[0][tags][1][bezeichnung]" class="form-control" readonly="readonly" value="">
    </div>
</div>

【问题讨论】:

  • 一些代码会很有用:)
  • 这对您有帮助吗? :)
  • 控制器呢?
  • 完成 :) 我也添加了一个示例结果。我希望这能帮助你帮助我:D

标签: php forms collections zend-framework2


【解决方案1】:

看看这是否会做出任何改变

$kontaktForm->bind($kontakt);
//Add this line
$kontaktForm->setData((Array)$kontakt);

请发回您收到的错误

【讨论】:

  • 您确定 $kontakt 包含数据吗?
  • 是的,表单的其余部分包含正确的数据,只是缺少标签值。只需检查那里的示例结果,您就可以看到有数据......当我 var_dump the tagsCollection 时我很伤心,我可以看到正确的对象已绑定
  • 我想我找到了产生错误的地方。我更深入地检查了 Fieldset->extract() 的工作原理。当我跟踪这个过程时,我看到“标签”将被提取,但返回的数组不会保存在“firmaKategorie”中......但我不知道为什么......
  • 好的,它的值为空,因为没有保存。
  • 如果您使用的是 composer run update,我就这样做了,它为我解决了这个问题。不幸的是,不确定是什么导致了这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
相关资源
最近更新 更多