🔨 Как создавать интернет магазин. Разработка с нуля.

| Автор: / School-PHPSchool-PHP.com | Количество просмотров: 56426
Если Вы попали на этот сайт и ищите разработчика, то Вы попали не по адресу, данный сайт посвящен обучению программистов, а статья - научить программистов делать качественные интернет-магазины.

Если у Вас ещё нет минимальной базы знаний, то добро пожаловать на базовый курс, где Вы получите этот самый минимальный уровень. После прохождения первого уровня у Вас уже будет минимальная техническая база, осталось лишь знания все объединить изучив "Как создавать интернет магазин". Идеально же пройти и оба курса второго уровня моей школы, но не обязательно. Данную статью я бы рассматривал как инструкцию, техническое задание на создание магазина без кода, код каждый напишет самостоятельно. И самое важное, это не "учебник для начинающих", а полноценная профессиональная статья предназначенная не только новичкам в помощь, но и высокой квалификации гуру. Итак, приступим:

Создание интернет-магазинов процесс не очень сложный, но имеет множество интересных деталей, из-за чего создавать сайт можно как 1 неделю сделав всё на низком уровне без должного функционала, так и работать до выпуска первой версии 3 месяца, а уже после дорабатывать, как поступили разработчики rozetka.com.ua.

Создание интернет магазина на базе готовой CMS

Быстрый и хороший способ получить готовый интернет магазин - купить готовую CMS (созданный интернет магазин сторонними разработчиками), где Вашей задачей будет: установить в несколько кликов мышкой, запустить и наслаждаться готовым сайтом. В CMS на подобии 1C-Bitrix, Amiro, OpenCart (свежий рейтинг CMS: http://www.ratingruneta.ru/cms/shop/) встроен весь базовый функционал, но любые доработки будут намного сложнее, чем в случаях самостоятельной разработки, так как Вам необходимо будет не только дописать этот сам функционал, но и разобраться как устроен базовый.
Рейтинг CMS на PHP
Объем необходимых знаний для штамповки сайта на любой CMS достаточно большой, допустим Bitrix создал целую школу: школу обучения CMS 1C-Bitrix. Если у Вас уже есть огромный опыт работа в Битриксе, допустим, то Вы без проблем сможете создавать новые интернет магазины любой сложности, но вот если их нет, то Вы так же много потратите время сопоставимое с созданием самостоятельно подобной сложности сайта. Хочу заметить, что именно самостоятельная разработка интернет магазина распространена среди любителей FrameWork Yii, Zend, Laravel по той причине, что толковых готовых CMS на базе данных фреймворков нет!

Самостоятельное создание магазина

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

Каталог товаров:

Каталог товаров при создании интернет магазина

Одна из самых объемных тем. Если у нас простой магазин без разделения на категории, то создать простую таблицу `products` и поместить в неё товары. Если же появляются категории, то нам обязательно необходимо создавать отдельную таблицу под категории, связь же между товарами и категориями настоятельно рекомендую именно многие ко многим по той причине, что один товар может одновременно располагаться в нескольких категориях (стул - категория для работы и категория для отдыха, или же Брюки-шорты).

В случаях разделения категорий на подкатегории существует 2 пути разработки. Самый простой для новичков в том случае, когда мы 100% уверены, что глубина Вам заранее известна (Категория-подкатегория-подподкатегория), тогда можно уложиться и в хранении категорий в одной таблице, так и в нескольких отдельных. На более профессиональном уровне применяют иерархические структуры данных (Деревья). Существуют 3 основных популярных алгоритма хранения: Список смежных вершин (Adjacency List), Вложенное множество (Nested Set), Материализованный путь (Materialized Path), где каждый из алгоритмов имеет свои плюсы и минусы. Допустим один из них проще получить товары категории, когда как второй позволяет более быстро перекладывать подкатегорию между категориями. Этот подходы позволяют создавать бесконечную глубину, где в категории "Обувь" будет лишь одна подкатегория "пол", а вот в компьютерах мы получим подкатегории такие как "pc", "mobile", pc же разделим на платы "памяти", "видео", "звук", "сетевая", которые мы так же сможем разделить на подкатегории по марке товара: ASUS, INTEL. Давайте взглянем на схемы:
Adjacency List
Adjacency List
Nested Set
Nested Set
Materialized Path
Materialized Path


Обратите внимание, что Adjacency List очень удобен тем, что как бы мы не шли вглубь, всегда у нас есть id_parent и по цепочке можно добраться в самое начало, очень понятный вариант, как мне кажется, так как если мы захотим выбрать все категории внутри FOOD нам достаточно сделать запрос на WHERE `id_parent` = 1. Конечно, тут возникает трудность в построении крошек (Food / Vegetable / Potato), но никто не мешает закэшировать в отдельной таблице или поле эту самую цепочку в любом удобном виде и перестраивать при изменении родителя в цепочке. Если рассматривать Nested Set, то тут можно добавить колонку "type", в которой будем писать, является ли это товаром или категорией, а далее делать выборку всех товаров где стартовый и конечный идентификатор будет в диапазоне родителя. Если Вас пугает, что диапазон 1-14 у Food, то не бойтесь, ведь можно создать 1-100`000, тогда уже все категории и подкатегории поместятся. В этом подходе не так сложно выбрать товары, как перестроить дерево в случае переноса подкатегории в другой раздел, удалении подкатегории или добавлении новой, особенно когда мы хотим сохранить систему сортировки данного дерева. С третьим вариантом Materialized Path всё так же понятно, конечно использовать запросы, пусть даже с индексом, через LIKE '1.1.%' не очень симпатизируют, но вариант вполне рабочий. Некоторые движки могут объединять подходы для более высокого результата. Тема объемная по написанию кода, с другой стороны существует масса готовый примеров необходимых запросов для каждого из примеров. Допустим на уровне Doctrine ORM.

Далее идут фильтры для товаров. Если у нас простой сайт с одной категорией фильтров, то тут ничего сложного, можно в таблицу товаров добавить эти варианты, но если у нас идёт более разнообразные фильтры, то есть для жесткого диска мы применяем фильтры "обороты" и "объем данных", то уже для монитора идут совсем иные фильтры. Тут нам вновь поможет связь многие ко многим:
фильтры товаров - многие ко многим

Как мы видим, тут вновь всё достаточно просто, обращаемся к products_option_value, хотим получить id товаров, у нас имеется id_option (имя опции) и value (значение опции), то есть `id_option` = 'Производитель' AND `value` = 'ASUS'.

А теперь мы приходит к новой проблеме фильтров: фильтры на rozetka, основная проблема в том, что их много, и так для каждой категории или подкатегории. Профессиональные сайты не делают выборку всех пунктов и всех вариантов на каждой странице, после формирования списка фильтров создаётся кэш фильтра, можно даже в формате .html готовый список с радио-кнопками и на странице лишь подключается через include. В свою очередь кэш фильтра перестраивается во время изменения этих самых фильтров в админке, а это значит, что некоторые кэш-фильтры были созданы более года назад и не поддавались изменениям. Нужно ли использовать кэш для простых сайтов? Если честно, то я придерживаюсь позиции, что время - деньги, а оптимизировать надо не всё на странице, а лишь узкие места сайта по необходимости. Если на сайт заходит 100 человек в сутки, до 10 онлайн, то от затраченных человеко-часов заказчик потеряет только деньги за эту работу, но ничего не заработает. А вот вложиться в оптимизацию можно уже в момент необходимости, когда сайт перестанет работать на столь хорошем уровне.

Завершением товаров хотелось бы акцентировать внимание, то свойства: топ продаж, акция, нет в наличии, отзывы, репутация товара - это всё создаётся достаточно просто, одним полем в таблице товаров, особенно когда это относится ко всем товарам в Базе Данных. Я бы этот функционал добавил бы на уровне разработки сайта, ведь создать его достаточно просто, а пользоваться им можно будет в любое время. Не стоит забывать, что разрабатывая магазин в интернете мы так же создаём некий шаблон, который в будущем можно будет перенести и использовать уже на другом сайте!

Корзина товаров и оформление

Корзина товаров - обычный список товаров, которые поместил в корзину пользователь. Для удобства пользования всегда используется JavaScript, нет смысла перезагружать страницу по каждому клику, в свою очередь действие "положить в корзину" или "убрать с корзины" должно изменять содержание страницы. Из Вашей корзины должен убираться товар (список можно выводить на JS, снова же, обычный блок display:block, display:none). И вот теперь мы добрались до одного из важнейших пунктов - интерфейс приложения. Запомните, мы создаём УДОБНЫЙ ПОЛЬЗОВАТЕЛЮ и ПОНЯТНЫЙ ПОЛЬЗОВАТЕЛЮ. Я думал эту фразу написать 36px шрифтов :) Когда человек добавляет в корзину, то он должен видеть какие товары он добавил, у него не должно быть кнопки "добавить товар", так как товар уже добавлен, но должна быть кнопка "убрать с корзины". По клику на добавить или убрать необходимо уведомление, что товар был ДОБАВЛЕН. Можно менять динамически кнопку "добавить в корзину", можно воспользоваться большим и раздражительным, но заметным модальным окном по середине экрана, а можно справа вверху рядом с кнопкой "корзина" отображать, что добавлен был ещё 1 товар. Давайте глянем на эти варианты:


Второе правило работы с клиентами гласит, что все клиенты "почти" слепые, глухие, немые и тупые :) Прошу прощение, если кого-нибудь мог обидеть, все совпадения с реальными людьми вымышлены! Правило очень простое - показать, объяснить, акцентировать внимание и т.д. На самом деле многие бизнесмены и программисты со стажем так думают, но не со зла, а с заботой, чтобы создать более удобный и простой интерфейс.

В продолжении создания корзины для интернет магазина надо сразу представить где мы будем хранить эту самую корзину. На ум приходит SESSION, COOKIE, MySQL и т.д. Сразу отсеиваем SESSION, так как любого человека могут отвлечь во время оформления заказа на любой её стадии. Человек должен вернувшись на сайт продолжить оформлять свой заказ. MySQL плох тем, что мы будем со временем засорять нашу Базу Данных неоформленными заказами, которые надо будет чистить по крону спустя месяц игнорирования заказа. Куки же плохи тем, что люди могут начать заказывать на телефоне, а продолжить уже на PC дома или в офисе. Создание личного кабинета и корзины или, хотя бы, SESSION в MySQL позволит решить эту проблему, достаточно будет лишь убедить человека зарегистрироваться или авторизироваться.

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

Поиск на сайте


Конечно на сайте это отдельный целый инструмент, по факту я хотел бы акцентировать внимание на подобный поиск, где при наборе выходит список с подсказками: Search Dropdown:
Search Dropdown

Работает функционал через вывод найденных элементов в нижний DIV. При изменении поля дёргается скрипт, который и выполняет подстановку. Для простых списков AJAX не нужен, но могут быть списки и более сложные, попробуйте вбить слово war на сайте: https://goodgame.ru/, выглядит это так:
Search Dropdown

Опережая Ваш вопрос скажу сразу, что поиск идёт по всем необходимым таблицам, по всем необходимым полям. В связи с чем запросов много, код обрабатывается тяжело. Конечно, не стоит впадать в безумие и делать поиск по всем таблицам, когда наш сайт посвящен продаже товаров, наша цель подсказать и вывести товары пользователю, значит запрос делаем к таблице товаров, но имейте ввиду, что бывают и более обширные объемы. Для поиска в центре слова не используют LIKE %буква%, а используют поисковые системы Sphinx и т.д. (о Sphinx есть во втором уровне PHP, но я не агитирую).

Создание CMS интернет-магазина - админ панель

Удобно, просто, понятно - это итак очевидные вещи, давайте акцентируем внимание на безопасности. В первую очередь даже над минимальным интернет-магазином начинают работать несколько сотрудников и не всегда эти сотрудники хорошие люди. Важно понимать, что сотрудников и даже Вашего босса надо оградить от ненужного ему функционала, - никто не отменяет уязвимости CRSF в админке. Допустим, редактор товаров на сайте должен иметь право добавлять товар, а так же отредактировать и удалять только свои товары. Раздел клиентской базы, контакты, email адреса - всё это скрываем от данного сотрудника. Слежку никто не отменял, поэтому не забываем логировать действия сотрудников и это не только полезно от вредоносных действий, но так же позволит быстрее определить источник багов на сайте, а их будет и не один десяток при первой разработке сайта. Мне нравится уже придуманная ранее до нас система распределения прав в файловой системе Unix: "владелец", "группа", "остальные". Используя связь многие ко многим мы создадим группы "менеджер товаров", "менеджер статей", далее человеку, который должен иметь право пользоваться разделами товары и новости как раз присвоим эти 2 раздела (снова же нас спасает связь многие ко многим). В тему безопасности я бы добавил, что нельзя давать администраторам и менеджерам полной правки HTML на сайте, хватит и обычного редактора WYSIWYG с отключенным форматированием HTML кода. Пример взят отсюда: TinyMCE.
TinyMCE WYSIWYG редактор

В тему удобства я бы ещё добавил идентификаторы количества изменённых действий. То есть если 10 заказов сформировали клиенты, значит в админке напротив вкладки "заказы" должна красоваться цифра 10.
Когда требуется быстрое реагирование на заказы, то вешают крон и добавляют Notifications. Поверх этого ещё звуковой сигнал, который отлично проявил себя ещё со времён icq, сегодня - skype.
Блокировка сайта - функционал, при котором на сайт ставится заглушка "временно не работает", и пока заглушка стоит, Вы можете чистить Базу Данных, перегонять новый прайс вместо старого или проводить другого рода технические работы. В целом, пока оборота не будет слишком большого, то и от подобной заглушки толку нет.

Наблюдение за функционированием сайта. Обычный код, который проверяет все файлы на изменение (с момента последней проверки), запускается по крону, игнорировать можно фото и видео файлы для снижения нагрузки, скрипт должен рекурсией пройтись по всему сайту и убедиться, что изменений не было. Если какой-то из файлов был изменён, то необходимо бить тревогу! Скорее всего сайт был взломан или был загружен вирус. Я бы делал огромное уведомление при каждом заходе на сайт о состоянии сайта. Если уж углубиться, то подобные вещи можно слать СМСкой на телефон или по почте для ускорения реагирования. Помимо взлома необходимо быть уверенным, что служба CRON работает нормально. Любой сбой службы может привести к тому, что cron не будет работать и Вам надо будет его перезагружать вручную. Самый простой способ в начале выполнения крон-скрипта добавлять в MySQL пометку о том, что скрипт начал выполнение в специальную таблицу контроля. При открытии админ панели выводить сообщение, что крон не был выполнен в случае ошибки. Если мы ставим выполнять крон каждый 1 час, то ставьте "бить тревогу" когда прошел интервал более 1 часа и 1 минуты между вызовами.
Мониторинг за функционалом

Резервное копирование. Один из важнейших моментов для бизнеса. Пункт №1 - всегда необходимо иметь полную копию сайта локально у себя, а так же эту же копию предоставить заказчику. Далее снимать вручную бек-ап MySQL можно через Sypex Dumper 2. Можно поставить на cron вызов:
mysqldump -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql

Если объемы не очень большие, то поставьте на cron запуск скрипта 1 раз в 1 час / 1 сутки, и по созданию dump.sql отправляйте его на указанную почту и тут же удаляйте. Генерируйте уникальное имя, закройте доступ из-вне к sql файлам сервера. Вызвать внешнюю команду через PHP можно при помощи функции exec.
Бек-апы можно создавать и на уровне хостинга, зачастую всего за 30 рублей можно приобрести такие услуги:
Создание бек-апов на уровне сервера

Но тут не стоит забывать, что можете столкнуться с ситуацией, когда админы хостинга напишут "извините, у нас бек-апы не создавались", хотя Вы платили за них (жизненный опыт, повезло, что я хотел лишь одну запись откатить, но название хостинга называть не буду). Поэтому доверять посторонним людям мне кажется глупой идеей. Для более профессиональных высоконагруженных серверов берут 2 отдельных сервера, где связывают MySQL между серверами при помощи MASTER-SLAVE репликации, а файловую систему синхронизируют через rsync.

Поддержка

Помните главную вещь - сайтов без багов не существует! Есть баги, которые всплывают сегодня, а есть те, о которых клиент узнает спустя несколько лет. Продавая сайт Вы всегда должны давать гарантию, что Вы будете поддерживать сайт. Зачастую схема такая - первые месяца поддержка бесплатная, а по окончанию за плату. Профессиональные фирмы могут не давать бесплатную поддержку в начале, так как у них уже исправлены все ошибки базовые. Зачастую новые версии выпускаете не только Вы, но и крупные системы вроде Yii, Zend, Laravel, ведь кто-то нашел новую дыру в огромном ядре. Что делать? Идите обновляйте у себя, убедитесь, что обновление не поломало работу сайта, а далее загружайте исправления клиентам. Идеально было бы, когда система имела функционал самообновления, то есть если выходит новая версия, то она автоматически загружается всем пользователя и Вам не придется бегать за каждым клиентом. Выпускайте с Вашей стороны патч и наслаждайтесь свободой (данная система действует в Windows, Google Chrome, Антивирусы и т.д.). Единственное, я бы настоятельно рекомендовал проверять по 10 раз обновления перед загрузкой. А система обновления всегда создавала резервную копию обновляемых файлов (резервируют обновляемые файлы: nVidia drivers, Windows и т.д., из-за них Ваше место на винчестере с каждым днём сокращается :) ). Данная тема поддержки попала в эту статью не для того, чтобы научить Вас поддерживать сайт, а научить создавать сайт, в котором будет встроен механизм поддержки.

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

Комментарии о School-PHP (0):


Напишите свой комментарий:
Имя:
E-mail:
на него отправится ответ
Skype Станислава:
напишите мой скайп
(есть внизу страницы)
Введите комментарий:

* Комментарий при отправке отправляется на пре-модерацию. Вынужденная защита от спама, чтобы сайт был чистым.

Персональный блог Ускова Станислава: School-PHP.com

В основном в данном блоке идут посадочные страницы с целью привлечения аудитории из Google и Yandex. Под каждый поисковый запрос создаётся отдельная страница, в итоге мы получаем много статей на разные темы, при этом полезны только для того, кто был заинтересован именно этим запросом. Для остальных же всё же советую сосредоточиться на прохождении общей программы курса!
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы