Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Под дочерними сущностями подразумеваются спонсоры, у которых есть имя и логотип.
А родительская сущность - это главная страница.
Итак, я создал модель, миграцию и контроллер для главной страницы по инструкции http://laravel-admin.org/docs/#/en/mode … id=hasmany
<?php
namespace App\Pages;
use App\Sponsor;
use Illuminate\Database\Eloquent\Model;
class FrontPage extends Model
{
public $timestamps = false;
public $fillable = [
'background',
'date',
'city',
'description'
];
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
**/
public function ordinarysponsors()
{
return $this->hasMany(Sponsor::class)->where('main', 0);
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasMany
**/
public function mainsponsors()
{
return $this->hasMany(Sponsor::class)->where('main', 1);
}
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateFrontPagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('front_pages', function (Blueprint $table) {
$table->increments('id');
$table->string('background');
$table->dateTime('date');
$table->string('city');
$table->text('description');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('front_pages');
}
}
<?php
namespace App\Admin\Controllers;
use App\Pages\FrontPage;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\HasResourceActions;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Layout\Content;
use Encore\Admin\Show;
class FrontPageController extends Controller
{
use HasResourceActions;
/**
* Index interface.
*
* @param Content $content
* @return Content
*/
public function index(Content $content)
{
return $content
->header('Index')
->description('description')
->body($this->grid());
}
/**
* Show interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function show($id, Content $content)
{
return $content
->header('Detail')
->description('description')
->body($this->detail($id));
}
/**
* Edit interface.
*
* @param mixed $id
* @param Content $content
* @return Content
*/
public function edit($id, Content $content)
{
return $content
->header('Edit')
->description('description')
->body($this->form()->edit($id));
}
/**
* Create interface.
*
* @param Content $content
* @return Content
*/
public function create(Content $content)
{
return $content
->header('Create')
->description('description')
->body($this->form());
}
/**
* Make a grid builder.
*
* @return Grid
*/
protected function grid()
{
$grid = new Grid(new FrontPage);
$grid->ordinarysponsors()->pluck('name')->map(function ($name) {
return "<strong><i>《 $name 》</i></strong>";
})->implode('<br />');
return $grid;
}
/**
* Make a show builder.
*
* @param mixed $id
* @return Show
*/
protected function detail($id)
{
$show = new Show(FrontPage::findOrFail($id));
return $show;
}
/**
* Make a form builder.
*
* @return Form
*/
protected function form()
{
$form = new Form(new FrontPage);
$form->tab('Основное', function (Form $form) {
$form->image('background', 'Задний фон')->rules('required|image')->move('frontPage');
$form->datetime('date', 'Дата самита')->rules('required|date')->format('YYYY-MM-DD HH:mm:ss');
$form->text('city', 'Город')->rules('required|string|min:3');
$form->editor('description', 'Описание')->rules('required|string|min:5');
});
$form->tab('Cпонсоры', function (Form $form) {
$form->hasMany('ordinarysponsors', '', function (Form\NestedForm $nestedForm) use ($form) {
$nestedForm->text('name', 'Название')->rules('required|string|min:3');
$nestedForm->image('image', 'Логотип')->rules('required|image')->move('sponsor/logos');
});
});
$form->tab('Основные спонсоры', function (Form $form) {
$form->hasMany('mainsponsors', '', function (Form\NestedForm $nestedForm) use ($form) {
$nestedForm->text('name', 'Название')->rules('required|string|min:3');
$nestedForm->image('image', 'Логотип')->rules('required|image')->move('sponsor/logos');
$nestedForm->hidden('main')->default(1);
});
});
return $form;
}
}
Всё работает
http://SSMaker.ru/828f2ef8/
Однако, когда я пытаюсь просто сохранить страничку, выдаёт ошибку, будто картинок нет, то есть при сохранении в контроллер картинки будто бы не летят
http://SSMaker.ru/31c00efc/
На всякий случай прикрепляю миграцию и модель спонсоров
<?php
namespace App;
use App\Pages\FrontPage;
use Illuminate\Database\Eloquent\Model;
class Sponsor extends Model
{
public $timestamps = false;
public $fillable = [
'name',
'image',
'main',
];
public function frontpage()
{
return $this->belongsTo(FrontPage::class);
}
}
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateSponsorsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('sponsors', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('image');
$table->boolean('main')->default(0);
$table->integer('front_page_id')->index('front_page_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('sponsors');
}
}
Изменено Kirir (18.10.2018 22:02:21)
Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20
Не в сети
Я хотел ловить код до обращения в бд, но, к сожалению, это срабатывает после успешной валидации, а картинки валидирует до этого события
$form->saving(function (Form $form) {
dump($form->image);
});
Также пробовал ловить в edit, но туда форма приходит без данных
public function edit($id, Content $content)
{
dump($this, $content, $this->form());
.....
В общем, пока не могу понять, где можно поймать данные с формы, что бы для дочерних сущностей заново вбить их значения из базы данных, например.
Связь со мной:
Скайп(с аватаркой) - shyraks
Телеграм - @Mramoris или +7 999 260 13 20
Не в сети