我需要在October Cms后端表单(fields.yaml)中创建一个多选表单字段。我应用了以下方法
select_field:
标签:样品
类型:下拉列表
属性:{multiple:'multiple'}
将从模型
调用此字段的选项一切都运行良好但是当我提交表单时,只有第一个选定的选项作为JSON数据插入数据库表文本字段中。我希望存储每个选定的选项。我还在模型中将该字段声明为Jsonable,即受保护的$ jsonable = ['field_name'];
注意:当我使用type作为 checkboxlist 时,它正如我想的那样工作,但我不希望它是复选框列表。我是10月cms的新手,有什么简单的方法..
答案 0 :(得分:1)
您不能使用具有多个值的下拉字段,因为它是为了处理单个值。作为复选框和收音机这就是为什么有checkboxList(我猜)。
但我找到了解决方案。 在fields.yaml中使用partial作为字段类型而不是下拉列表
[nxlog-ce-users] to_syslog_ietf discards \r \n in $Message
使用下面的内容创建一个部分(注意名称属性中的[]这就是它工作的原因!)
但请注意,这只是一个技巧,而只能使用直接的yaml选项分配 https://octobercms.com/docs/backend/forms#field-partial
<?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文件中使用类型:dropdownList,它将起作用。
答案 1 :(得分:0)
daftspunk也提出了一个解决方法:https://github.com/octobercms/october/issues/1829#issuecomment-193018469
答案 2 :(得分:0)
您可以使用“taglist”小部件来执行此操作;-)
答案 3 :(得分:0)
您可以使用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分别放在资产/ js和资产/ css forlder中
答案 4 :(得分:0)
要通过表单处理多对多关系,可以使用多选输入或复选框。
在10月份,有relational form widget和taglist form widget这对夫妇可以处理这种情况。
在fields.yaml中定义以下内容:
hosts1.cmh