我试图了解并解决整个表单集合的问题,但文档并不是非常广泛,我只是无法找到如何做一些我需要的具体事情。 / p>
我将参考official manual中的示例来解释我需要的内容:
创建集合后,您可以使用自定义字段集作为目标:
$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',
)**,
),
));
但是,我需要将一个参数传递给特定的fieldset的构造函数,在我的例子中是一个翻译器实例,以便能够在fieldset中进行翻译。
class CategoryFieldset extends Fieldset
{
public function __construct($translator)
}
答案 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);
}