Laravel Backpack - Установите дополнительные атрибуты перед сохранением страницы

В моем 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? Как добавить (= установить) дополнительное поле в поле "Дополнительно" в моей базе данных?

3 ответа

Решение

Исправил это, выполнив следующее:

Добавьте широту и долготу как скрытые поля:

$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);,

В рюкзаке 4.1 я решил свою проблему следующим образом: переопределить метод хранилища в моем контроллере, установить дополнительное поле в запросе, а затем вызвать метод хранилища рюкзака. Не забудьте добавить признак включения рюкзака. Надеюсь, решение кому-то поможет.

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();
}

Людям, которые все еще рассматривают эту проблему, я бы порекомендовал вам следовать совету в примечании в разделе « Обратные вызовы» документации Laravel Backpack, если вы не хотите просто наблюдать за изменениями, сделанными из панели администратора Backpack, вам просто нужно создать Наблюдаемый.

Для этого вы можете сделать следующее:

  1. Создайте класс наблюдателя:php artisan make:observer YourObserver --model=YourModel

  2. Добавьте свой код в сгенерированные методы событий, которые вы хотите наблюдать.

  3. Зарегистрируйте наблюдателя, вызвав метод наблюдения для модели, которую вы хотите наблюдать, в методе загрузки вашего EventServiceProvider следующим образом:

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

Или в равной степени вы можете зарегистрировать Observer в$observersсвойство класса EventServiceProvider ваших приложений:

      protected $observers = [
    YourModel::class => [YourObserver::class],
];
Другие вопросы по тегам