Установка shopModxBox на существующий сайт (ответ)

Fi1osof
2 дек. 2014 г., 16:42

Установка shopModxBox на существующий сайт (ответ)

Хотел написать ответ комментом в топике-вопросе, но ответ получился слишком объемным, поэтому решил выделить его в отдельный топик.
В целом конечно же можно устанавливать shopModx на уже работающие сайты (что мы практикуем довольно часто, переделывая чужие сайты), но задача это действительно не простая и требует очень хорошего знания MODX-а. К тому же в чистом виде ставить shopModx не особо имеет смысл, так как это всего лишь основа для магазина и без компонентов billing и basket никакого функционала магазина не будет и близко, поэтому здесь мы рассмотрим вкратце установку именно ShopModxBox на готовый сайт (или перенос готового сайта на него).
Есть как минимум два довольно разных способа.

Способ 1

1. На существующий сайт (не забывайте про бекапы и лучше делать на копии сайта) устанавливаете следующие компоненты из репозитория:
  • modxSite
  • modCaptcha
  • modHybridAuth
  • shopmodxUnitPay
  • edinayaKassa
Последние два — если планируете использовать эти платежные системы. modHybridAuth — так же в случае, если планируете вход через социалки. Список компонентов конечно же может измениться, смотрите актуальный здесь: github.com/Fi1osof/ShopModxBox/tree/master/core/components и устанавливайте все, что найдете из репозитория modx.com или нашего rest.modxstore.ru/extras/ (некоторых модулей может не быть в репозиториях, к примеру billing и basket (пока нет)).
2. Затягиваете гитом все файлы из проекта и заливайте их на сайт.
3. Создать недостающие таблицы. Проще всего это сделать установив отдельно чистую сборку ShopModxBox и через phpMyAdmin сделать экспорт базы данных, указав «только структуру» и конструкцию «if table not exists», то есть импортировав этот дамп вы создадите только те таблицы, которых нет в базе.
4. Создать контекст spravochniki (чтобы не отходить от заданной структуры) и в нем документы-валюты, которые будут использоваться в магазине. Даже если одна только валюта, все равно ее надо создать. По умолчанию это RUR. После чего надо зайти в настройки пространства shopModx и указать валюту по умолчанию (настройка shopmodx.default_currency) (ну и шаблон для товаров по умолчанию тоже там же хорошо было бы установить (настройка shopmodx.product_default_template)).
5. Надо будет обновить все документы товаров, «превратив» их в товары. Для этого им надо сменить тип документа и выполнить обновление цены. Примерный скрипт такой:
<?php ini_set('display_errors', 1); ini_set('max_execution_time', 0); ignore_user_abort(true); // Шаблоны товаров, которые используются на текущем сайте // Здесь через запятую можно указать список шаблонов $templates = array(3); // ID TV-поля, в котором указана цена (указываем свой) $tv_price_id = 1; $currency = $modx->getOption('shopmodx.default_currency'); $q = $modx->newQuery('modResource', [ "template:in" => $templates, ]); $q->leftJoin('modTemplateVarResource', 'tv_price', "tv_price.contentid = modResource.id AND tv_price.tmplvarid = {$tv_price_id}"); $q->leftJoin('ShopmodxProduct', "Product"); $q->where(array( "Product.id" => null, // Пропускаем те документы, для которых уже созданы товары )); print "\nНайдено товаров: ". $modx->getCount('modResource', $q); $q->select(array( "modResource.*", "tv_price.value as sm_price", )); foreach($modx->getIterator('modResource', $q) as $doc){ $doc->class_key = 'ShopmodxResourceProduct'; $doc->save(); $data = array_merge($doc->toArray(), array( "sm_currency" => $currency, )); $response = $modx->runProcessor('resource/update', $data); if($response->isError()){ print "Error!"; print_r($response->getResponse()); return ''; } } print "\nOK";
6. В настройках modxSmarty указать актуальный Smarty-шаблон и этот шаблон таки оформить, перенеся скин сайта. Ну и там же дописываете/переписываете необходимый функционал.

Способ 2.

Второй способ подразумевает совершенно другой подход, и именно его мы и используем при переносе готовых магазинов. Здесь мы не ShopModxBox ставим поверх существующего сайта, а сайт поверх сборки. За основу для этого можно взять вот этот материал, но в целом он трансформировался вот в этот SQL-скрипт: gist.github.com/Fi1osof/b54b347fc739b405def1 Имейте ввиду, что этот скрипт заточен под MODX Evolution. Если вы переносите с Рево на Рево, то надо заменить перечисления колонок на Все. К примеру: Было

INSERT INTO `modx_site_templates` (`id`, `templatename`, `description`, `editor_type`, `icon`, `template_type`, `content`, `locked` ) select `id`, `templatename`, `description`, `editor_type`, `icon`, `template_type`, `content`, `locked` from `old`.`modx_site_templates`;
Стало
INSERT INTO `modx_site_templates` select * from `old`.`modx_site_templates`;
Очевидно, что `old` заменяем на название базы-источника. Так же следует учесть, что у текущего пользователя баз данных права должны быть и на базу-источник и на целевую базу.
Итак, распишем весь этот процесс по шагам.
1. «Рядом» с оригинальным сайтом разворачиваем чистую сборку ShopModxBox (под «Рядом» я подразумеваю один и тот же сервер, чтобы удобней было работать сразу с двумя базами данных и файлы из одного сайта в другой перекидывать).
2. Вышеупомянутым скриптом через phpMyAdmin перекидываем из оригинальной базы данных в новую базу документы, шаблоны, TV-параметры (и их значения) (пользователей переносим дополнительно, если надо). Надо здесь понимать, что главное на сайте — это сама информация (структура, документы сопутствующие данные и т.п.). А вот функционал (выборки всякие, сниппеты, плагины и т.п.) — это уже сопутствующее и то, что должно переписываться без особого труда. Если у вас функционала больше чем информации — значит или что-то не так, или просто не надо браться за перенос.
3. Делаем копию дефолтового шаблона shopmodx (папки assets/components/modxsite/templates/shopmodx/ и core/components/modxsite/templates/shopmodx/), указываем актуальный шаблон в настройке модуля modxSmarty.
4. Обновляем документы-товары, создавая для них товары (см. п. 5 в первом способе выше).
5. Все MODX-шаблоны переводим в Smarty-шаблоны (указываем, что они статические и выбираем файл base.php в источнике файлов controllers/) (Смотрите как шаблоны устроены в ShopModxBox).
6. Программируем все необходимое.
Да, ни один из этих способов нельзя назвать простым, просто потому реально много чего приходится переделать, и если у вас недостаточно знаний в MODX-е или в ShopModxBox-е, то за это в принципе можно и не браться. Но в целом если руку набить, то можно довольно быстро перенос выполнять. У меня вот среднее время на перенос — 8-15 часов. Совсем недавно три довольно объемных магазина перенес вместе с выгрузкой в яндекс.маркет и хитрым импортом (который пришлось для них дописывать), и все это заняло 80 часов. Кстати, следующая сборка ShopModxBox будет включать в себя обновленный импортер, о котором я уже как-то упоминал.
Поправил. /react-lessons/lesson2 теперь ведет на https://api.modxclub.ru/, потому что там по сути и была первая версия GraphiQL, просто не полная, хотя и работала с боевой базой.
/react-lessons/lesson1 тоже восстановил.

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

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