deadloop
@deadloop
Активно осваиваю PHP

Как объединить две формы (Create и Update) в одну?

У меня есть две формы: создание и редактирование записи. Я пытаюсь их объединить в одну, как это правильно сделать? У меня получилось с присвоением в котнроллере переменной для каждого метода, и в представлении я просто проверял какой метод вызван. А как сделать с проверкой содержимого - если есть запись, вызывается метод Edit, если записи нет, то Create?

Controller:
public function create() {
        return view('admin.categories.create');
    }

    public function edit($id) {
        $cat = Category::find($id);
        return view('admin.categories.create', compact('cat'));
    }

Предстовление:
<form action="{{ ($cat->title > 0 ? route('category.store') : route('category.update', ['id'=>$cat->id])) }}" method="post" enctype="multipart/form-data">
                        @csrf
                        @if ($cat->title > 0)
                            @method('PATCH')
                        @endif
                        <div class="form-group">
                            <label for="cat_id">Категория</label>
                            {{$cat->tite ?? ''}}
                        </div>
                        <div class="form-group">
                            <input name="category[title]" type="text" class="form-control"  required value="{{ $cat->title ?? ''}}">
                        </div>
                        <input type="submit" value="Создать" class="btn btn-outline-success">
                    </form>

В этой реализации ошибка, т.к. при методе Create я не передаю переменные и он ругается что их нет.
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
deadloop
@deadloop Автор вопроса
Активно осваиваю PHP
Вот моя реализация
<form action="{{ (empty($cats) ? route('category.store') : route('category.update', ['id'=>$cats->id])) }}" method="post" enctype="multipart/form-data">
                        @csrf
                        @if (isset($cats))
                            @method('PATCH')
                        @endif
                        <div class="form-group">
                            <label for="cat_id">Категория</label>
                            {{$cats->tite ?? ''}}
                        </div>
                        <div class="form-group">
                            <input name="category[title]" type="text" class="form-control"  required value="{{ $cats->title ?? ''}}">
                        </div>
                        <input type="submit" value="Создать" class="btn btn-outline-success">
                    </form>
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@jazzus
1) Создать нормальный ресурсный контроллер, с нормальными методами, роутами и Model Binding
2) Вьюхи create edit сохранить. Странно отдавать на экшен edit вьюху create
3) Форму вынести в include. Убрать из нее все эти ненужные проверки.
4) Передавать в include из вьюх create edit необходимые роуты и тексты
Ответ написан
Комментировать
@vism
У меня вобще обычно 1 метод на оба действия.
Просто передаю пустую модель во вьюху, и "0" в качестве параметра УРЛа.

public function edit($id) {
        $cat = Category::findOrNew($id);
        return view('admin.categories.edit', compact('cat'));
    }
Ответ написан
Комментировать
pLavrenov
@pLavrenov
Разработка сайтов
Ошибка в том что пытаешься получить значение из несуществующего объекта ($cat->title > 0)

Как вариант думаю логичнее использовать разные файлы для обертки form а вот все что внутри форм вынести в отельный view. Это исключит путаницу.

В текущем коде
value="{{ $cats->title ?? ''}}"
будет сбрасывать значения после неверной валидации формы и ее нужно будет заполнять снова. логичнее будет
old('title', $cats->title ?? '')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы