Laravel Backpack -保存页面前设置额外属性

thtygnil  于 2022-12-14  发布在  其他
关注(0)|答案(3)|浏览(150)

在我的PageTemplates.php中,我有一个这样的字段:

$this->crud->addField([
    'name' => 'adres',
    'label' => 'Adres',
    'type' => 'address',
    'fake' => true,
]);

现在我也想保存他们给予的地址的纬度经度(如果可以找到的话)。我已经复制了PageCrudController并将config/backpack/pagemanager.php中的配置更改为:

return [
    'admin_controller_class' => 'App\Http\Controllers\Admin\PageCrudController',
    'page_model_class'       => 'App\Models\Page',
];

在我的商店功能中,我有:

public function store(StoreRequest $request)
{
    $address = $request->request->get('adres');
    $addressObj = app('geocoder')->geocode($address)->get()->first();

    if($addressObj)
    {

    }

    $this->addDefaultPageFields(\Request::input('template'));
    $this->useTemplate(\Request::input('template'));

    return parent::storeCrud();
}

但是我在if语句中放置了什么呢?我如何在数据库的extras字段中添加(=设置)一个额外的字段呢?

wkyowqbh

wkyowqbh1#

在背包4.1中,我通过以下方式解决了我的问题:覆盖我的控制器中的store方法,在请求中设置我的额外字段,然后调用背包store方法。不要忘记添加包含背包特性。希望该解决方案能对其他人有所帮助

use \Backpack\CRUD\app\Http\Controllers\Operations\CreateOperation { store as traitStore; }

public function store()
{
    $this->crud->setOperationSetting('saveAllInputsExcept', ['save_action']);
    $this->crud->getRequest()->request->add(['updated_by' => backpack_user()->id]);     
        
    return $this->traitStore();
}
4jb9z9bj

4jb9z9bj2#

通过执行以下操作修复了该问题:
将纬度和经度添加为隐藏字段:

$this->crud->addField([
    'name' => 'latitude',
    'type' => 'hidden',
    'fake' => true,
]);

$this->crud->addField([
    'name' => 'longitude',
    'type' => 'hidden',
    'fake' => true,
]);

通过执行以下操作设置属性:

if($addressObj)
    {
        $request['latitude'] = $addressObj->getCoordinates()->getLatitude();
        $request['longitude'] = $addressObj->getCoordinates()->getLongitude();
    }
}

parent::updateCrud变更为parent::updateCrud($request);

fnatzsnv

fnatzsnv3#

对于仍在关注这个问题的人,我建议你遵循Laravel Backpack文档中回调部分下的注解中的建议,如果你不只是想观察从Backpack管理面板中所做的更改,你只需要创建一个可观察的。
为此,您可以执行以下操作:
1.创建Observer类:php artisan make:observer YourObserver --model=YourModel
1.将代码添加到要观察的生成事件方法中。
1.通过在EventServiceProvider的 Boot 方法中对要观察的模型调用observe方法来注册Observer,如下所示:

public function boot()
{
    YourModel::observe(YourObserver::class);
}

或者,您也可以将Observer注册到应用程序的EventServiceProvider类的$observers属性:

protected $observers = [
    YourModel::class => [YourObserver::class],
];

相关问题