За последние 24 часа нас посетил 18471 программист и 1620 роботов. Сейчас ищут 1097 программистов ...

Почему не работает вывод для создания подкатегории?

Тема в разделе "Laravel", создана пользователем bossphp, 22 июл 2020.

  1. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Почему не работает вывод для создания подкатегории?
    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:
    1. <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    2.                         <div class="col-xs-10">
    3.                             <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div>
    4.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    5.                     </div>
    6.                 </div>
    --- Добавлено ---
    PHP:
    1. @if (Session::has('info'))
    2.     <div class="alert alert-success" role="alert">
    3.         {{ Session::get('info') }}
    4.     </div>
    5. @endif
    6.     @extends('admin.index')
    7.     @section('content')
    8. <form action="/categories/category/store" method="POST">
    9.     {{ csrf_field() }}
    10.     <?php
    11.     use Illuminate\Support\MessageBag;
    12.     /** @var MessageBag $errors */
    13.     ?>
    14.  
    15.     <div class="p-4 mb-2"><h1>Создание категории</h1>
    16.         <div class="form-group"><label for="inputDesription" class="col-xs-2 control-label">Введите описание(desription)</label>
    17.             <div class="col-xs-10">
    18.                 <input type="text" name="desription" class="form-control" placeholder="введите описание" id="desription"></div
    19.  
    20.             <?  if($errors->first("desription") != "") echo "<div class='alert'>".$errors->first("desription")."</div>"; ?>
    21.     </div>
    22.     </div>
    23.     <div> <label for="inputKeywords" class="col-xs-2 control-label">Введите keywords</label>
    24.         <div class="col-xs-10">
    25.         <input type="text" name="keywords" placeholder="введите ключевые слова" id="inputKeywords">
    26.     <?  if($errors->first("keywords") != "") echo "<div class='alert'>".$errors->first("keywords")."</div>"; ?>
    27.     </div>
    28.     </div>
    29.  
    30.     <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите заголовок</label>
    31.     <div class="col-xs-10">
    32.     <input type="text" name="title" placeholder="введите заголовок" id="title"></div>
    33.     <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    34.     </div>
    35.     </div>
    36.                 <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    37.                         <div class="col-xs-10">
    38.                             <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div>
    39.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    40.                     </div>
    41.                 </div>
    42.                 <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    43.                         <div class="col-xs-10">
    44.                             <input type="text" name="title" placeholder="введите заголовок" id="title"></div>
    45.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    46.                     </div>
    47.                 </div>
    48.  
    49.  
    50.     <div><div class="form-group"><label for="inputslug" class="col-xs-2 control-label">Введите урл страницы</label>
    51.         <div class="col-xs-10">
    52.     <input type="text" name="slug" placeholder="Укажите slug"></div>
    53.     <? if($errors->first("slug") != "") echo "<div class='alert'>".$errors->first("slug")."</div>"; ?>
    54.     </div>
    55.     </div>
    56.  
    57.     <div><div class="form-group"><label for="inputtextl" class="col-xs-2 control-label">Введите описание категории</label>
    58.         <div class="col-xs-10">
    59.     <textarea rows="10" cols="45" name="text" placeholder="введите пост статьи"></textarea></div>
    60.     <? if($errors->first("text") != "") echo "<div class='alert'>".$errors->first("text")."</div>"; ?>
    61.     </div>
    62.     </div>
    63.  
    64.     <label for="">Статус</label>
    65.     <select class="form-control" name="published">
    66.         <?php if(isset($categories->id)): ?>
    67.         <option value="0" <?php if($categories->published == 0): ?> selected="" <?php endif; ?>>Не опубликовано</option>
    68.         <option value="1" <?php if($categories->published == 1): ?> selected="" <?php endif; ?>>Опубликовано</option>
    69.         <?php else: ?>
    70.         <option value="0">Не опубликовано</option>
    71.         <option value="1">Опубликовано</option>
    72.         <?php endif; ?>
    73.     </select>
    74.     <input type="submit" value="Отправить">
    75. </form>
    76. @endsection
    Это полный код
    --- Добавлено ---
    Менял
    Код (Text):
    1.     </div>
    2.                 <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    3.                         <div class="col-xs-10">
    4.                             <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div>
    5.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    6.                     </div>
    7.                 </div>
    и
    Код (Text):
    1.     </div>
    2.                 <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    3.                         <div class="col-xs-10">
    4.                             <input type="text" name="{{$child_category->categories}}" placeholder="введите заголовок" id="title"></div>
    5.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    6.                     </div>
    7.                 </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?
    --- Добавлено ---
    Как сделать чтоб заработало? Не пойму как передать несколько подкатегорий в шаблон. То есть чтоб была такая схема категории-подкатегории-подкатегории.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    ну переведите хотя-бы через гуло-переводчик, что вам пишут
    ...а.... Убунта?.. это диагноз ))))

    Вы используете в шаблоне переменную $category. но туда эту переменную из контроллера не передаете

    хотя я думаю вам это не поможет )
     
  3. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Я писал что я не переводил текст ошибки? Не получается передать именно подкатегории. Если убрать подкатегории , то все заработает в данном шаблоне.
    PS Прошу держать свое мнение при себе в строну моей личности
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Расскажи, как по-твоему, это работает?
    --- Добавлено ---
    И что ты пытаешься сделать? Обычно создание подкатегории ничем не отличается от создания категории
     
  5. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    [​IMG]




    Я сделал через отношение многие ко многим
    --- Добавлено ---
    За основу взял статью https://laravel.demiart.ru/recursive-hasmany-relationship-with-unlimited-subcategories/
    --- Добавлено ---
    Довольно часто в интернет-магазинах можно увидеть множество уровней категорий и подкатегорий, вплоть до бесконечности. Эта статья покажет вам, как сделать это элегантно при помощи Laravel Eloquent.

    Мы создадим мини-проект для просмотра подкатегорий в детском магазине, например, пять уровней:
    Миграция для БД
    Простая схема для таблицы:
    PHP:
    1. Schema::create('categories', function (Blueprint $table) {
    2.     $table->bigIncrements('id');
    3.     $table->string('name');
    4.     $table->unsignedBigInteger('category_id')->nullable();
    5.     $table->foreign('category_id')->references('id')->on('categories');
    6.     $table->timestamps();
    7. });
    У нас просто есть поле с названием и связь с самой таблицей. Таким образом, у большинства родительских категорий будет category_id = NULL, а у других подкатегории — свой собственный parent_id.

    Вот наши данные в базе данных:
    Модель Eloquent и отношения
    Для начала, в app/Category.php мы добавляем простой метод hasMany() — у категории могут быть другие подкатегории:


    PHP:
    1. class Category extends Model
    2. {
    3.     public function categories()
    4.     {
    5.         return $this->hasMany(Category::class);
    6.     }
    7. }
    --- Добавлено ---
    PHP:
    1. class Category extends Model
    2. {
    3.     public function categories()
    4.     {
    5.         return $this->hasMany(Category::class);
    6.     }
    7. }
    Теперь время главного «секрета» статьи . Знаете ли вы, что можно создавать рекурсивные отношения? Вот так:


    PHP:
    1. public function childrenCategories()
    2. {
    3.     return $this->hasMany(Category::class)->with('categories');
    4. }

    Таким образом, если вы вызовете Category::with(‘categories’), это получите один «дочерний» уровень, а Category::with(‘childrenCategories’) выдаст вам столько уровней, сколько сможет найти.

    Маршрут и метод контроллера
    Теперь давайте попробуем показать все категории и подкатегории, как в примере выше.

    В routes/web.php добавим:

    PHP:
    1. Route::get('categories', 'CategoryController@index');
    --- Добавлено ---
    А в app/Http/CategoryController.php сделаем так:
    PHP:
    1. public function index()
    2. {
    3.     $categories = Category::whereNull('category_id')
    4.         ->with('childrenCategories')
    5.         ->get();
    6.     return view('categories', compact('categories'));
    7. }

    Как видите, мы загружаем только родительские категории, а дочерние как отношения. Всё просто.

    Шаблон и рекурсивный суб-шаблон
    Перейдем к структуре шаблонов. Так выглядит resources/views/categories.blade.php:


    PHP:
    1. <ul>
    2.     @foreach ($categories as $category)
    3.         <li>{{ $category->name }}</li>
    4.         <ul>
    5.         @foreach ($category->childrenCategories as $childCategory)
    6.             @include('child_category', ['child_category' => $childCategory])
    7.         @endforeach
    8.         </ul>
    9.     @endforeach
    10. </ul>
    --- Добавлено ---
    Сначала основные категории, а затем загружаем дочерние категории при помощи @include.

    Самое приятное, что resources/views/admin/child_category.blade.php будет использовать рекурсивную загрузку самого себя. Посмотрите код:

    PHP:
    1. <li>{{ $child_category->name }}</li>
    2. @if ($child_category->categories)
    3.     <ul>
    4.         @foreach ($child_category->categories as $childCategory)
    5.             @include('child_category', ['child_category' => $childCategory])
    6.         @endforeach
    7.     </ul>
    8. @endif

    Как видите, внутри child_category.blade.php у нас есть @include(‘child_category’), поэтому шаблон рекурсивно загружает дочерние элементы, пока есть категории внутри текущей дочерней категории.

    Вот и всё! Теперь у нас есть неограниченный уровень подкатегорий — в базе данных, в отношениях Eloquent и в шаблонах.
    --- Добавлено ---
    Взяв за основу это я реализовываю у себя. Не пойму как сделать чтоб подкатегории были при редактировании и создании категории.
    --- Добавлено ---

    Что почитать чтоб понять как сделать? Что набрать в поисковике чтоб решить проблему? Как вообще сделать?
     
    #5 bossphp, 22 июл 2020
    Последнее редактирование: 22 июл 2020
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Нафига они тебе при редактировании и создании? При редактировании и создании выбирается родительская, и всё
    --- Добавлено ---
    Это один ко многим, а не многие ко многим
     
  7. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Для того чтоб админке создавать категори и подкатегории.
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Не пытайся создавать сразу и категорию и её подкатегории. Создаёшь категорию, крепишь к паренту. Вот так у меня в бложике происходит. Рядом с родительской щёлкаешь плюсик, в ней создаётся подкатегория

    upload_2020-7-22_14-35-51.png
     
  9. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Как реализовать плюсик для создания подкатегории? Все равно для создания категории и подкатегории создается свой роут. В общем как сделать создание страницы где было создание категории-подкатегории -подкатегори?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Если свой роут - передаёшь туда id категории, рядом с которой нажали плюсик.

    Другой вариант - делаешь селект парента при создании категории
     
  11. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Можно пример кода?
     
  12. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Селектами можно сделать также?
     
  13. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Можно пример реализации кода?
     
  14. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Блин, мозг должен работать. Почему такие простые вещи надо кодом показывать?
    PHP:
    1. public function createCat(Request $request) {
    2.      $category = new Category;
    3.      $category->parent_id = $request->parent_id;
    4.      $category->name = $request->name;
    5.      $category->save();
    6. }
    HTML:
    1.  
    2. <label>Parent</label>
    3. <select name=parent_id>
    4.      @foreach (Category::query()->get() as $c)
    5.      <option value="{{c.id}}">{{c.name}}</option>
    6.      @endforeach
    7. <label>Name</label>
    8. <input name=name>
    9. <button>Create</button>
    10.  
     
  15. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    PHP:
    1.     public function create()
    2.     {
    3.         return view('category/create');
    4.  
    5.     }
    6.  
    7.     public function store(Request $request)
    8.     {
    9.         $this->validate($request, [
    10.             'title' => 'required',
    11.             'slug'   =>  'required|unique:categories',
    12.             'text'  =>  'required',
    13.         ]);
    14.  
    15.         $category = new Category();
    16.         $category->title = $request->input('title');
    17.         $category->slug = $request->input('slug');
    18.         $category->text = $request->input('text');
    19.         $category->keywords = $request->input('keywords');
    20.         $category->desription = $request->input('desription');
    21.         $category->published = $request->input('published');
    22.         $category->save();
    23.         return redirect('/category/create')->with('info', 'Данные сохранены');
    24.     }
    У меня два метода для создания категория сделаны так
    --- Добавлено ---
    Что означает c.id?
     
  16. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.854
    Симпатии:
    748
    Адрес:
    Татарстан
    описался автор - там $c.id
     
  17. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Откуда эта переменная берется?
     
  18. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Error
    Class 'Category' not found (View: /var/www/bossphp.x/resources/views/category/create.blade.php)

    PHP:
    1.     <label>Parent</label>
    2.     <select name=category_id>
    3.         @foreach (Category::query()->get() as $c)
    4.             <option value="{{$c.id}}">{{$c.title}}</option>
    5.         @endforeach
    6.     </select>
    7.     <label>Name</label>
    8.     <input name=name>
    9.     <button>Create</button>
     
  19. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    SQL запросы во вьюхах вообще можно?
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Не желательно, но можно. Ну это же пример на коленке. Можешь подготовить в контроллере, кто мешает?
     
  21. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    Индексный метод у меня так с подкатегориями
    PHP:
    1.     public function index()
    2.     {
    3.         $categories = Category::whereNull('category_id')
    4.             ->with('childrenCategories')
    5.             ->get();
    6.         return view('categories', compact('categories'));
    7.     }
    Я не пойму как в этот метод вставить переменную childrenCategories и category_id.


    PHP:
    1. public function store(Request $request)
    2. {
    3.     $this->validate($request, [
    4.         'title' => 'required',
    5.         'slug'   =>  'required|unique:categories',
    6.         'text'  =>  'required',
    7.     ]);
    8.  
    9.     $category = new Category();
    10.     $category->title = $request->input('title');
    11.     $category->slug = $request->input('slug');
    12.     $category->text = $request->input('text');
    13.     $category->keywords = $request->input('keywords');
    14.     $category->desription = $request->input('desription');
    15.     $category->published = $request->input('published');
    16.     $category->save();
    17.     return redirect('/category/create')->with('info', 'Данные сохранены');
    18. }
     
  22. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    в одну строку без new и save
    Category::create($request->only(['title', 'slug', ...]));
     
  23. bossphp

    bossphp Новичок

    С нами с:
    15 июл 2020
    Сообщения:
    24
    Симпатии:
    0
    PHP:
    1.                 <div> <div class="form-group"><label for="inputtitle" class="col-xs-2 control-label">Введите подкатегорию</label>
    2.                         <div class="col-xs-10">
    3.                             <input type="text" name="{{$category->$childCategory}}" placeholder="введите заголовок" id="title"></div>
    4.                         <?  if($errors->first("title") != "") echo "<div class='alert'>".$errors->first("title")."</div>"; ?>
    5.                     </div>
    6.                 </div>

    PHP:
    1.     public function store(Request $request)
    2.     {
    3.         $this->validate($request, [
    4.             'title' => 'required',
    5.             'slug'   =>  'required|unique:categories',
    6.             'text'  =>  'required',
    7.         ]);
    8.  
    9.         $category =  Category::create($request->only(['title', 'slug', 'text', 'keywords', 'desription', 'published', 'childrenCategories', 'category_id' ]));
    10.         return redirect('/category/create')->with('info', 'Данные сохранены');
    11.     }
    Undefined variable: category (View: /var/www/bossphp.x/resources/views/category/create.blade.php)
     
  24. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.579
    Симпатии:
    1.760
    Что означает эта запись, ты так и не рассказал...

    И я же тебе писал - не кидаются дочерние при вводе, запрашивается при вводе родительская.


    Неймпейс хочет, не понятно, разве?
     
  25. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.105
    Симпатии:
    1.243
    Адрес:
    там-сям
    всё как в прежние годы. знания с убунты стекают как с гуся вода.