Laravel Backpack Pro:主表单标签页创建独立表单遇字段填充问题
问题:在Backpack CRUD独立标签页中管理站点位置字段失败
问题背景
我有一个负责站点所有CRUD操作的SiteCrudController,想要在主表单的独立标签页内让用户管理站点位置,但尝试两种自动填充location_sites表字段的方式均失败。
失败的尝试
第一种尝试:Backpack类未找到报错
使用以下代码时,页面提示Backpack类不存在:
@foreach($try as $field) @include('crud::fields.inc.wrapper_start') <label for="{{ $field['name'] }}">{{ $field['label'] }}</label> {!! Backpack::getField($field['type'], $field) !!} <!-- Display all validation errors --> @include('crud::fields.inc.wrapper_end') @endforeach
第二种尝试:页面加载超时且字段重复
使用以下代码导致页面加载超时,还重复生成SiteCrudController所属的字段:
@if(view()->exists('vendor.backpack.crud.form_content')) @include('vendor.backpack.crud.form_content', [ 'fields' => $try, 'action' => 'create' ]) @else @include('crud::form_content', [ 'fields' => $try, 'action' => 'create' ]) @endif
相关代码
SiteCrudController代码
protected function setupUpdateOperation() { CRUD::setFromDb(); // set fields from db columns. CRUD::addFields(static::getFieldsArrayForLocationsTab($this)); } public static function getFieldsArrayForLocationsTab($self){ // ----------------- // SELECTS tab // ----------------- $self->data['try'] =[ [ 'name' => 'name', 'label' => 'Name', 'type' => 'text', 'attributes' => [ // Any additional attributes can be specified here ] ] ]; return [ [ 'name' => 'location', 'label' => 'Locations', 'tab' => 'Locations', 'type' => 'view', 'view' => 'sites/location_list_tab', ], ]; }
location_list_tab.blade.php代码
<div> <p>Location List Tab</p> {{-- Create Input Fields Here --}} <div class="alert alert-danger"></div> <div id="locationSiteForm"> @foreach($try as $field) @include('crud::fields.inc.wrapper_start') <label for="{{ $field['name'] }}">{{ $field['label'] }}</label> {!! Backpack::getField($field['type'], $field) !!} <!-- Display all validation errors --> @include('crud::fields.inc.wrapper_end') @endforeach </div> <button type="button" id="updateLocationSiteBtn" class="btn btn-primary">Save Location Site</button>
解决方案
修复第一种错误:Backpack类未找到
Backpack没有全局Backpack类用于渲染字段,正确做法是直接引入对应字段的视图文件(比如text字段对应crud::fields.text)。修改循环代码如下:
@foreach($try as $field) @include('crud::fields.inc.wrapper_start', ['field' => $field]) @include("crud::fields.{$field['type']}", ['field' => $field]) <!-- 显示验证错误 --> @if ($errors->has($field['name'])) <div class="invalid-feedback d-block"> {{ $errors->first($field['name']) }} </div> @endif @include('crud::fields.inc.wrapper_end') @endforeach
这种方式直接调用字段视图,既避免了不存在的类依赖,也能正确渲染字段和显示验证错误。
修复第二种错误:页面超时与字段重复
直接引入form_content视图会触发无限递归——因为form_content会重新加载所有字段,包括当前这个view类型的字段,从而陷入循环。因此必须放弃这种方式,改用上面的字段渲染方案。
优化:字段数据传递规范
在getFieldsArrayForLocationsTab中,通过$self->data['try']传递字段数据虽可行,但更推荐直接在view类型字段中配置数据,符合Backpack规范:
修改控制器中返回的字段数组:
return [ [ 'name' => 'location', 'label' => 'Locations', 'tab' => 'Locations', 'type' => 'view', 'view' => 'sites/location_list_tab', 'fields' => [ // 直接把字段数据传递到视图 [ 'name' => 'name', 'label' => 'Name', 'type' => 'text', 'attributes' => [] ] ] ], ];
然后在视图中遍历$field['fields']:
<div id="locationSiteForm"> @foreach($field['fields'] as $locationField) @include('crud::fields.inc.wrapper_start', ['field' => $locationField]) @include("crud::fields.{$locationField['type']}", ['field' => $locationField]) @if ($errors->has($locationField['name'])) <div class="invalid-feedback d-block"> {{ $errors->first($locationField['name']) }} </div> @endif @include('crud::fields.inc.wrapper_end') @endforeach </div>
这种方式无需修改控制器data数组,直接通过字段配置传递数据,更清晰且避免变量冲突。
内容的提问来源于stack exchange,提问作者Yeo Bryan
相关产品推荐
相关产品推荐

