如何将参数传递给Zend Form Collection实例&如何在ZF2中设置自定义Fieldset标签?

时间:2016-01-30 10:46:22

标签: php zend-framework2 zend-form

我试图了解并解决整个表单集合的问题,但文档并不是非常广泛,我只是无法找到如何做一些我需要的具体事情。 / p>

我将参考official manual中的示例来解释我需要的内容:

  1. 创建集合后,您可以使用自定义字段集作为目标:

    $this->add(array( 'type' => 'Zend\Form\Element\Collection', 'name' => 'categories', 'options' => array( 'label' => 'Please choose categories for this product', 'count' => 2, 'should_create_template' => true, 'template_placeholder' => '__placeholder_:', **'target_element' => array( 'type' => 'Application\Form\CategoryFieldset', )**, ), ));

  2. 但是,我需要将一个参数传递给特定的fieldset的构造函数,在我的例子中是一个翻译器实例,以便能够在fieldset中进行翻译。

    class CategoryFieldset extends Fieldset { public function __construct($translator) }

    1. Fieldset的标签:正如您在示例中所看到的,该集合输出具有相同指定标签"类别"的字段集的所有副本。相反,我需要将该标签编号,以显示"类别1","类别2"等等根据收集计数。这甚至可能吗? Form collection example
    2. 感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

我检查了Collection的来源。 Collection只是克隆了target_element。我的解决方案很简单,有效:

class CategoryFieldset extends Fieldset implements InputFilterProviderInterface
{
    static $lp = 1;// <-----------  add this line

    public function __clone() //<------------ add this method
    {
        parent::__clone(); 
        $oldLabel = $this->elements['name']->getLabel();
        $this->elements['name']->setLabel($oldLabel . ' ' . self::$lp++);
    }

答案 1 :(得分:0)

对于第一个,不要将翻译器传递给Fieldset,而是使用Fieldset之外的翻译器。首先从表单中获取值,翻译它们,然后将它们重新设置为表单。奖金是您将表单和翻译逻辑分开。

对于第二个,请使用$form->prepare(),然后迭代Collection

$form->prepare(); //clones collection elements

$collection = $form->get('YOUR_COLLECTION_ELEMENT_NAME');
foreach ($collection as $fieldset)
    $fieldset->get('INDIVIDUAL_ELEMENT_NAME')->setLabel("WHATEVER YOU WANT");

示例:

/*
 * In your model or controller:
 */
$form->prepare();

$collection = $form->get('categories');
foreach ($collection as $fieldset)
{
    $label = $fieldset->get('name')->getLabel();
    $translatedLabel = $translator->translate($label);
    $fieldset->get('name')->setLabel($translatedLabel);
}