Laravel Nova: Как показать все поля из соответствующего ресурса для поля MorphTo? - PullRequest
0 голосов
/ 04 мая 2019

Я пишу код:

class File extends Resource {

    public function fields(Request $request) {
        return [

            MorphTo::make('Fileable')->types([
                User::class,
            ])

        ];
    }
class File extends Model {

    public function fileable() {
        return $this->morphTo();
    }
class CreateFilesTable extends Migration {

    public function up() {
        Schema::create('files', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->morphs('fileable');
            $table->timestamps();
        });
    }

Отображается так:

enter image description here

Но дляпользователям этот дисплей будет удобен:

enter image description here

Как вы можете сделать такой дисплей?

Или дисплей MorphTo как MorphOne:

class User extends Resource {

    public function fields(Request $request) {
        return [
            MorphOne::make('File'),
            ];
    }

Могу ли я сделать что-то подобное?

enter image description here

Lifehack # 1:

protected function panel(): array {
        $fs = [];

        foreach($this->model()->fileable->getAttributes() as $k => $v) {
            $fs[] = Text::make($k, null, function() use($v) { return $v;});
        }

        return $fs;
    }


    public function fields(Request $request) {
        return [
            ID::make()->sortable(),

            new Panel('Information', $this->panel()),

        ];
    }

Но отображаются все поля модели:

enter image description here

Но я хочу отображать только те поля, которые описаны в ресурсе.

Lifehack # 2:

    protected function panel(Request $request): array {
        $fs = [];

        $name = (new \ReflectionClass(get_class($this->model()->detailable)))->getShortName();
        $res = "App\Nova\\{$name}";

        $r = new $res($this->model()->detailable);

        foreach($r->fields($request) as $k => $v) {
            $v->attribute = 'detailable->' . $v->attribute;
            $v->onlyOnDetail();
            $fs[] = $v;
        }

        return $fs;
    }

    public function fields(Request $request) {
        return [
            new Panel('Information', $this->panel($request) ),
        ];
    }
...