选择选项中的其他属性

时间:2020-07-23 11:59:54

标签: php forms select laminas

在createForm.php中,我有代码:

$this->add([
        'type' => Element\Select::class,
        'name' => 'subcategory_id',
        'options' =>[
                'label' => 'Subcategory',
                'empty_option' => 'Select...',
                'value_options' => $subcategoriesTable->fetchAllSubcategories(),
        ],
        'attributes' => [
                'required' => false,
                'class' => 'custom-select',
        ],
]);

在SubcategoriesTable.php

public function fetchAllSubcategories()
{
        $sqlQuery = $this->sql->select()->order('sub_name ASC');
        $sqlStmt = $this->sql->prepareStatementForSqlObject($sqlQuery);
        $handler = $sqlStmt->execute();

        $row = [];

        foreach($handler as $tuple){
                $row[$tuple['subcategory_id']] = $tuple['sub_name'];
        }
        return $row;
}

并将生成的记录从数据库复制到表单:

<option value="1">Name1</option>

如何更改代码以添加这样的附加属性?

<option value="1" data-chained="parent_name">Name1</option>

父名称值来自另一个选择。也以相同的方式生成。

1 个答案:

答案 0 :(得分:0)

您必须进行一些更改。

cat /etc/group | grep docker 内,您必须检索父级的名称(我使用SubcategoriesTable作为键,因为我们不知道确切的列名是什么。。):

parent_name

然后,在public function fetchAllSubcategories() { $sqlQuery = $this->sql->select()->order('sub_name ASC'); $sqlStmt = $this->sql->prepareStatementForSqlObject($sqlQuery); $handler = $sqlStmt->execute(); $row = []; foreach($handler as $tuple){ $row[$tuple['subcategory_id']] = [ 'sub_name' => $tuple['sub_name'], 'parent_name' => $tuple['parent_name'] ]; } return $row; } 中:

CreateForm

重新阅读您的问题,我发现您需要此值来进行其他选择。我建议您添加父母的ID而不是父母的名字,这样会更容易处理。

例如:

$valueOptions = [];
foreach($subcategoriesTable->fetchAllSubcategories() as $subcategoryId => $subcategory){
    $valueOptions[] = [
        'value' => $subcategoryId,
        'label' => $subcategory['sub_name'],
        'attributes' => [
            'data-chained' => $subcategory['parent_name']
        ]
    ];
}
        
$this->add([
    'type' => Element\Select::class,
    'name' => 'subcategory_id',
    'options' =>[
        'label' => 'Subcategory',
        'empty_option' => 'Select...',
        'value_options' => $valueOptions,
    ],
    'attributes' => [
        'required' => false,
        'class' => 'custom-select',
    ],
]); 

在视图中:

public function formAction() {
    $subcagetoryForm = new Form();
    $subcagetoryForm->add([
        'type' => Select::class,
        'name' => 'subcategory_id',
        'options' => [
            'label' => 'Subcategory',
            'empty_option' => 'Select...',
            'value_options' => [
                [
                    'value' => 1,
                    'label' => 'Name 1',
                    'attributes' => [
                        'data-chained' => 'parent 1'
                    ]
                ],
                [
                    'value' => 2,
                    'label' => 'Name 2',
                    'attributes' => [
                        'data-chained' => 'parent 2'
                    ]
                ]
            ],
        ],
        'attributes' => [
            'required' => false,
            'class' => 'custom-select',
        ],
    ]);
    return [
        'subcagetoryForm' => $subcagetoryForm
    ];
}

结果:

[Generated HTML]

但是,我建议您创建一个自定义元素以从表单中删除所有这些逻辑。如果您需要在另一个表单中使用custom元素,它将很有帮助。您可以看看this question

相关问题