十月 CMS 创建多 select 表单域
October CMS create a multi select Form field
我需要在 October CMS 后端表单 (fields.yaml) 中创建一个多 select 表单域。我应用了以下方法
select_field:
标签:样本
类型:下拉菜单
属性:{多个:'multiple'}
将从模型调用此字段的选项
一切正常,但是当我提交表单时,只有第一个 selected 选项作为 JSON 数据插入到数据库 table 文本字段中。我希望存储每个 selected 选项。我还在模型中将该字段声明为 Jsonable,即 protected $jsonable = ['field_name'];
注意: 当我将类型用作 checkboxlist 时,它按我的想法工作,但我不希望它成为复选框列表。我是十月cms的新手,有什么简单的方法吗..
您不能使用具有多个值的下拉字段,因为它是用来处理单个值的。作为复选框和收音机,这就是为什么有复选框列表(我猜)。
但我找到了解决办法。
在 fields.yaml 中使用部分字段类型而不是下拉列表
https://octobercms.com/docs/backend/forms#field-partial
使用以下内容创建部分内容(注意名称属性中的 [] 这就是它起作用的原因!)
但请注意,这只是一个技巧,您只能使用直接 yaml 选项分配 https://octobercms.com/docs/backend/forms#field-dropdown
<?php
$fieldOptions = $field->options();
//get the field value as an array
$selectedValues = (array)$field->value;
?>
<!-- Dropdown -->
<?php if ($this->previewMode): ?>
<div class="form-control"><?= (isset($fieldOptions[$field->value])) ? e(trans($fieldOptions[$field->value])) : '' ?></div>
<?php else: ?>
<select
id="<?= $field->getId() ?>"
name="<?= $field->getName() ?>[]"
class="form-control custom-select"
<?= $field->getAttributes() ?>>
<?php if ($field->placeholder): ?>
<option value=""><?= e(trans($field->placeholder)) ?></option>
<?php endif ?>
<?php foreach ($fieldOptions as $value => $option): ?>
<?php
if (!is_array($option)) $option = [$option];
?>
<option
<?= in_array($value, $selectedValues) ? 'selected="selected"' : '' ?>
<?php if (isset($option[1])): ?>data-<?=strpos($option[1],'.')?'image':'icon'?>="<?= $option[1] ?>"<?php endif ?>
value="<?= $value ?>">
<?= e(trans($option[0])) ?>
</option>
<?php endforeach ?>
</select>
<?php endif?>
对于 yaml
```
select_field:
label: Sample
type: partial
path:$/author/plugin/models/classfolder/_my_partial.htm
attributes: {multiple:'multiple'}
options:
key:value
key:value
```
更好的方法可能是构建一个小部件或提出拉取请求
有能力的可以摸到核心加
\modules\backend\widgets\form\partials中的相同内容
名字 _field_dropdownlist.htm
然后在 \modules\backend\widgets\form\Form.php 第 630 行
变化:
$optionModelTypes = ['dropdown', 'radio', 'checkboxlist', 'balloon-selector'];
添加不带 _field 或 .htm 的部分名称 ex _field_dropdownlist.htm 成为 dropdowList
$optionModelTypes = ['dropdown', 'radio', 'checkboxlist', 'balloon-selector','dropdowlist'];
现在在你的 yaml 文件中使用 type:dropdownList 就可以了。
daftspunk 也提出了一个解决方法:https://github.com/octobercms/october/issues/1829#issuecomment-193018469
您可以使用 "taglist" 小部件来执行此操作 ;-)
你可以使用 select2 jquery 插件
_widget.htm
<!-- for booking table -->
<select class="form-control" id="sle1" name="Booking[business_car_id]" >
<?php foreach($businesscars as $key => $value): ?>
<option class="form-control" value="<?php echo $key; ?>" >
<?php
echo $value; ?>
</option>
<?php endforeach; ?>
</select>
并把select2.js和select2.css分别放在assets/js和assets/css的forlder中
从这里下载 select 2
https://select2.org/getting-started/basic-usage
要通过表单处理多对多关系,您可以使用多 select 输入或复选框。
在 october cms 中,有几个 relational form widget and taglist form widget 可以处理这种情况。
在 fields.yaml 中定义如下:
# relational form widget
categories: # relationship name defined in the model
label: 'Associated categories'
span: full
required: 1
type: relation
nameFrom: title # db column name to fetch to show the display value
#taglist form widget
categories:
label: 'Associated categories'
span: full
mode: relation
required: 1
type: taglist
nameFrom: title
我需要在 October CMS 后端表单 (fields.yaml) 中创建一个多 select 表单域。我应用了以下方法
select_field:
标签:样本
类型:下拉菜单
属性:{多个:'multiple'}
将从模型调用此字段的选项
一切正常,但是当我提交表单时,只有第一个 selected 选项作为 JSON 数据插入到数据库 table 文本字段中。我希望存储每个 selected 选项。我还在模型中将该字段声明为 Jsonable,即 protected $jsonable = ['field_name'];
注意: 当我将类型用作 checkboxlist 时,它按我的想法工作,但我不希望它成为复选框列表。我是十月cms的新手,有什么简单的方法吗..
您不能使用具有多个值的下拉字段,因为它是用来处理单个值的。作为复选框和收音机,这就是为什么有复选框列表(我猜)。
但我找到了解决办法。 在 fields.yaml 中使用部分字段类型而不是下拉列表
https://octobercms.com/docs/backend/forms#field-partial
使用以下内容创建部分内容(注意名称属性中的 [] 这就是它起作用的原因!)
但请注意,这只是一个技巧,您只能使用直接 yaml 选项分配 https://octobercms.com/docs/backend/forms#field-dropdown
<?php
$fieldOptions = $field->options();
//get the field value as an array
$selectedValues = (array)$field->value;
?>
<!-- Dropdown -->
<?php if ($this->previewMode): ?>
<div class="form-control"><?= (isset($fieldOptions[$field->value])) ? e(trans($fieldOptions[$field->value])) : '' ?></div>
<?php else: ?>
<select
id="<?= $field->getId() ?>"
name="<?= $field->getName() ?>[]"
class="form-control custom-select"
<?= $field->getAttributes() ?>>
<?php if ($field->placeholder): ?>
<option value=""><?= e(trans($field->placeholder)) ?></option>
<?php endif ?>
<?php foreach ($fieldOptions as $value => $option): ?>
<?php
if (!is_array($option)) $option = [$option];
?>
<option
<?= in_array($value, $selectedValues) ? 'selected="selected"' : '' ?>
<?php if (isset($option[1])): ?>data-<?=strpos($option[1],'.')?'image':'icon'?>="<?= $option[1] ?>"<?php endif ?>
value="<?= $value ?>">
<?= e(trans($option[0])) ?>
</option>
<?php endforeach ?>
</select>
<?php endif?>
对于 yaml
```
select_field:
label: Sample
type: partial
path:$/author/plugin/models/classfolder/_my_partial.htm
attributes: {multiple:'multiple'}
options:
key:value
key:value
```
更好的方法可能是构建一个小部件或提出拉取请求 有能力的可以摸到核心加
\modules\backend\widgets\form\partials中的相同内容 名字 _field_dropdownlist.htm
然后在 \modules\backend\widgets\form\Form.php 第 630 行 变化:
$optionModelTypes = ['dropdown', 'radio', 'checkboxlist', 'balloon-selector'];
添加不带 _field 或 .htm 的部分名称 ex _field_dropdownlist.htm 成为 dropdowList
$optionModelTypes = ['dropdown', 'radio', 'checkboxlist', 'balloon-selector','dropdowlist'];
现在在你的 yaml 文件中使用 type:dropdownList 就可以了。
daftspunk 也提出了一个解决方法:https://github.com/octobercms/october/issues/1829#issuecomment-193018469
您可以使用 "taglist" 小部件来执行此操作 ;-)
你可以使用 select2 jquery 插件
_widget.htm
<!-- for booking table -->
<select class="form-control" id="sle1" name="Booking[business_car_id]" >
<?php foreach($businesscars as $key => $value): ?>
<option class="form-control" value="<?php echo $key; ?>" >
<?php
echo $value; ?>
</option>
<?php endforeach; ?>
</select>
并把select2.js和select2.css分别放在assets/js和assets/css的forlder中
从这里下载 select 2 https://select2.org/getting-started/basic-usage
要通过表单处理多对多关系,您可以使用多 select 输入或复选框。
在 october cms 中,有几个 relational form widget and taglist form widget 可以处理这种情况。
在 fields.yaml 中定义如下:
# relational form widget
categories: # relationship name defined in the model
label: 'Associated categories'
span: full
required: 1
type: relation
nameFrom: title # db column name to fetch to show the display value
#taglist form widget
categories:
label: 'Associated categories'
span: full
mode: relation
required: 1
type: taglist
nameFrom: title