Как передать аргумент экземпляру Zend Form Collection и как установить пользовательские метки Fieldset в ZF2?
Я пытаюсь понять и обойти всю эту коллекцию форм, но документация на самом деле не обширна, и я просто не могу понять, как делать некоторые конкретные вещи, которые мне нужны.
Я буду ссылаться на пример в официальном руководстве, чтобы объяснить, что мне нужно:
Когда коллекция создана, вы можете использовать пользовательский набор полей в качестве цели:
$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', )**, ), ));
Однако мне нужно передать аргумент конструктору определенного набора полей, в моем случае - экземпляру переводчика, чтобы иметь возможность выполнять перевод в пределах набора полей.
class CategoryFieldset extends Fieldset
{
public function __construct($translator)
}
- Метка набора полей: как видно из примера, коллекция выводит все копии набора полей с той же указанной меткой "Категория". Вместо этого мне нужно, чтобы этот ярлык был пронумерован, чтобы отображались "Категория 1", "Категория 2" и т. Д. В зависимости от количества в коллекции. Это вообще возможно?
Спасибо за вашу помощь!
2 ответа
Я проверил источник Коллекции. Коллекция просто клонирует 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++);
}
Во-первых, не передавайте переводчик в 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);
}