27
2009
Магазин для MaxSite CMS
Понадобилось поставить в дополнение к сайту на MaxSite простейший интернет-магазин. Список товаров (их немного) с ценами и описанием, корзина, оформление заказа. И ещё некоторые мелочи. Действительно мелочи. Ради такого ставить Мадженто или даже osCommerce — излишество не просто полное — а вообще нереальное.
Полез искать, что из малюток может предложить нам Open Source. Ибо время поджимало (ведь пока гром не грянет — жареный петух держится в отдалении) Нарыл штуки три. Из них один на файлах, а не БД (соответственно, идёт в лес) и все три в 1251. Обязательность базы данных в том, что префикс таблиц магазина я поставил в mso_shop_ и таким образом имею возможность работать с ним силами МаксСайта.
Ладно, скачиваю ShopScrip free. У него есть редакция premium за денюжки, поэтому есть надежда, что лайт-версия более-менее нормальная. И действительно, ≈700кб считая смарти, инсталятор и шаблон, минимальный функционал, ничего лишнего. Пять табличек в базе, против минимум полусотни в любом серьёзном двигле. Мелочей не хватает, но они дописываются в пару часов, считая исследование движка. А что 1251 — потерплю. База в юникоде, вывод заголовков правится в .htaccess.
Лезу в код.
Ну ладно, фигня, что шаблон на таблицах. Всё равно нужно делать свой. Но вот нарушения в табличной структуре — это уже тревожный звоночек, говорящий о небрежном отношении к качеству кода. Лезу в движок дальше.
Мешанина html и php, ни о каком разделении на модель, представление и контроллер речи не идёт. ООП вообще не пахнет. Это не говоря уже о километровых проверках if (isset($_GET['…'])). Читается код так себе. Хорошо хоть, что его немного. Отдельного роутинга нет, параметры передаются через GET. С одной стороны проще разобраться в архитектуре, а с другой — как следствие, нет ЧПУ.
Вобщем, общее впечатление было не лучшим, к тому моменту, как дошёл до формирования заказа. И вот
здесь меня постиг нецензурный… Этот самый… Они без всякой проверки и фильтрации POST суют в базу. Шайтаны, вот прям берут и
- if (isset($_SESSION["gids"]) && $c) {
- db_query("insert into ".ORDERS_TABLE." (order_time, cust_firstname, и так далее) values ('".get_current_time(). "','".$_POST["first_name"]. "','".$_POST["last_name"]. "','".$_POST["email"]. "','"и так далее"');") or die (db_error());
- …
- $q = db_query("SELECT name, Price, product_code FROM ".PRODUCTS_TABLE." WHERE productID='". $_SESSION["gids"][$i]. "'") or die (db_error()); }
Я не говорю уже о том, что отвратительнейшая обработка ошибок. И это я ещё не смотрел, где они сессии хранят.
На форуме крупном нашёл темку «Взломали магазин на ShopScrip premium». Особо не вчитывался, но там о других уязвимостях речь шла. Описал эту ситуацию. А мне говорят, что в премиуме тоже без проверок из POST составляют SQL. Ну, типа,
- db_query("insert into ".SPECIAL_OFFERS_TABLE." (productID, sort_order) values ('".$_GET["new_offer"]."',0)") or die (db_error());
В комментариях в ЖЖ меня спросили, не проверял ли я, может, массивы $_POST и $_GET где-то раньше обрабатываются централизованно. Но многокилометровые isset как-то на это не намекают, а в индексном файле в самом начале полдюжины переменных инициализируется вот таким способом
- if (isset($_GET["register"]) || isset($_POST["register"]))
- $register = isset($_GET["register"]) ? $_GET["register"] : $_POST["register"];
Чтож, время поджимало, и я принял либеральное решение. Сейчас ставлю этот движок, показываю заказчику, что магазин есть и работает, а как только заказчик отвернётся, делаю всё нормально и без спешки.
В настоящий момент магазин установлен и на морду выводится силами макссайта. Устойчивость ко взлому, естественно, на порядок возросла. Однако сразу предупреждаю, магазин не предназначен для большого количества товаров и для высокопосещаемых проектов.
Из-за ограниченности во времени интеграция магазина в cms разбита на этапы:
- Запуск магазина: админка одним движком (авторизация и прочее управление на его совести) — категории, товары и так далее. Вывод товаров по категориям, складирование в корзину, оформление заказов — сделано через типы данных MaxSite. Вся функциональность лежит в шаблоне в файле типов. Никаких опций, всё прописано жёстко в коде. Уже не актуально.
- Потом сделать регистрацию коммьюзеров (при отключенных комментариях, соответственно, нужна классическая ссылка «регистрация»), прописать запрет на покупки анонимам и привязать совершение покупок к коммъюзерам. Виджет авторизации для коммъюзеров есть, спасибо Максу. А ещё чтобы каждый коммъюзер мог посмотреть историю своих покупок. Да и комментарии, возможно, где-то на сайте этом ещё понадобятся. Приоритет задачи переносится на четвёртое место.
- Следующим этапом нужно создать плагин в MaxSite, через который можно будет управлять разными опциями и т.п., корзину убрать из шаблона и сделать виджет корзины, аналогично с курсом валют. Убрать из кода hardcode и вставить опции. Перенести управление товарами и их категориями в этот плагин, отдав авторизацию и разделение прав МаксСайту. Сам движок магазина можно будет удалять. Управление товарами-категориями ещё не перенесено в админку макссайта, точнее, ещё не работает нормально.
- Затем вообще перенести всё в плагин. С версии 0.32 Максим сделал возможность для плагина перехватывать и переопределять ссылки, теперь нет необходимости писать свои типы данных. Достаточно повесить плагин на ссылку shop. И можно будет убрать из шаблона. Сделано. Оказалось ну очень просто. Я даже удивился.
- Сюда же чистка кода, рефакторинг и оптимизация, пропускание строк через локализацию и тому подобное. Только после этого и не раньше плагин можно будет выкладывать на паблик. Понемногу в процессе. С плагином предполагаются два файла переводов: английский и украинский. Не слишком высокого качества.
- А с этого момента идут навороты. Добавлять рейтинги (в исходном движке они есть, но…), аякс и так далее. Вобщем, развитие плуга. По просьбам — надо будет добавить импорт товаров из xsl или хотя бы csv.
Следом управление товарами переведу под одну админку, а уже тогда буду делать регистрацию с историей покупок, и тому подобное.

Комментариев: 5
]]>
Как дела с магазином? Можно попробовать?
]]>
Очень интересная тема.
Недавно наткнулся на магазинчик с открытым кодом отечественного разработчика:
Демо http://legkoshop.440hz.ru/
Его обсуждение http://www.php.ru/forum/viewtopic.php?t=17288
Пример работы http://www.art-index.org
Интересна ваша оценка кода и перспективность использования.
]]>
По скринам — достаточно неплохой функционал и удобство.
По коду — очень не в моём стиле, поэтому сходу не въехал. Но есть несколько спорных моментов. Первый из которых: *.inc, второй — очень высокий уровень абстракции шаблонизатора (велосипедного, как я пониимаю). Делать под этот магазин шаблоны и вообще его поддерживать (программисту) — будет сложно.
Подробней гляну позже. Или и не гляну. В качестве отдельного магазина я б советовал выбирать из magento, ecshop или presto. А в качестве плагина — в зависимости от.
]]>
]]>
Каталог-магазин.
Также делается плагин для работы с вебмани. Но а) ещё не готов, б) как я понял, будет платным.