Урок 1. Вывод категорий

Дата публикации: 20-08-2013

каталог товаров

От автора: совсем недавно мне пришлось переписывать движок для одного из сайтов. При этом передо мной встала задача реализации полноценного каталога товаров. В этой серии уроков я бы хотел поделиться с Вами в общих чертах своим решением.

При этом данный каталог можно считать вполне готовым продуктом для использования на собственном сайте. К тому же, каталог будет обладать всеми теми «плюшками», которые зачастую и присущи любому каталогу продуктов.


скачать урок скачать исходники

Все уроки курса:

Метки: , ,

Комментарии (97)

  1. Эрл

    Warning: mysqli_query() expects parameter 1 to be mysqli, null given in G:\home\php_site\www\functions.php on line 16

    Warning: mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, null given in G:\home\php_site\www\functions.php on line 19 В ЧЕМ ТУТ ПРОБЛЕМА

  2. Александр

    Андрей, можно поинтересоваться? А что за редактор вы используете на видео?

  3. Владимир

    Добрый день. Подскажите, делаю все по уроку, выводит массив. А когда вставляю ф-цию построения дерева, ничего не происходит, все остается, как и было. Даже если продолжить следование, то в конечном итоге получаю красивый список ссылок, но без «дерева»? Что я могу делать не так.

    • Владимир

      нашел ошибку.

      • Иван

        большое вам спасибо! учусь по вашим урокам — создание магазина с нуля. жаль, что пока не могу за них заплатить(извините))) но, надеюсь смогу вам оплатить ваш труд в дальнейшем..
        хотелось бы еще увидеть ваши уроки по созданию сайта(например магазина) с нуля и без фреимворков. потому как sql уже устарел, php уже 7, а фреимворки на начальных этапах наверно лишнее..
        еще раз вам Большое спасибо за работу. ваши уроки лучшее, что я смог найти!!!

  4. Дмитрий

    Здравствуйте. Получил не очень понятный эффект. Аккордеон разворачивает список детей, но не кладет в GET category родителя всех этих детей. Дети прекрасно видны в аккордеоне и кликабельны. Я ожидал что вместе с разворачиванием детей category в строке GET останется от родителя — до момента выбора какого то из детей. Я неправильно думал ?

    • Андрей Кудлай

      Здравствуйте. Насколько я понял, вы хотите, чтобы при клике по родительской категории не только она раскрывалась, но и происходил переход в саму эту категорию? Если я верно понял, то для этого нужно просто в метод плагина передать необходимую опцию. В уроке Каталог товаров. Отвечаем на вопросы. Часть 2 я показал этот момент.

  5. Дмитрий

    Вдогонку. Распечатываю массив $categories_menu — все ссылки на category нормально вижу в адресной строке.
    Помещаю с (как сделано в уроке) и вывожу через аккордеон — возникает сдвигание-раздвигание, но category перестает формироваться у тех строк, которые имеют потомков.

    • Андрей Кудлай

      1. Совсем не понял о чем речь… у вас что-то не получается по уроку или вы пытаетесь сделать что-то свое? Если не получается по уроку, тогда можно банально сравнить ваш код с кодом из исходников. Если не получается сделать что-то свое, то для того, чтобы что-то посоветовать, для начала нужно понять, что вы пытаетесь сделать. Также не понял, как распечатывая массив, можно видеть его ссылки в адресной строке.
      2. Для решения вопросов, связанных с кодом, у нас есть форум.

  6. Дмитрий

    Вижу, что отрезались теги в предыдущем послании. Там было написано, что я помещаю в меню ul и li.

  7. Евгений

    Помогите, пожалуйста. У меня не работает mysqli (с mysql проблем нет). Почему-то Notepad++ его тоже не подсвечивает. В файле php.ini данное расширение подключено. В чем может быть проблема? В интернете решения данной проблемы не нашел. На Вас последняя надежда.

    • Андрей Кудлай

      А что именно значит «не работает»? В чем это проявляется? Какие ошибки получаете? Создайте, пожалуйста, тему на нашем форуме, покажите ошибку и участок кода, вызывающий данную ошибку.

  8. Алексей

    Подскажите, а как в плагине accordion сделать по умолчанию изночально открытым один пункт меню?

    • Андрей Кудлай

      Внимательнее пересмотрите урок, я ведь показывал такую возможность, за это отвечает опция active, значением которой можно установить индекс нужной секции. Также дополнительно нужно проверять, не установлена ли кука со своим индексом секции, чтобы не открывать секцию по умолчанию, если уже что-то записано в куки (это уже код не для комментариев, здесь можете создать тему на форуме, если не разберетесь).

  9. Алексей

    Спасибо, просто урок до конца не досмотрел и принялся быстрей делать). разобрался..

  10. Дмитрий

    Спасибо за уроки!
    Т.к. «зелен» еще в PHP, попал на сайт — как клад нашел! Пошел на форум..

  11. Борис

    Добрый день!
    Урок интересный и понятный.
    я сделал вывод в браузер по другому мне кажется так проще, вот только на могу подключить аккордеон.

    :

    $item): ?>

    — <a href="?view=cat&category=»>

    $item): ?>
    - <a href="?view=cat&category=»>

  12. Борис

    :

    $item): ?>

    — <a href="?view=cat&category=»>

    $item): ?>
    - <a href="?view=cat&category=»>

  13. Alexsandrbios

    function map_tree($dataset) {
    $tree = array();

    foreach ($dataset as $id=>&$node) {
    if (!$node['parent']){
    $tree[$id] = &$node;
    }else{
    $dataset[$node['parent']]['childs'][$id] = &$node;
    }
    }

    return $tree;
    }

    Эта функция намного мощнее чемта которая была в уроках по созданию магазина сябки за функцию терь точно менюшку передалаю на более многоуровневую)))))))

  14. Александр

    Подскажите, как сделать сортировку категорий по названию

    • Андрей Кудлай

      Использовать ORDER BY в запросе.

      • Александр

        При таком запросе сортируются только подкатегории

        • Андрей Кудлай

          Я не вижу вашего запроса и кода. Создайте тему на форуме, покажите запрос, тогда можно будет подсказать что-то конкретное.

  15. Алексей

    Подскажите, как сделать постраничную навигацию такого меню?

    • Андрей Кудлай

      Вы имеете в виду постраничную навигацию товаров в категориях этого меню? Если так, то такие уроки есть далее в цикле Каталог товаров.

      • Алексей

        не совсем. Допустим если нужно такое меню использовать на странице в виде контента.
        т.е. нужно разбить основные категории по страницам.
        На пример на первой стр. 5 основных категорий + подкатегорий
        на второй стр. следующие 5 основных категорий + подкатегории и т.д.

        • Андрей Кудлай

          Разницы нет, поскольку алгоритм постраничной навигации одинаков для любого контента, будь то статьи или категории. Просто получайте необходимое количество корневых категорий для каждой конкретной страницы и выводите их.

  16. Андрей

    Андрей, благодарю Вас за урок. Но у меня один вопрос по плагину «аккордеон» — при переходе на главную страницу аккордеон так и показывает выбранный пункт меню до перехода на главную — это вводит в заблуждение, можно ли как-то сделать сброс по клику на ссылки с определённым id, например? С javascript я мало сталкивался…

    • Андрей Кудлай

      Андрей, для этого достаточно при переходе на главную страницу удалять куку, в которой и запоминается состояние аккордеона. Такой вопрос уже задавался на форуме и там же есть ответ на него в этой теме — http://webformyself.com/forum/index.php/topic/3008/

      • Андрей

        Читал, но дело в том, что мне нужно не только при переходе на главную удалять куки. При переходе из карточки товара по хлебным крошкам, топ товаров и прочее там везде есть левый сайдбар с меню и необходимо очищение куков. нужно зацепить на наличие у ссылки передачи определённого data-type или ещё как-то лучше я ничего не придумал

        • Андрей Кудлай

          Ну я с Вашим сайтом и ТЗ не знаком, поэтому конкретного ответа дать, конечно же, не могу, но суть остается той же — на нужных страницах необходимо удалять куку. Прикреплять для этого атрибуты к ссылке необязательно.

  17. Sergei

    Notice: Undefined variable: string in C:\xampp\htdocs\catalog\functions.php on line 47

    И далее в каждом дочернем пункте меню:

    Notice: Undefined variable: string in C:\xampp\htdocs\catalog\functions.php on line 47

    В чем проблема?

    • Андрей Кудлай

      В том, что все ошибки выводятся на экран. Подробный ответ, как это исправить — в 11-ом уроке курса. Также ответ на аналогичный вопрос давался когда-то на нашем форуме, можете попробовать поискать.

  18. Евгений

    А как из базы теперь удалить все подкатегории категории ? ведь их там может быть неограниченное ко-во.

    • Андрей Кудлай

      Для этого создается админская часть, в которой и осуществляется управление категориями.

  19. Евгений

    Это я в курсе, что админ панель нужна.
    Я имею ввиду как удалить категорию и все ее подкатегории любой вложенности за один раз, что бы не приходилось заходить в подкатегорию и не удалять сначало ее, а сразу удалить всю ветвь.

    Я вот могу удалить не более 2-ух уровней, а все что находится глубже второго, остается в базе как мусор.

    mysql_query(«DELETE FROM categories WHERE parent = $id»); // Удаляем подкатегории

    mysql_query(«DELETE FROM categories WHERE id = $id»); // Удаляем категорию

    • Андрей Кудлай

      Этого не сделать запросом при такой структуре БД. Задача решается работой с массивом категорий и решение можно найти в 3-ем уроке курса — Вывод товаров, где получаются все товары запрошенной категории (включая и вложенные категории). В уроке пишется функция, которая по переданному ID получает все ветки потомков без ограничения уровня вложенности.

      • Евгений

        Спасибо Андрей! Посмотрел и все стало понятно.
        А у вас в этом видео курсе админка делается, просто из оглавления я не понял, все заканчивается на Уроке 52. Структура админской части., но в одном уроке всю админку не распишешь же.

        • Андрей Кудлай

          Пожалуйста, Евгений :)
          Да, как раз с 52-го урока и начинаем делать админку.

          • Евгений

            А как вы в Mozile поиск в низу включаете ?

          • Андрей Кудлай

            Стандартной комбинацией клавиш Ctrl+F. Это сочетание клавиш актуально и для других браузеров.

  20. Евгений

    Может как то можно получить все категории у которых parent не равен ни одному из всех доступных id.

  21. Евгений

    Пожалуйста при написании админке сделайте что бы можно было выбрать checkboxом какие категории удалить, и соответственно всю вложенность каждой выбранной категории.

  22. Евгений

    Подскажите пожалуйста я пытаюсь сделать это все в codeigniter 3

    но он пишет ошибку на строку

    $dataset[$node['parent']]['childs'][$id] = &$node;

    Line: 32
    Function: _error_handler

    без фрэймворка все работает.

    • Андрей Кудлай

      1. Для решения вопросов, связанных с кодом, у нас есть форум.
      2. Из сообщения совсем не понять, что именно «не нравится» фреймворку. Если будете задавать вопрос на форуме, тогда неплохо было бы выложить текст ошибки — без этого можно только гадать, в чем именно ошибка и как ее исправить.
      Рискну предположить, что ошибка в разной структуре массивов. Т.е. массив, который формирует фреймворк, отличается от массива из урока. Например, когда я использовал эту функцию во фреймворке CakePHP, причина была именно в этом. Соответственно, нужно вносить правки либо в код функции, либо, если это позволяет фреймворк, получать массив нужного формата.

  23. Алексей

    Здравствуйте, сделал меню по вашему уроку, но почему-то когда меняешь в плагине Accordion() свойство » eventType:’mouseover’ » то не работает эффект открытия меню при наведении мыши
    Почему? помогите разобраться

    • Андрей Кудлай

      Здравствуйте, Алексей.
      Для свойства eventType можно использовать значение hover, значения mouseover, насколько я вижу, нет.

      • Алексей

        Я пробовал — eventType:’hover’ , но все равно не работает, а при нажатии на пункт меню сразу переходит по ссылке, как будто нельзя использовать ‘hover’

        • Андрей Кудлай

          Для работы события hover дополнительно нужно подключить файл jquery.hoverIntent.minified.js (подключать перед подключением плагина аккордеон). Подключили такой? Если подключили но все равно не работает, тогда задайте вопрос на нашем форуме, дайте ссылку на архив с Вашим кодом, я попробую посмотреть.

  24. Дмитрий

    Здравствуйте!

    Установил два меню на аккордеоне на один сайт. Меню по разделам разные, но сам код аккордеона одинаковый. Проблема в том, что при открывании одного из разделов одного меню, параллельно после обновления страницы открывается этот же раздел у другого меню. То есть они взаимосвязаны, откроешь раздел в первом меню, сработает и во втором меню. Помогите, пожалуйста, как исправить это.

    С уважение, Дмитрий.

    • Андрей Кудлай

      Здравствуйте.
      Используйте для второго меню другой класс и вызывайте аккордеон для нового класса. В качестве параметра укажите другое имя для куки. Если возникнут дополнительные вопросы, тогда задайте вопрос на форуме, и я покажу пример кода (здесь код выкладывать не очень удобно).

  25. Руслан

    Здравствуйте Андрей!
    Подскажите пожалуйста, откуда берется названия ссылок меню? Заранее спасибо!

  26. Руслан

    С прежним вопросом разобрался, последний вопрос: как назначить адрес перехода на страницу детального описания товара? заранее спасибо.

  27. Екатерина

    Андрей, помогите сам аккордеон не работает. Ради теста скопировала файлы урока, не меняя имена класса. Не работает. Файлы подключены, через браузер их видно и можно открыть. Не пойму с чем может быть проблема.

    Андрей я понимаю что это платный курс, и вы не обязаны помогать … но все же может быть хотя бы совет дадите с чем это может быть связано.

    Заранее спасибо.

    • Андрей Кудлай

      Екатерина, причин может быть сколько угодно, здесь только нужно смотреть, что Вы делаете не так. Одно могу сказать точно — исходники однозначно рабочие, поскольку вот только что скачал и проверил, у меня аккордеон работает. Да и сотни других людей прошли эти уроки — особых проблем ни у кого нет. Можете написать доступ к Вашему компьютеру через TeamViewer, в качестве исключения я подключусь и попробуем вместе посмотреть, почему у Вас не получается.

      • Екатерина

        Андрей, спасибо вам большое за отзывчивость. Заработал аккордеон. Проблему была в последовательности подключаемых файлов .js. У меня первым был подключен workscripts.js. Первым сделала jquery-1.9.0.min.js и все заработало. Глупейшая ошибка, сидела 3 дня :) Спасибо еще раз :)

  28. Alex

    Почему это не в ООП. С пониманием ООП как то проблемы

  29. Игорь

    Можно ли оплатить в Украине на приват банк ?

  30. medvedevivan21@mail.ru

    Здравствуйте!1-й урок,выводит -»нет соединения с БД»,стоит OpenServer,что-то не так с настройками OpenServera?

    • Андрей Кудлай

      Здравствуйте.
      Проверяйте корректность настроек соединения с БД в коде. Настройки сервера здесь не при чем, скорее всего.

      • medvedevivan21@mail.ru

        Здравствуйте!Вот это сообщение -»корректность настроек соединения с БД в коде»,это где?в коде,но я его перепроверял,всё как у Вас написано,точь в точь.Если OpenServer то где эти настройки?

        • Андрей Кудлай

          Еще раз, это не Open Server и если Вы полезете в его настройки, то, скорее всего, просто все сломаете (ну а вообще, конфигурация MySQL доступна в меню Дополнительно — Конфигурация). Можете написать мне в личку на форуме доступ к Вашему компьютеру через TeamViewer, я подключусь и попробуем вместе посмотреть Вашу проблему.

  31. Олег

    Здравствуйте, Андрей.

    Вот тут такой вопрос возник. Я сделал всё, как у вас. Всё работало. Потом добавил аккордеон ( подключил jquery-ui и сам jquery и дописал нужный скрипт вместе вывода), меню скомпоновалось, но подкатегории перестали выводится. Почему-то перестала работать функция построения дерева, она в упор не видит дочернии категории, а выводит только основные. Никаких ошибок не выдаёт не PHP не Mysql не JS. Я даже полностью удалил скрипты, но проблема не уходит. Не подскажите в чём может быть проблема, а то я уже не знаю за что схватится?

    • Андрей Кудлай

      Здравствуйте, Олег.
      Проблема либо в разметке, либо в конфликте сриптов, либо в других ошибках JS. Только такой абстрактный ответ можно дать, не работая с Вашим кодом. Что можно посоветовать здесь? Отказаться от jQuery UI. Зачем Вам его аккордеон, если мы итак сделали в уроке аккордеон не хуже?

      • Олег

        В том то и дело, что я ничего не трогал из разметки, или самих функций, просто доставил скрипты и всё. А функция просто перестала работать…причём всё остальное работает. Далее, скрипты я полностью снёс, но проблема никуда не делась. А что касается аккордеона, то урок аж 2013 года, и я подумал что вы ставите именно Jquery аккордеон, мало ли, как названия файлов поменялись с того времени)У меня вообще создаётся впечатление, что функция то ли срабатывает наполовину, так как происходит баг при определении дочерних элементов… то ли попросту пропускается обработчиком, опять же при каком-то баге, при определении её, как функции. Ладно буду искать варианты решения) Кстати вопрос на засыпку, можете посоветовать какой-нибудь урок или статью, где будет объяснятся, как сделать комбинированное меню. Т.е первый уровень аккордеон например, а последующие открываются в бок при наведение или клике, а то в гугле всё время какая-то ерунда выдаётся. Заранее спасибо.

        • Андрей Кудлай

          Ну выше я и написал, что одна из возможных причин — это конфликт скриптов, которые Вы добавили. Относительно того, как будет открываться меню (вниз или вбок) — это исключительно вопрос верстки и к скриптам никакого отношения он не имеет. Вот, например сайт, где меню строится по тому же принципу, но вложенные пункты всплывают справа — только благодаря верстке.

  32. medvedevivan21@mail.ru

    Здравствуйте!Почему то и сам набивал код.и материалы исходников дают такое положение http://pastenow.ru/1BAA3 Главная и следующие элементы на совмещаются в «единый блок»,почему так,особенно не понятно,что в уроке всё чётко расположено,код тот же,у меня «в разнобой».

    • Андрей Кудлай

      Здравствуйте.
      Урок записывался с шириной экрана 1024 пикселя, поэтому на экране все выглядит так аккуратно. Можете уменьшить ширину своего браузера и увидите то же самое. Чтобы все смотрелось хорошо и на большом экране — просто перенесите ссылку на главную страницу внутрь блока с классом sidebar.

      • medvedevivan21@mail.ru

        Здравствуйте!Всё,супер!всё встало на место,я как-то про разрешение экрана и не подумал.Ссылку внутрь блога поставил и всё на месте.Спасибо!!!

  33. Сергей

    Андрей, приветствую!
    Существует меню категорий и в левом и в правом сайтбаре.
    Можно ли оптимально реализовать в инетмагазине вывод категорий, крошки, товары и т.д. или писать код отдельно и для левого и для правого меню?

    • Андрей Кудлай

      Здравствуйте, Сергей.
      Если это одно и то же меню, тогда код будет одним и тем же для каждого сайдбара. Если меню разные, тогда, как минимум, нужно выполнять разные запросы. Все остальное (крошки и товары) должно работать одинаково для любого меню.

      • Сергей

        Да, разные меню. И видимо кроме запросов еще и разные таблицы в базе данных т.е. таблицы с категориями и товарами для левого и отдельно таблицы для правого меню!?

        • Андрей Кудлай

          Не обязательно. Таблица товаров точно может быть одна. Зачем там еще одна? А для таблицы категорий просто достаточно ввести поле меню, в котором будет храниться номер меню, в котором будет выведена та или иная категория.

          • Сергей

            Андрей, спасибо за помощь, все получилось и с аккордеоном (синхронное открытие, проблема описанная выше) тоже решил проблему.
            p.s. в таблице с категориями сбилась авто нумерация ID, т.е. вместо ожидаемого например 30 присваивает именно 255. Меняю ID руками для сохранения нумерации, но следующий опять 255. Как решить проблему?
            Спасибо!

          • Андрей Кудлай

            Поле ID трогать не нужно. За этим полем должен следить сервер — это его задача, если для поля установлен первичный ключ и автоинкремент. Так что нумерация не по порядку — это не проблема.

  34. Сергей

    Спасибо!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree