如何在Backpack中创建同时包含两个输入属性的自定义多语言字段?
Backpack同页多语言字段实现方案
结论先行
你要的需求完全可以实现,不需要修改Backpack核心或翻译包源码,以下是两种最低成本的实现路径:
方案1:用内置分组字段快速实现(无需自定义开发,推荐优先用)
直接在CRUD控制器的操作方法内定义分组字段,将两个语言版本的输入框封装到同一个视觉组内,天然支持同页并排展示:
// 写在setupCreateOperation/setupUpdateOperation方法中 CRUD::addField([ 'name' => 'name_trans_group', 'type' => 'group', 'label' => '名称多语言内容', 'fields' => [ [ 'name' => 'name_english', 'label' => '英文', 'type' => 'text', 'wrapper' => ['class' => 'form-group col-md-6'], ], [ 'name' => 'name_french', 'label' => '法语', 'type' => 'text', 'wrapper' => ['class' => 'form-group col-md-6'], ], ], ]);
优势:无额外开发成本,渲染出来的两个输入框左右并排,和单个字段的视觉体验一致,后端直接接收两个字段值适配翻译包存储逻辑即可
方案2:封装为独立自定义字段(适合多场景复用)
如果你需要在多个CRUD里用到同类多语言字段,可以封装成单个独立字段类型,实现单个字段对应两个输入框的效果:
- 新建自定义字段模板:在
resources/views/vendor/backpack/crud/fields目录下创建dual_lang_text.blade.php,写入以下代码:
@php // 支持自定义语言后缀,默认用英法 $suffixes = $field['lang_suffixes'] ?? ['english', 'french']; @endphp <div @include('crud::inc.field_wrapper_attributes') > <label>{!! $field['label'] !!}</label> <div class="row"> @foreach($suffixes as $suffix) <div class="col-md-6 mb-0"> <input type="text" name="{{ $field['name'] }}_{{ $suffix }}" value="{{ old($field['name'].'_'.$suffix) ?? ($entry->{$field['name'].'_'.$suffix} ?? '') }}" class="form-control" placeholder="{{ ucfirst($suffix) }}内容" > </div> @endforeach </div> </div>
- 在CRUD中直接调用该字段即可:
CRUD::addField([ 'name' => 'name', 'type' => 'dual_lang_text', 'label' => '名称', // 可选:自定义语言后缀 // 'lang_suffixes' => ['english', 'french'], ]);
后端适配注意点
你只需要在模型的saving事件或者CRUD的保存钩子中,把提交的带后缀字段值,转换为官方translation包要求的存储格式即可,完全兼容原有翻译包的功能。
关于你问的「是否可以让单个Backpack字段实际对应两个输入字段」:完全可以,Backpack的字段本质是前端渲染模板,单个模板内可以输出任意数量的输入框,只要name属性符合后端接收规则,没有额外限制。
内容的提问来源于stack exchange,提问作者NicolasSC
相关产品推荐
相关产品推荐

