Как передать аргумент экземпляру Zend Form Collection и как установить пользовательские метки Fieldset в ZF2?

Я пытаюсь понять и обойти всю эту коллекцию форм, но документация на самом деле не обширна, и я просто не могу понять, как делать некоторые конкретные вещи, которые мне нужны.

Я буду ссылаться на пример в официальном руководстве, чтобы объяснить, что мне нужно:

  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', )**, ), ));

Однако мне нужно передать аргумент конструктору определенного набора полей, в моем случае - экземпляру переводчика, чтобы иметь возможность выполнять перевод в пределах набора полей.

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

  1. Метка набора полей: как видно из примера, коллекция выводит все копии набора полей с той же указанной меткой "Категория". Вместо этого мне нужно, чтобы этот ярлык был пронумерован, чтобы отображались "Категория 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);
}
Другие вопросы по тегам