Николай Ланец
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 будет включать в себя обновленный импортер, о котором я уже как-то упоминал.
Приветствую! На готовый сайт пытаюсь прицепить shopmodxbox первым способом. Сделал все по пунктам. Создаю товар, ставлю валюту и цену — и при сохранении попадаю в вечное сохранение. Вроде все уже пересмотрел, в extention_packages billing внес (для очистки совести) — ничего не помогает. Может, есть еще какая тонкость?
и при сохранении попадаю в вечное сохранение.
Саш, ты же уже опытный программист, не должно от тебя звучать таких формулировок. Смотри логи, смотри выполнение запроса в консоли браузера. Какая именно ошибка? Скорее всего плагин versionX или типа того обламывается из-за отсутствия объекта $resource.
Разобрался :)
Странно, но почему-то не выдавались ошибки в логах. А сегодня появились — ругался на primary key.
Когда я создавал талицы, я взял дамп, удалил все лишнее и оставил только создание таблиц и индексов _shopmodx_ и _billing_
Проблема была в том, что почему-то при создании не выставились флаги auto_increment для ключевых полей id этих таблиц. Поправил — и все работает :)
Да, и спасибо за
Саш, ты же уже опытный программист, не должно от тебя звучать таких формулировок
Иногда хорошая затрещина отлично прочищает мозги :)
Александр у меня таже проблема с сохранением ресурса, но я не трогал таблицы, в чем может быть трабл еще — логи пустые. Может ли быть как-то связано с хостингом?
В консоли браузера
( <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> )
Выяснил что это плагин mSearchIndexer ругается на эту строчку, помогите кто может разобрать
if ($resource->get('searchable') == 0) { if ($res = $modx->getObject('ModResIndex', array('rid' => $resource->get('id')))) { $res->remove(); } return; }
Да уж, лучше оформлю поиск иначе ) узнал что этот плагин не охотно работает с shopmodx, подходы разные )
если поиск по сайту вообще, я использую yandex. По товарам — автозаполнение и процессоры (например, как на stroyriv.ru)
да по товарам сделал, большего не надо )
А в следующей сборке ShopModxBox появится морфологический поиск :) Не мегакрутой, но вполне рабочий. Прежде вы успеете его здесь оценить :)
Да, интересно пощупать будет :)
Николай когда выходит новая сборка?
На следующей неделе. Кроме морфологического поиска особых улучшений не будет.
Подскажите как установить компоненты billing и basket
Нигде. Они в составе сборки и в отдельные пакеты не были собраны.
А как в такой случае при переносе первым способом их можно внедрить на сайт?
Советую ВНИМАТЕЛЬНО перечитать топик :)
2. Затягиваете гитом все файлы из проекта и заливайте их на сайт.
Александр так и сделал — возможно все и вышло так но в меню верхнем нет интернет магазина
Если он нужен в бэкенде, то надо руками прописывать через настройки действий меню. Тут я не подскажу, не пользуюсь этими фичами.
Кто подскажет вывести в менюшку Групповой редактор и управление заказами, не могу разобраться, что там за цифра в поле Action: когда создаешь пункт меню, в стандартном shopmodx это цифры 86, 88, но здесь же эти цифры будут иные? Что вообще обозначают эти значения, гуглил не нашел
Разобрался почти, есть одна проблемка с управлением заказами, вместо нее белый экран, в консоли браузера ругается на переменную 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
Подскажите где мог потерять ее
Доброй ночи, дико извиняюсь за комент тут, но не могу понять куда писать, какая текущая стоимость подписки на месяц на всегда или еще как для получения магазина под modx, в вашей Fi1osof статье много битых ссылок, и написана она 2015-16 году, ее актуальность не внушает доверия, а закладки с актуальной информацией никуда не вынесено:(
Добрый день.
Вот здесь ответ.
Если где еще какие ссылки будут битые, говорите.
https://modxclub.ru/react-lessons/lesson2 ссылка битая в этой вот статье https://modxclub.ru/topics/react-js.-urok-%E2%84%962.-zaprosyi-s-pomoshhyu-graphql-2693.html

Поправил. /react-lessons/lesson2 теперь ведет на https://api.modxclub.ru/, потому что там по сути и была первая версия GraphiQL, просто не полная, хотя и работала с боевой базой.
/react-lessons/lesson1 тоже восстановил.

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

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