在Zend Framework 3中填充表单元素的标签或属性

问题描述 投票:1回答:1

我仍然是ZF3的新手,所以请原谅我,如果我在这里提出一个明显的问题,但经过多次搜索,查看源代码并抓头,我似乎无法找到一种明显的方法来用数据填充标签文本来自实体。

基本上,我有一个包含表单元素的表单集合,每个表单元素都存储有一个类型(ID),例如, “商务电话”,“手机”等

有没有办法在表单元素中填充除值之外的任何内容?

编辑(更多信息)

所以,有一个PersonForm,有一个Person Fieldset,其中包含一个Phone Fieldset集合:

$phoneFieldset = new PhoneFieldset($objectManager);

$this->add([
    "type" => Element\Collection::class,
    "name" => "Phones",
    "options" => [
        "count" => 0,
        "should_create_template" => true,
        "allow_add" => true,
        "allow_remove" => true,
        "target_element" => $phoneFieldset
    ],
]);

Phone字段集包含以下元素:

$this->add([
    "name" => "Type_ID",
    "type" => "hidden",
]);

$this->add([
    "name" => "Number",
    "type" => "text",
    "attributes" => [
        "placeholder" => "Enter phone number",
    ],
    "options" => [
        "label" => "Email" // Ideally this would be $entity->getTypeName() for example, which would return the name based on the Type_ID mapped against a constant
    ]
]);
php zend-framework zend-form zend-framework3
1个回答
1
投票

当然,为formCollectionFieldsetCollection元素)添加标签信息与输入元素(Element)(Element docs)几乎相同。

一些例子:

Fieldset添加到Form$this->formCollection($form->get('address'))):文档:https://docs.zendframework.com/zend-form/element/collection/

$this->add(
    [
        'type'     => AddressFieldset::class, // Note: FQCN -> provided by FormElementManager
        'name'     => 'address',
        'required' => true,
        'options'  => [
            'use_as_base_fieldset' => false,
            'label'                => _('Address'),
            'label_options'        => [
                // .. add options for the label, see LabelInterface
            ],
            'label_attributes'        => [
                // .. add attributes for the label, see LabelInterface
            ],
        ],
    ]
);

呈现为:

<fieldset>
    <legend>Address</legend>
    <!-- the inputs / labels of `Element` objects -->
</fieldset>

Collection添加到Form$this->formCollection($form->get('cities'))):文档:https://docs.zendframework.com/zend-form/element/collection/

$this->add(
    [
        'name'       => 'cities',
        'type'       => Collection::class,
        'options'    => [
            'label'                  => _('Cities'),
            'should_create_template' => true,
            'allow_add'              => true,
            'allow_remove'           => true,
            'count'                  => 1,
            'target_element'         => $this->getCityFieldset(), // Must be an instantiated Fieldset (so provide via Factory)
            'label_options'        => [
                // .. add options for the label, see LabelInterface
            ],
            'label_attributes'        => [
                // .. add attributes for the label, see LabelInterface
            ],
        ],
        'attributes' => [
            'class'              => 'fieldset-collection',
            'data-fieldset-name' => _('City'),
        ],
    ]
);

呈现为:

<fieldset class="fieldset-collection" data-fieldset-name="City">
    <legend>Cities</legend>
    <fieldset><!-- add a <legend> using JS here, with the data-fieldset-name of the parent -->
        <!-- the inputs / labels of `Element` objects -->
    </fieldset>
    <span data-template="<!-- contains entire template so you can use JS to create 'add' and 'remove' buttons for additional CityFieldset <fieldset> elements -->"></span>
</fieldset>

我在HTML输出中添加了<!-- comments -->,你可以想出那些;-)


另外,如果您在此示例中使用了ORM,Doctrine,那么您可以这样做:

$this->add(
    [
        'name'       => 'roles',
        'required'   => true,
        'type'       => ObjectMultiCheckbox::class,
        'options'    => [
            'object_manager'     => $this->getObjectManager(),
            'target_class'       => Role::class,
            'property'           => 'id',
            'label'              => _('Roles'),
            'label_generator'    => function ($targetEntity) {
                /** @var Role $targetEntity */
                return $targetEntity->getName();
            },
            'label_options'      => [
                'label_position' => FormRow::LABEL_APPEND,
            ],
            'use_hidden_element' => true,
            'checked_value'      => 1,
            'unchecked_value'    => 0,
        ],
        'attributes' => [
            'class'                => 'form-check-input',
        ],
    ]
);

Doctrine Form Elements docs

© www.soinside.com 2019 - 2024. All rights reserved.