Browse Source

修复当存在多个字段时,radio动态显示异常的问题

master
李可松 4 years ago
parent
commit
3137d89053
  1. 143
      app/Admin/Extensions/Form/Radio2.php
  2. 7
      app/AdminSupplier/Controllers/DiyFormController.php

143
app/Admin/Extensions/Form/Radio2.php

@ -0,0 +1,143 @@
<?php
namespace App\Admin\Extensions\Form;
use Dcat\Admin\Form\Field\Radio;
use Dcat\Admin\Widgets\Radio as WidgetRadio;
/**
* 由于信息收集表单中,hasMany中的radio存在多个时出现问题,故重写覆盖
* Class Radio2
* @package App\Admin\Extensions\Form
*/
class Radio2 extends Radio
{
protected $view = 'admin::form.radio';
/**
* {@inheritdoc}
*/
public function render()
{
if ($this->options instanceof \Closure) {
$this->options(
$this->options->call($this->values(), $this->value(), $this)
);
}
$this->addCascadeScript();
$radio = WidgetRadio::make($this->getElementName(), $this->options, $this->style);
if ($this->attributes['disabled'] ?? false) {
$radio->disable();
}
$radio
->inline($this->inline)
->check($this->value())
->class($this->getElementClassString())
->size($this->size);
$this->addVariables([
'radio' => $radio,
]);
return parent::render();
}
/**
* Add cascade scripts to contents.
*
* @return string
*/
protected function getCascadeScript()
{
if (empty($this->conditions)) {
return;
}
$cascadeGroups = collect($this->conditions)->map(function ($condition) {
return [
'class' => $this->getCascadeClass($condition['value'], $condition['operator']),
'operator' => $condition['operator'],
'value' => $condition['value'],
];
})->toJson();
return <<<JS
(function () {
var compare = function (a, b, o) {
if (! $.isArray(b)) {
return operator_table[o](a, b)
}
if (o === '!=') {
var result = true;
for (var i in b) {
if (! operator_table[o](a, b[i])) {
result = false;
break;
}
}
return result;
}
for (var i in b) {
if (operator_table[o](a, b[i])) {
return true;
}
}
};
var operator_table = {
'=': function(a, b) {
if ($.isArray(a) && $.isArray(b)) {
return $(a).not(b).length === 0 && $(b).not(a).length === 0;
}
return String(a) === String(b);
},
'>': function(a, b) {
return a > b;
},
'<': function(a, b) {
return a < b;
},
'>=': function(a, b) { return a >= b; },
'<=': function(a, b) { return a <= b; },
'!=': function(a, b) {
return ! operator_table['='](a, b);
},
'in': function(a, b) { return Dcat.helpers.inObject(a, String(b), true); },
'notIn': function(a, b) { return ! Dcat.helpers.inObject(a, String(b), true); },
'has': function(a, b) { return Dcat.helpers.inObject(b, String(b), true); },
};
var cascade_groups = {$cascadeGroups}, event = '{$this->cascadeEvent}';
\$this.on(event, function (e) {
{$this->getFormFrontValue()}
cascade_groups.forEach(function (event) {
var group = $(e.target).closest('.form-group.form-field').next('div.cascade-group.'+event.class);
if (compare(checked, event.value, event.operator)) {
group.removeClass('d-none');
} else {
group.addClass('d-none');
}
});
}).trigger(event);
})();
JS;
}
/**
* @return string
*/
protected function getFormFrontValue()
{
return <<<JS
var checked = $('{$this->getElementClassSelector()}:checked').val();
JS;
}
}

7
app/AdminSupplier/Controllers/DiyFormController.php

@ -2,6 +2,7 @@
namespace App\AdminSupplier\Controllers;
use App\Admin\Extensions\Form\Radio2;
use App\AdminSupplier\Repositories\DiyForm;
use Dcat\Admin\Admin;
use Dcat\Admin\Form;
@ -80,6 +81,7 @@ class DiyFormController extends AdminController
*/
protected function form()
{
Form::extend('radio2', Radio2::class);
return Form::make(new DiyForm(['fields']), function (Form $form) {
$form->disableViewButton();
@ -93,9 +95,10 @@ class DiyFormController extends AdminController
$form->hasMany('fields', function (Form\NestedForm $form) {
$form->text('field', '字段名称')->required();
$form->switch('required', '是否必填')->default(1)->required();
$form->radio('type', '字段类型')
$form->radio2('type', '字段类型')
->required()->default('text')
->options(admin_trans('diy-form.options'))->when(['radio', 'checkbox'], function (Form\NestedForm $form) {
->options(admin_trans('diy-form.options'))
->when(['radio', 'checkbox'], function (Form\NestedForm $form) {
$form->list('options', '选项列表');
});
$form->number('sort', '排序')

Loading…
Cancel
Save