Fi1osof 02 декабря 2014 2 5
Хотел написать ответ комментом в топике-вопросе, но ответ получился слишком объемным, поэтому решил выделить его в отдельный топик.

В целом конечно же можно устанавливать 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 будет включать в себя обновленный импортер, о котором я уже как-то упоминал.
5 комментариев
Tramp13571
Tramp1357 20 апреля 2015г в 15:17 #
Приветствую!
На готовый сайт пытаюсь прицепить shopmodxbox первым способом.
Сделал все по пунктам. Создаю товар, ставлю валюту и цену — и при сохранении попадаю в вечное сохранение.
Вроде все уже пересмотрел, в extention_packages billing внес (для очистки совести) — ничего не помогает.
Может, есть еще какая тонкость?
Fi1osof1
Fi1osof 20 апреля 2015г в 18:30 #
и при сохранении попадаю в вечное сохранение.
Саш, ты же уже опытный программист, не должно от тебя звучать таких формулировок. Смотри логи, смотри выполнение запроса в консоли браузера. Какая именно ошибка? Скорее всего плагин versionX или типа того обламывается из-за отсутствия объекта $resource.
Tramp13571
Tramp1357 22 апреля 2015г в 15:09 #
Разобрался :)

Странно, но почему-то не выдавались ошибки в логах. А сегодня появились — ругался на primary key.

Когда я создавал талицы, я взял дамп, удалил все лишнее и оставил только создание таблиц и индексов _shopmodx_ и _billing_

Проблема была в том, что почему-то при создании не выставились флаги auto_increment для ключевых полей id этих таблиц.
Поправил — и все работает :)

Да, и спасибо за
Саш, ты же уже опытный программист, не должно от тебя звучать таких формулировок
Иногда хорошая затрещина отлично прочищает мозги :)
a
andrei.balkin 09 июля 2015г в 12:30 #
Александр у меня таже проблема с сохранением ресурса, но я не трогал таблицы, в чем может быть трабл еще — логи пустые. Может ли быть как-то связано с хостингом?
a
andrei.balkin 09 июля 2015г в 13:00 #
В консоли браузера
(
<b>Fatal error</b>:  Call to a member function get() on null in <b>/home/a/arrivaer/akartina.ru/public_html/core/cache/includes/elements/modplugin/28.include.cache.php</b> on line <b>10</b>
)
a
andrei.balkin 09 июля 2015г в 13:17 #
Выяснил что это плагин mSearchIndexer
ругается на эту строчку, помогите кто может разобрать

if ($resource->get('searchable') == 0) {
		if ($res = $modx->getObject('ModResIndex', array('rid' => $resource->get('id')))) {
			$res->remove();
		}
		return;
	}
a
andrei.balkin 09 июля 2015г в 13:32 #
Да уж, лучше оформлю поиск иначе ) узнал что этот плагин не охотно работает с shopmodx, подходы разные )
Tramp13571
Tramp1357 09 июля 2015г в 15:12 #
если поиск по сайту вообще, я использую yandex.
По товарам — автозаполнение и процессоры (например, как на stroyriv.ru)
a
andrei.balkin 09 июля 2015г в 15:14 #
да по товарам сделал, большего не надо )
Fi1osof1
Fi1osof 09 июля 2015г в 15:19 #
А в следующей сборке ShopModxBox появится морфологический поиск :) Не мегакрутой, но вполне рабочий. Прежде вы успеете его здесь оценить :)
Tramp13571
Tramp1357 09 июля 2015г в 15:21 #
Да, интересно пощупать будет :)
a
andrei.balkin 09 июля 2015г в 15:21 #
Николай когда выходит новая сборка?
Fi1osof1
Fi1osof 09 июля 2015г в 15:32 #
На следующей неделе. Кроме морфологического поиска особых улучшений не будет.
a
andrei.balkin 20 июля 2015г в 15:50 #
Подскажите как установить компоненты billing и basket
Fi1osof1
Fi1osof 20 июля 2015г в 16:12 #
Нигде. Они в составе сборки и в отдельные пакеты не были собраны.
a
andrei.balkin 20 июля 2015г в 16:14 #
А как в такой случае при переносе первым способом их можно внедрить на сайт?
Tramp13571
Tramp1357 20 июля 2015г в 16:37 #
Советую ВНИМАТЕЛЬНО перечитать топик :)
2. Затягиваете гитом все файлы из проекта и заливайте их на сайт.
a
andrei.balkin 20 июля 2015г в 16:45 #
Александр так и сделал — возможно все и вышло так но в меню верхнем нет интернет магазина
Tramp13571
Tramp1357 20 июля 2015г в 16:51 #
Если он нужен в бэкенде, то надо руками прописывать через настройки действий меню. Тут я не подскажу, не пользуюсь этими фичами.
a
andrei.balkin 20 июля 2015г в 17:02 #
Кто подскажет вывести в менюшку Групповой редактор и управление заказами, не могу разобраться, что там за цифра в поле Action: когда создаешь пункт меню, в стандартном shopmodx это цифры 86, 88, но здесь же эти цифры будут иные? Что вообще обозначают эти значения, гуглил не нашел
a
andrei.balkin 20 июля 2015г в 22:11 #
Разобрался почти, есть одна проблемка с управлением заказами, вместо нее белый экран, в консоли браузера ругается на переменную Shop
Uncaught ReferenceError: Shop is not defined
orders.grid.js:4 Uncaught ReferenceError: Shop is not defined
ext-all.js:21 Uncaught TypeError: b[(d.xtype || e)] is not a function


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