Установка shopModxBox на существующий сайт (ответ)
Хотел написать ответ комментом в топике-вопросе, но ответ получился слишком объемным, поэтому решил выделить его в отдельный топик.
В целом конечно же можно устанавливать shopModx на уже работающие сайты (что мы практикуем довольно часто, переделывая чужие сайты), но задача это действительно не простая и требует очень хорошего знания MODX-а. К тому же в чистом виде ставить shopModx не особо имеет смысл, так как это всего лишь основа для магазина и без компонентов billing и basket никакого функционала магазина не будет и близко, поэтому здесь мы рассмотрим вкратце установку именно ShopModxBox на готовый сайт (или перенос готового сайта на него).
Есть как минимум два довольно разных способа.
Способ 1
- На существующий сайт (не забывайте про бекапы и лучше делать на копии сайта) устанавливаете следующие компоненты из репозитория:
- modxSite
- modCaptcha
- modHybridAuth
- shopmodxUnitPay
- edinayaKassa
Последние два — если планируете использовать эти платежные системы. modHybridAuth — так же в случае, если планируете вход через социалки. Список компонентов конечно же может измениться, смотрите актуальный здесь: https://github.com/Fi1osof/ShopModxBox/tree/master/core/components и устанавливайте все, что найдете из репозитория modx.com или нашего rest.modxstore.ru/extras/ (некоторых модулей может не быть в репозиториях, к примеру billing и basket (пока нет)).
-
Затягиваете гитом все файлы из проекта и заливайте их на сайт.
-
Создать недостающие таблицы. Проще всего это сделать установив отдельно чистую сборку ShopModxBox и через phpMyAdmin сделать экспорт базы данных, указав «только структуру» и конструкцию «if table not exists», то есть импортировав этот дамп вы создадите только те таблицы, которых нет в базе.
-
Создать контекст spravochniki (чтобы не отходить от заданной структуры) и в нем документы-валюты, которые будут использоваться в магазине. Даже если одна только валюта, все равно ее надо создать. По умолчанию это RUR. После чего надо зайти в настройки пространства shopModx и указать валюту по умолчанию (настройка shopmodx.default_currency) (ну и шаблон для товаров по умолчанию тоже там же хорошо было бы установить (настройка shopmodx.product_default_template)).
-
Надо будет обновить все документы товаров, «превратив» их в товары. Для этого им надо сменить тип документа и выполнить обновление цены. Примерный скрипт такой:
<?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";
- В настройках modxSmarty указать актуальный Smarty-шаблон и этот шаблон таки оформить, перенеся скин сайта. Ну и там же дописываете/переписываете необходимый функционал.
Способ 2.
Второй способ подразумевает совершенно другой подход, и именно его мы и используем при переносе готовых магазинов. Здесь мы не ShopModxBox ставим поверх существующего сайта, а сайт поверх сборки. За основу для этого можно взять вот этот материал, но в целом он трансформировался вот в этот SQL-скрипт.
Имейте ввиду, что этот скрипт заточен под 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 заменяем на название базы-источника. Так же следует учесть, что у текущего пользователя баз данных права должны быть и на базу-источник и на целевую базу.
Итак, распишем весь этот процесс по шагам.
-
«Рядом» с оригинальным сайтом разворачиваем чистую сборку ShopModxBox (под «Рядом» я подразумеваю один и тот же сервер, чтобы удобней было работать сразу с двумя базами данных и файлы из одного сайта в другой перекидывать).
-
Вышеупомянутым скриптом через phpMyAdmin перекидываем из оригинальной базы данных в новую базу документы, шаблоны, TV-параметры (и их значения) (пользователей переносим дополнительно, если надо).
Надо здесь понимать, что главное на сайте — это сама информация (структура, документы сопутствующие данные и т.п.). А вот функционал (выборки всякие, сниппеты, плагины и т.п.) — это уже сопутствующее и то, что должно переписываться без особого труда. Если у вас функционала больше чем информации — значит или что-то не так, или просто не надо браться за перенос.
-
Делаем копию дефолтового шаблона shopmodx (папки assets/components/modxsite/templates/shopmodx/ и core/components/modxsite/templates/shopmodx/), указываем актуальный шаблон в настройке модуля modxSmarty.
-
Обновляем документы-товары, создавая для них товары (см. п. 5 в первом способе выше).
-
Все MODX-шаблоны переводим в Smarty-шаблоны (указываем, что они статические и выбираем файл base.php в источнике файлов controllers/) (Смотрите как шаблоны устроены в ShopModxBox).
-
Программируем все необходимое.
Да, ни один из этих способов нельзя назвать простым, просто потому реально много чего приходится переделать, и если у вас недостаточно знаний в MODX-е или в ShopModxBox-е, то за это в принципе можно и не браться. Но в целом если руку набить, то можно довольно быстро перенос выполнять. У меня вот среднее время на перенос — 8-15 часов. Совсем недавно три довольно объемных магазина перенес вместе с выгрузкой в яндекс.маркет и хитрым импортом (который пришлось для них дописывать), и все это заняло 80 часов. Кстати, следующая сборка ShopModxBox будет включать в себя обновленный импортер, о котором я уже как-то упоминал.