Laravel-Backpack / CRUD

Build custom admin panels. Fast!
https://backpackforlaravel.com
MIT License
3.08k stars 887 forks source link

[Bug] Form Operation - cannot add raw fields of a morph as hidden fields #5297

Closed realtebo closed 3 months ago

realtebo commented 1 year ago

Bug report

What I did

Created a "form operation"

 php artisan backpack:crud-form-operation Storn

the model as a coinable MorphTo relation. so the table has coinable_id and coinable_type

this because the operation is loading into crud currentEntry a record I want to manipulate,

I want to add as hidden fileds these 2 fields

    $this->crud->addField([
        'type' => 'hidden',
        'name' => 'coinable_id',
        'value' => $this->crud->getCurrentEntry()->coinable->id,
    ]);

    $this->crud->addField([
        'type' => 'hidden',
        'name' => 'coinable_type',
        'value' => $this->crud->getCurrentEntry()->coinable_type,
    ]);

What I expected to happen

I expeteced 2 hidden fields; coinable_id and coinable_type

What happened

image

What I've already tried to fix it

nothing for now

Is it a bug in the latest version of Backpack?

After I run composer update backpack/crud the bug... is it still there?

yes

Backpack, Laravel, PHP, DB version

When I run php artisan backpack:version the output is:

### PHP VERSION:
PHP 8.2.8 (cli) (built: Jul  4 2023 15:53:15) (ZTS Visual C++ 2019 x64)
Copyright (c) The PHP Group
Zend Engine v4.2.8, Copyright (c) Zend Technologies

### LARAVEL VERSION:
10.20.0.0

### BACKPACK PACKAGE VERSIONS:
backpack/basset: 1.1.1
backpack/crud: 6.1.15
backpack/generators: v4.0.2
backpack/pro: 2.0.11
backpack/theme-tabler: 1.0.12
pxpm commented 1 year ago

Hey @realtebo it's usually better to post the full error stack trace to help us to trace/reproduce the error.

From that SS I can't tell where/why the error is triggered.

I may throw my guess here, that if the problem is some entity conflict, you can try entity => false in your fields.

Cheers

realtebo commented 1 year ago

[2023-08-25 11:25:21] local.ERROR: Call to undefined method App\Models\CoinMovement::coinable_id() {"userId":195,"exception":"[object] (BadMethodCallException(code: 0): Call to undefined method App\Models\CoinMovement::coinable_id() at C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php:67) [stacktrace]

0 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Support\Traits\ForwardsCalls.php(36): Illuminate\Database\Eloquent\Model::throwBadMethodCallException('coinable_id')

1 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(2333): Illuminate\Database\Eloquent\Model->forwardCallTo(Object(Illuminate\Database\Eloquent\Builder), 'coinable_id', Array)

2 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Library\CrudPanel\Traits\MorphRelationships.php(54): Illuminate\Database\Eloquent\Model->__call('coinable_id', Array)

3 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Library\CrudPanel\Traits\MorphRelationships.php(68): Backpack\CRUD\app\Library\CrudPanel\CrudPanel->getMorphToFieldNames('coinable_id')

4 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Library\CrudPanel\Traits\Fields.php(57): Backpack\CRUD\app\Library\CrudPanel\CrudPanel->makeSureMorphSubfieldsAreDefined(Array)

5 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Library\CrudPanel\Traits\Fields.php(109): Backpack\CRUD\app\Library\CrudPanel\CrudPanel->makeSureFieldHasNecessaryAttributes(Array)

6 C:\laragon\www\project-coin\app\Http\Controllers\Teacher\Operations\StornMovementOperation.php(130): Backpack\CRUD\app\Library\CrudPanel\CrudPanel->addField(Array)

7 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Controller.php(54): App\Http\Controllers\Teacher\CoinMovementCrudController->getStornMovementForm(6)

8 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\ControllerDispatcher.php(43): Illuminate\Routing\Controller->callAction('getstornMovemen...', Array)

9 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Route.php(259): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\Teacher\CoinMovementCrudController), 'getstornMovemen...')

10 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Route.php(205): Illuminate\Routing\Route->runController()

11 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(799): Illuminate\Routing\Route->run()

12 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))

13 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Http\Controllers\CrudController.php(43): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

14 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(162): Backpack\CRUD\app\Http\Controllers\CrudController->Backpack\CRUD\app\Http\Controllers\{closure}(Object(Illuminate\Http\Request), Object(Closure))

15 C:\laragon\www\project-coin\app\Http\Middleware\PasswordMustBeChanged.php(43): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

16 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): App\Http\Middleware\PasswordMustBeChanged->handle(Object(Illuminate\Http\Request), Object(Closure))

17 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Auth\Middleware\Authorize.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

18 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Auth\Middleware\Authorize->handle(Object(Illuminate\Http\Request), Object(Closure), 'access-teacher-...')

19 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

20 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))

21 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))

22 C:\laragon\www\project-coin\app\Http\Middleware\CheckIfAdmin.php(66): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

23 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): App\Http\Middleware\CheckIfAdmin->handle(Object(Illuminate\Http\Request), Object(Closure))

24 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Middleware\SubstituteBindings.php(50): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

25 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure))

26 C:\laragon\www\project-coin\vendor\backpack\crud\src\app\Http\Middleware\AuthenticateSession.php(62): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

27 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Backpack\CRUD\app\Http\Middleware\AuthenticateSession->handle(Object(Illuminate\Http\Request), Object(Closure))

28 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php(78): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

29 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure))

30 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

31 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))

32 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(121): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

33 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Session\Middleware\StartSession->handleStatefulRequest(Object(Illuminate\Http\Request), Object(Illuminate\Session\Store), Object(Closure))

34 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))

35 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

36 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))

37 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\EncryptCookies.php(67): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

38 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure))

39 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

40 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(798): Illuminate\Pipeline\Pipeline->then(Object(Closure))

41 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(777): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))

42 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(741): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route))

43 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Routing\Router.php(730): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))

44 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(200): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))

45 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(141): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))

46 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

47 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull.php(31): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))

48 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull->handle(Object(Illuminate\Http\Request), Object(Closure))

49 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

50 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\TrimStrings.php(40): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure))

51 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\TrimStrings->handle(Object(Illuminate\Http\Request), Object(Closure))

52 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

53 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure))

54 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance.php(86): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

55 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Foundation\Http\Middleware\PreventRequestsDuringMaintenance->handle(Object(Illuminate\Http\Request), Object(Closure))

56 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Http\Middleware\HandleCors.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

57 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Http\Middleware\HandleCors->handle(Object(Illuminate\Http\Request), Object(Closure))

58 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Http\Middleware\TrustProxies.php(39): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

59 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(180): Illuminate\Http\Middleware\TrustProxies->handle(Object(Illuminate\Http\Request), Object(Closure))

60 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(116): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))

61 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(175): Illuminate\Pipeline\Pipeline->then(Object(Closure))

62 C:\laragon\www\project-coin\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(144): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))

63 C:\laragon\www\project-coin\public\index.php(51): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))

64 {main}

"}

pxpm commented 1 year ago

Thanks, does the entity => false in your fields solves the problem ?

Also, there is an easy way to share the strack trace here: image

You can select what to share, usually the basic call trace like you posted there is enough, but it's easier to read and it's not a huuuuuge comment in the middle of a discussion. 👍