Только для читателей Lifeexample возможно открыть интернет-магазин на Moguta.CMS со скидкой в 15%

<<< Как сделать шаблон для wordpress || Массив в Cookie >>>

Организация категорий товаров

17.06.2012
Организация категорий товаров

Здравствуйте, уважаемые читатели блога LifeExample, спешу вас обрадовать новым уроком из серии статей по написанию интернет магазина своими руками. Относительно последнего материала по данной теме, было произведено много нововведений и изменений. Большинство из них охватывают внутреннюю оптимизацию кода и структуры разрабатываемой CMS.

В данном уроке я расскажу только об основных доработках, таких как:

  • организация категорий товаров
  • реализация вложенности категорий друг в друга.
  • редактирование структуры дерева категорий;
  • изменение принципа построения каталога;

С первого взгляда, кажется, что изменения очень просты и не сложны в реализации, но уверяю вас, это не так.

Позволю себе на этом этапе прерваться и сделать заявление.

Мне есть, что сказать интересующимся!

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

Задумывался я уже как с месяц и наконец, пришел к выводу: надо выносить проект дальше, нежели записи в блоге, и дать ему какое-то имя.

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

Встречайте: MOGUTA.CMS

Я уже зарегистрировал домен moguta.ru, и в скором времени все новости по проекту начнут публиковаться именно там.

Кроме этого с сегодняшнего дня стала доступна группа вконтакте: MOGUTA.CMS

Но это еще не все!

Приглашаю к сотрудничеству

Всем, кто заинтересован в развитии проекта MOGUTA.CMS я предлагаю вступить в ряды разработчиков.

Какие плюсы вы получите, вступив в команду:

  1. Реальный обмен опытом;
  2. Возможность творить;
  3. В итоге: готовую, быструю, современную CMS для разработки интернет магазина;
  4. Общественное уважение.

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

Поэтому если ты школьник, студент, или просто умный парень – не упускай возможности, вступай в ряды разработчиков, и со временем наша команда будет занимать свое почетное место на рынке CMS. ( Достаточно оптимистично! 🙂 )

Вернемся к уроку…

Категории товаров

Что такое категории товаров, надеюсь никому объяснять не нужно. Все мы встречали в любом интернет магазине классификацию предлагаемой продукции. Обычно расположен список категорий слева.

Меню категорий

Часто бывает необходимым разграничивать товары внутри категории, на подкатегории для удобства представления информации.

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

Таблица category

В созданной таблице: category, должны быть заведены поля:

  • id – номер категории;
  • title— название;
  • url-отображение с url;
  • parent-номер родительской категории;
  • sort – число для сортировки.

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

Кроме создания таблицы, нужно добавить в таблицу продуктов поле cat_id, для привязки каждой позиции к определенной категории.

Таблица product

Модуль категорий

Под модулем категорий я буду понимать файл category.php находящимся в дирректории \lib\category.php

Я намеренно не стал делать данный модуль моделью, поскольку он необходим для функционирования всей системы в целом, и вызывается за пределами контролера (Вспомнить о принципах MVC).

Данный файл содержит в себе с десяток полезных функций:

  • __construct() – конструктор, который полуает из БД таблицу категорий и сохраняет ее для дальнейшей работы;
  • getInstance() – синглтон;
  • addCategory($array) – добавляет новую категорию в таблицу;
  • editCategory($id,$array) – изменяет значение категории;
  • delCategory($id) – удаляет категорию;
  • getCategoryList_UL($parent=0) – получает список категорий в формате UL ;
  • getCategoryList($parent=0)-получает не форматированный список категорий;
  • getCategoryTitleList() – возвращает лишь список с названиями категорий;
  • getHierarchyCategory($parent=0) – строит иерархический массив категорий (дерево);
  • getTitleCategory($array_categories) – возвращает выпадающий список select с категориями;
  • getCategoryTree($parent=0) — строит древовидный список на основе getHierarchyCategory().

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

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

Для реализации такого совмещенного списка в методе getPageList() модели каталога, был разработан алгоритм получения общего количества продуктов и вывода их по страницам. Для его работы нужно передать список ID всех вложенных в подкатегорий , и соответственно ID выбранной категории.

Сейчас в модели каталога можно увидеть два метода:

  • getPageList() — формирует и выводит список продуктов с постраничной навигацией для публичной части;
  • getList() — формирует и выводит список продуктов с постраничной навигацией для админской части сайта.

Разница у них в том, что несколько иначе формируется постраничная навигация. Это обусловлено реализацией админки на технологии AJAX.

Админская панель, вкладка "Категории"

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

Вкладка категорий в админке

Как видите выводиться дерево категорий, нажав на название каждой, можно вызвать контекстное меню с различными функциями:

  • Редактировать – позволяет изменить имя и положение категории в дереве.
  • Добавить подкатегорию — создает категорию внутри выбранной.
  • Удалить – удаляет категорию, при этом товары, находящиеся в ней не удаляются.
  • Отмена – убирает контекстное меню.

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

Вся техническая составляющая сего компонента скрыта в файле admin\section\category.php, а также в script\admin\category.js.

Обратите внимание, с данной версии я ввел изменения в структуры и взаимодействие файлов системы. Папка admin теперь содержит в себе каталог section, в котором находятся обрабатывающие скрипты для всех вкладок админского меню.

Устройство логики MOGUTA.CMS

На рисунке я попытался провести соответствие между вкладками и файлами. Папка action в свою очередь отвечает за обработку действий, требующих внести изменения в БД, посланых через JavaScript.

Кстати в корневом каталоге сайта в папке script тоже произошла некоторая реформа, согласно которой файлы отвечающие за админскую чась расположены теперь в соответствующей папке admin.

script-js

На сегодняшний день написаны js обработчики только для вкладок: "Товары" и "Категории", как вы видите на вышеприведенном рисунке, кроме catalog.js и category.js есть также и admin.js. Этот скрипт подгружается в момент вызова админской части, и управляет запросами пользователей, позволяя организовать работу AJAX технологии.

Категории в каталоге товаров

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

Редактор каталога товаров

Товары теперь должны принадлежать определенной категории, указать которую можно в окне редактирования товара.

В общем-то, на этом я собираюсь закончить повествовать о сделанном к выходу данного урока, и призываю всех посетить сайт moguta.ru, для скачивания последней версии MOGUTA.CMS, т.е. той самой CMS, о которой идет речь в цикле статей "Пишем интернет магазин на php".

P.S. Я долго думал, и практически был уверен в том, что с данного урока скачать исходный код разрабатываемой CMS можно будет заплатив символическую плату, но здравый смысл подсказал мне не форсировать события. Поэтому скачать исходники можно либо на moguta.ru либо по данной ссылке:

Скачать исходники MOGUTA.CMS ( Скачали: 2941 чел. ) 

Кроме того вы можете внести любую сумму на развитие проекта. По мере внесения суммы на развитие проекта, отписывайтесь мне на почту. Всех те кто не останется равнодушным к развитию системы, получат сюрприз…
Перечисляйте день на webmoney кошелек: R221502812131

<<< Предыдущий урок | Следующий урок >>>

Чтобы не пропустить публикацию следующей статьи подписывайтесь на рассылку по E-mail или RSS ленту блога.

Нравится

Комментарии

  • Lexa

    ух тыыы..новый урок!! Спасибо…Супер…Вечерком приступлю к изучению 😉

  • Lexa

    1. Первое что кинулось в глаза, картинки для товаров не загружаются…(
    2. Пожелания: для товаров добавить два свойства: популярные и новинки. Благодаря этим свойствам по желанию потом можно настраивать главную страницу с выводом популярных и новинок с соответствующими притягательными иконками 🙂

    В принципе сейчас пытаюсь организовать свой магазин на основе вашей системы, результатами поделюсь позже

  • Сергей

    Доброе время суток. Заметил что действительно картинка не загружается на товар… хотелось бы увидеть, что бы описания товара делилось на само описания и характеристики, дополнительное фото… А да еще не хватает хлебных крошек…
    Я верю что со временем получится действительно классная CMS.

    • Да, есть такой баг.
      Как руки дойдут исправлю.

  • Все, поправил. Теперь картинки нормально загружаются.

  • Лог

    Не подскажете как можно добавить в «Продукте» Наличие? Что-то типа «В наличии» и «Нет в наличии»? Спасибо!

    • Нужно в таблицу продуктов добавить поле «est_na_sklade», а потом везде где идет работа с этой таблицей добавить обработку этого поля.

    • Лог

      А можно поподробнее… ибо чайник, это во-первых.
      А во-вторых, в уроке втором переменные объявляются в одном файле в одном (application/models/product.php), а в шестом и ранее не понятно куда всё исчезло и откуда берётся. По крайней мере для меня. Извиняюсь, если вопрос глупый.

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

      в следующем уроке, структура каталогов будет совершенно координально изменена и в статья я постараюсь подробно описать что к чему.

      А что именно вам подробнее объяснить?

    • Лог

      Непонятно где нужно объявить переменную “est_na_sklade”, чтобы всё работало. Спасибо.

    • Просто переменной не обойтись, нужно добавлять поле с таблицу order из базы данных. Если у вас мало навыков в PHP и MySQL, наврядли вы справитесь самостоятельно. Советую обратиться за помощью, в рамках проекта moguta.cms. Т.е. заказать установку сайта на данной CMS системе, либо самостоятельно установить ее а в дальнейшем заказать доработку функционала под ваши нужды.

  • Сергей

    Марк, когда будет продолжения доработки движка? Хочу потренироваться)

    • Продолжение, будет наверное только после того как я полностью переделаю структуру каталогов, и создам рабочую админку. По времени сложно спрогнозировать. Вы можете почитать статью
      Создание CMS этап проектирования
      она тоже относится к курсу уроков, только я ее забыл обозначить как урок)

  • alex

    a chto demo otsutstwuet?, sato zeny na uslugi est!!!

    • Да, демо пока отсутствует. Все что интересует можно уточнить по обратной связи, а также все демо представлено в 1-6 уроках.

  • Яков

    Когда добавляю много подкатегорий они пересатют выводиться на самом сайте. Можете подсказать как можно это исправить?

  • Елена

    Марк, подскажите как лучше сделать. Мне нужно конвертировать базу из DBF (1С7.7). Предполагается что база дбф-ная будет загружаться по фтп примерно раз в неделю, потом заходить администратором и по кнопке загрузить базу, конвертировать из dbf в mysql и заменять соответствующие таблицы?

    • Я бы сделал отдельный плагин с таким функционалом. К сожалению пока последняя версия могуты еще сырая, но уже имеется набросок на использование самописных плагинов. Создайте в папке mg-plugins папку с названием будущего плагина, например uploadDBF, а в ней файл uploadDBF.php.
      В файле напишите

      1
      echo 'Запуск загрузчика DBF;'

      Теперь идите в админку, в раздел плагины, и вы увидете в списке доступных плагинов строку uploadDBF, нажмите на нее и отработав скрипт uploadDBF.php выведет на экран надпись «Запуск загрузчика DBF;«.

      В файле плагина можно создавать любую модель доступную в папке ядра mg-core/application/model, а также пользовательские модели из папки mg-model. Рекомендую создать свои копии нужных моделей, и поместить их в mg-model для дальнейшей работы с ними из плагина.

  • andrey

    Доброго вечера. Нашел вашу СМС Интересует вопрос, как вывести товара на морду? чтоб товары были видны не в каталоге а сразу на сайте. СПасибо за ваш труд.

    • На текущий момент, для вывода каталога на главной странице, нужно создать MVC составляющие для index.php и наполнить из содержимым аналогичных составляющих из catalog.php . В будущем метод вывода каталога на главной странице, будет предусмотрен системой.

  • Александр

    Здравствуйте, разобрал все, включительно этот урок и решил добавить админу функцию добавления других админов… все делал аккуратным и осмысленным копипастом с функций добавления товаров… на выходе получил и вывод таблицы юзеров и форму добавления но увы при клике на «удаление» вообще ничего не происхходит а при нажатии «сохранить нового юзера» (аналог сохранить товар») я получаю эррор по типу неудалось добавить юзера (аналог блаблабла и так понятно)…. не подскажите ли что можно упустить среди всех этих скриптов или что конкретно мог упустить я в рамках этой задачи… искренне благодарен….

  • marshall

    Здравствуйте, помогите пожалуйста…пишу по вашим уроках курсовой…возникли такие ошибки при отображении страницы..буду очень благодарен!

    Notice: Undefined index: route in C:\xampp\htdocs\www\lib\application.php on line 6

    Notice: Undefined index: Auth in C:\xampp\htdocs\www\index.php on line 27

    Notice: Undefined index: User in C:\xampp\htdocs\www\lib\menu.php on line 20

    Notice: Undefined index: cart in C:\xampp\htdocs\www\lib\smalcart.php on line 30

    Notice: Undefined variable: print in C:\xampp\htdocs\www\lib\category.php on line 77

    Notice: Undefined variable: flag in C:\xampp\htdocs\www\lib\category.php on line 87

    Notice: Undefined variable: print in C:\xampp\htdocs\www\lib\category.php on line 77

    Notice: Undefined variable: flag in C:\xampp\htdocs\www\lib\category.php on line 87

    Notice: Undefined variable: print in C:\xampp\htdocs\www\lib\category.php on line 77

    Notice: Undefined variable: print in C:\xampp\htdocs\www\lib\category.php on line 77

    Notice: Undefined variable: flag in C:\xampp\htdocs\www\lib\category.php on line 87

    Notice: Undefined variable: flag in C:\xampp\htdocs\www\lib\category.php on line 87

    Notice: Undefined variable: print in C:\xampp\htdocs\www\lib\category.php on line 100

    • Используйте другой WAMP. Например денвер.

  • lufter

    Чем дальше в лес тем толще партизаны, все стало запутанно переплетено и не понятно. целый день убил, чтоб понять, что это можно сделать в разы проще

  • nasko

    Zdravstvuite u menya takaya oshibka kogda ya nazhimau na knopku oformit’, please help me
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in Z:\home\localhost\www\application\models\product.php on line 40

    Warning: Cannot modify header information — headers already sent by (output started at Z:\home\localhost\www\application\models\product.php:40) in Z:\home\localhost\www\lib\smalcart.php on line 19

    Warning: Cannot modify header information — headers already sent by (output started at Z:\home\localhost\www\application\models\product.php:40) in Z:\home\localhost\www\application\controllers\order.php on line 15

  • Автор

    Здравствуйте. Понимаю, что глупый вопрос. Пытаюсь ваш магазин перенести в папку eshop. И все сразу летит, скажите пож-та, где нужно изменить пути?

  • Александр

    Здравствуйте.
    Столкнулся с такой проблемой.

    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\OpenServer\OpenServer\domains\project.ua\application\models\product.php on line 40

    здесь :

    1
    2
    3
    4
    5
    6
    function getProduct($id)
          {        
             $result=parent::query("SELECT * FROM product WHERE id='%d'",$id);
             if($product = mysql_fetch_array($result))
             return $product;
          }
  • Павел

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

  • Оставить комментарий

    Подписаться на комментарии к этой статье по RSS

    Размещение статей и контекстных ссылок
    Яндекс.Метрика