解决laravel-admin表单在hasMany中调用embeds方法时字段被忽略的问题

赏新知
2023-12-01

问题地址(shinbashi回答): https://github.com/z-song/laravel-admin/issues/899
相关问题地址: https://github.com/z-song/laravel-admin/issues/2889

首先该问题出现的原因是因为原框架不支持在hasMany中使用内嵌方法embeds,至于为什么没有加入到新版本中,原因也不知道了,这里提供仅仅提供解决方法(原答案参照第一条链接中的回答):

步骤1:新建文件夹和类Admin/Extensions/NestedEmbeds.php,内容如下
<?php
namespace App\Admin\Extensions;


use Encore\Admin\Form\EmbeddedForm;
use Encore\Admin\Form\Field\Embeds;

class NestedEmbeds extends Embeds
{
    protected $view = 'admin::form.embeds';

    protected function buildEmbeddedForm()
    {
        $form = new EmbeddedForm($this->elementName);

        $form->setParent($this->form);

        call_user_func($this->builder, $form);

        $form->fill($this->getEmbeddedData());

        return $form;
    }
}
步骤2:修改Admin/bootstrap.php,新增如下
Encore\Admin\Form::extend('nestedEmbeds', \App\Admin\Extensions\NestedEmbeds::class);
步骤3:修改使用hasManyembedsform方法,用nestedEmbeds方法替代embeds方法,例如
protected function form()
{
    $form = new Form(new Game);
    
    $form->hasMany('modules', function (NestedForm $nestedForm)
    {
        $nestedForm->nestedEmbeds('extra', '附录信息', function ($form) {
            //此处内容使用embeds方法在提交时会被忽略,改为nestedEmbeds方法
        });
    });
    return $form;
}

建议修改完仔细核对文件名和类名前后是否不一致,个人犯了个错,文件夹件命名为Extension,后面调用的都是Extensions,导致好半天不成功,前后要一致,警惕粗心。

 类似资料: