Почему не работает вывод для создания подкатегории? ErrorException Undefined variable: category (View: /var/www/bossphp.x/resources/views/category/create.blade.php) http://bossphp.x:8080/category/create Hide solutions Possible typo $category Did you mean $errors? PHP: <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> --- Добавлено --- PHP: @if (Session::has('info')) <div class="alert alert-success" role="alert"> {{ Session::get('info') }} </div> @endif @extends('admin.index') @section('content') <form action="/categories/category/store" method="POST"> {{ csrf_field() }} <?php use Illuminate\Support\MessageBag; /** @var MessageBag $errors */ ?> <div class="p-4 mb-2"><h1>Создание категории</h1> <div class="form-group"><label for="inputDesription" class="col-xs-2 control-label">Введите описание(desription)</label> <div class="col-xs-10"> <input type="text" name="desription" class="form-control" placeholder="введите описание" id="desription"></div <? if($errors->first("desription") != "") echo "<div class='alert'>".$errors->first("desription")."</div>"; ?> </div> </div> <div> <label for="inputKeywords" class="col-xs-2 control-label">Введите keywords</label> <div class="col-xs-10"> <input type="text" name="keywords" placeholder="введите ключевые слова" id="inputKeywords"> <? if($errors->first("keywords") != "") echo "<div class='alert'>".$errors->first("keywords")."</div>"; ?> </div> </div> <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите заголовок</label> <div class="col-xs-10"> <input type="text" name="title" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="title" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> <div><div class="form-group"><label for="inputslug" class="col-xs-2 control-label">Введите урл страницы</label> <div class="col-xs-10"> <input type="text" name="slug" placeholder="Укажите slug"></div> <? if($errors->first("slug") != "") echo "<div class='alert'>".$errors->first("slug")."</div>"; ?> </div> </div> <div><div class="form-group"><label for="inputtextl" class="col-xs-2 control-label">Введите описание категории</label> <div class="col-xs-10"> <textarea rows="10" cols="45" name="text" placeholder="введите пост статьи"></textarea></div> <? if($errors->first("text") != "") echo "<div class='alert'>".$errors->first("text")."</div>"; ?> </div> </div> <label for="">Статус</label> <select class="form-control" name="published"> <?php if(isset($categories->id)): ?> <option value="0" <?php if($categories->published == 0): ?> selected="" <?php endif; ?>>Не опубликовано</option> <option value="1" <?php if($categories->published == 1): ?> selected="" <?php endif; ?>>Опубликовано</option> <?php else: ?> <option value="0">Не опубликовано</option> <option value="1">Опубликовано</option> <?php endif; ?> </select> <input type="submit" value="Отправить"> </form> @endsection Это полный код --- Добавлено --- Менял Код (Text): </div> <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> и Код (Text): </div> <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="{{$child_category->categories}}" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> --- Добавлено --- ErrorException Undefined variable: category (View: /var/www/bossphp.x/resources/views/category/create.blade.php) http://bossphp.x:8080/category/create Hide solutions Possible typo $category Did you mean $errors? --- Добавлено --- Как сделать чтоб заработало? Не пойму как передать несколько подкатегорий в шаблон. То есть чтоб была такая схема категории-подкатегории-подкатегории.
ну переведите хотя-бы через гуло-переводчик, что вам пишут ...а.... Убунта?.. это диагноз )))) Вы используете в шаблоне переменную $category. но туда эту переменную из контроллера не передаете хотя я думаю вам это не поможет )
Я писал что я не переводил текст ошибки? Не получается передать именно подкатегории. Если убрать подкатегории , то все заработает в данном шаблоне. PS Прошу держать свое мнение при себе в строну моей личности
Расскажи, как по-твоему, это работает? --- Добавлено --- И что ты пытаешься сделать? Обычно создание подкатегории ничем не отличается от создания категории
Я сделал через отношение многие ко многим --- Добавлено --- За основу взял статью https://laravel.demiart.ru/recursive-hasmany-relationship-with-unlimited-subcategories/ --- Добавлено --- Довольно часто в интернет-магазинах можно увидеть множество уровней категорий и подкатегорий, вплоть до бесконечности. Эта статья покажет вам, как сделать это элегантно при помощи Laravel Eloquent. Мы создадим мини-проект для просмотра подкатегорий в детском магазине, например, пять уровней: Миграция для БД Простая схема для таблицы: PHP: Schema::create('categories', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('name'); $table->unsignedBigInteger('category_id')->nullable(); $table->foreign('category_id')->references('id')->on('categories'); $table->timestamps(); }); У нас просто есть поле с названием и связь с самой таблицей. Таким образом, у большинства родительских категорий будет category_id = NULL, а у других подкатегории — свой собственный parent_id. Вот наши данные в базе данных: Модель Eloquent и отношения Для начала, в app/Category.php мы добавляем простой метод hasMany() — у категории могут быть другие подкатегории: PHP: class Category extends Model { public function categories() { return $this->hasMany(Category::class); } } --- Добавлено --- PHP: class Category extends Model { public function categories() { return $this->hasMany(Category::class); } } Теперь время главного «секрета» статьи . Знаете ли вы, что можно создавать рекурсивные отношения? Вот так: PHP: public function childrenCategories() { return $this->hasMany(Category::class)->with('categories'); } Таким образом, если вы вызовете Category::with(‘categories’), это получите один «дочерний» уровень, а Category::with(‘childrenCategories’) выдаст вам столько уровней, сколько сможет найти. Маршрут и метод контроллера Теперь давайте попробуем показать все категории и подкатегории, как в примере выше. В routes/web.php добавим: PHP: Route::get('categories', 'CategoryController@index'); --- Добавлено --- А в app/Http/CategoryController.php сделаем так: PHP: public function index() { $categories = Category::whereNull('category_id') ->with('childrenCategories') ->get(); return view('categories', compact('categories')); } Как видите, мы загружаем только родительские категории, а дочерние как отношения. Всё просто. Шаблон и рекурсивный суб-шаблон Перейдем к структуре шаблонов. Так выглядит resources/views/categories.blade.php: PHP: <ul> @foreach ($categories as $category) <li>{{ $category->name }}</li> <ul> @foreach ($category->childrenCategories as $childCategory) @include('child_category', ['child_category' => $childCategory]) @endforeach </ul> @endforeach </ul> --- Добавлено --- Сначала основные категории, а затем загружаем дочерние категории при помощи @include. Самое приятное, что resources/views/admin/child_category.blade.php будет использовать рекурсивную загрузку самого себя. Посмотрите код: PHP: <li>{{ $child_category->name }}</li> @if ($child_category->categories) <ul> @foreach ($child_category->categories as $childCategory) @include('child_category', ['child_category' => $childCategory]) @endforeach </ul> @endif Как видите, внутри child_category.blade.php у нас есть @include(‘child_category’), поэтому шаблон рекурсивно загружает дочерние элементы, пока есть категории внутри текущей дочерней категории. Вот и всё! Теперь у нас есть неограниченный уровень подкатегорий — в базе данных, в отношениях Eloquent и в шаблонах. --- Добавлено --- Взяв за основу это я реализовываю у себя. Не пойму как сделать чтоб подкатегории были при редактировании и создании категории. --- Добавлено --- Что почитать чтоб понять как сделать? Что набрать в поисковике чтоб решить проблему? Как вообще сделать?
Нафига они тебе при редактировании и создании? При редактировании и создании выбирается родительская, и всё --- Добавлено --- Это один ко многим, а не многие ко многим
Не пытайся создавать сразу и категорию и её подкатегории. Создаёшь категорию, крепишь к паренту. Вот так у меня в бложике происходит. Рядом с родительской щёлкаешь плюсик, в ней создаётся подкатегория Спойлер: Скрин
Как реализовать плюсик для создания подкатегории? Все равно для создания категории и подкатегории создается свой роут. В общем как сделать создание страницы где было создание категории-подкатегории -подкатегори?
Если свой роут - передаёшь туда id категории, рядом с которой нажали плюсик. Другой вариант - делаешь селект парента при создании категории
Блин, мозг должен работать. Почему такие простые вещи надо кодом показывать? PHP: public function createCat(Request $request) { $category = new Category; $category->parent_id = $request->parent_id; $category->name = $request->name; $category->save(); } HTML: <label>Parent</label> <select name=parent_id> @foreach (Category::query()->get() as $c) <option value="{{c.id}}">{{c.name}}</option> @endforeach </select> <label>Name</label> <input name=name> <button>Create</button>
PHP: public function create() { return view('category/create'); } public function store(Request $request) { $this->validate($request, [ 'title' => 'required', 'slug' => 'required|unique:categories', 'text' => 'required', ]); $category = new Category(); $category->title = $request->input('title'); $category->slug = $request->input('slug'); $category->text = $request->input('text'); $category->keywords = $request->input('keywords'); $category->desription = $request->input('desription'); $category->published = $request->input('published'); $category->save(); return redirect('/category/create')->with('info', 'Данные сохранены'); } У меня два метода для создания категория сделаны так --- Добавлено --- Что означает c.id?
Error Class 'Category' not found (View: /var/www/bossphp.x/resources/views/category/create.blade.php) PHP: <label>Parent</label> <select name=category_id> @foreach (Category::query()->get() as $c) <option value="{{$c.id}}">{{$c.title}}</option> @endforeach </select> <label>Name</label> <input name=name> <button>Create</button>
Индексный метод у меня так с подкатегориями PHP: public function index() { $categories = Category::whereNull('category_id') ->with('childrenCategories') ->get(); return view('categories', compact('categories')); } Я не пойму как в этот метод вставить переменную childrenCategories и category_id. PHP: public function store(Request $request) { $this->validate($request, [ 'title' => 'required', 'slug' => 'required|unique:categories', 'text' => 'required', ]); $category = new Category(); $category->title = $request->input('title'); $category->slug = $request->input('slug'); $category->text = $request->input('text'); $category->keywords = $request->input('keywords'); $category->desription = $request->input('desription'); $category->published = $request->input('published'); $category->save(); return redirect('/category/create')->with('info', 'Данные сохранены'); }
PHP: <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label> <div class="col-xs-10"> <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div> <? if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?> </div> </div> PHP: public function store(Request $request) { $this->validate($request, [ 'title' => 'required', 'slug' => 'required|unique:categories', 'text' => 'required', ]); $category = Category::create($request->only(['title', 'slug', 'text', 'keywords', 'desription', 'published', 'childrenCategories', 'category_id' ])); return redirect('/category/create')->with('info', 'Данные сохранены'); } Undefined variable: category (View: /var/www/bossphp.x/resources/views/category/create.blade.php)
Что означает эта запись, ты так и не рассказал... И я же тебе писал - не кидаются дочерние при вводе, запрашивается при вводе родительская. Неймпейс хочет, не понятно, разве?