Николай Ланец
25 сент. 2013 г., 0:02

Сборка интернет-магазина для MODX Revolution - ShopModxBox-2.0.0-beta

Итак, все долго-долго ждали, и таки дождались! :-) Встречайте! ShopModxBox-2.0.0-beta.
Времени потратили «чуть больше», чем планировалось, но это совсем не от безделья. Просто хотелось как можно более полную и грамотную основу заложить. Плюс была проделана огромная работа с фронтом сайта, и это не только адаптивная верстка, но и полноценное JS-API, за что Сергею огромнейшее спасибо! Все сделанное во фронте — это Сергей. Я серверную часть программировал.
В общем, вот демо-ролик (демонстрация + два способа установки). А под катом детали.
Сразу ссылки на ролик с привязкой по времени:
Итак, вот неполный список изменений:
  • Полностью переработан весь движок. Обратная совместимость с 1.1.0 не подразумевается.
  • Добавлен компонент Billing. На этом модуле завязано все, что связано с заказами, оплатой и т.п.
  • Корзина перестала существовать отдельно. Теперь Корзина — это еще не оформленный Заказ (Order). Теперь даже не оформленные заказы хранятся в базе данных, что как минимум позволяет видеть кого что интересует, а так же определять реальный процент конверсии и выявлять возможные ошибки.
  • Компонент Basket (Корзина) остался, но почти все, что связано с самими заказами, перенесено в Billing. Basket и дальше останется отдельным модулем, а в Billing-е будет только необходимый минимум логики. Рассчет на то, что сам механизм заказа, оплаты и т.п. можно будет реализовывать в любых сторонних модулях, которые будут взаимодействовать с биллингом.
  • Добавлен и сверстан новый шаблон по умолчанию с использованием bootstrap. Много всяких аджаксовых плюшек и полноценное JS-API.
  • Добавлен табличный редактор документов.
  • Добавлено управление заказами.
  • Добавлен личный кабинет пользователя, регистрация, смена пароля, восстановление пароля и т.п.
  • Настроена регистрация через Login, смена/восстановление пароля и т.п.
  • Добавлен модуль modHybridAuth (авторизация через социальные сети). Пока четко проверены Twitter, Facebook и Google, но должны и другие работать.
  • Подключен сервис оплаты Robokassa.
  • Настроены политики безопасности:
  • Контент-менеджер;
  • Администратор магазина;
  • Менеджер магазина;
  • Продвинутый менеджер магазина.
Всякие вкусности, а так же планы на будущее.
Движок на самом деле разрабатывался добротно, просто еще не все появилось. Но есть главное — основа. И эту основу мы будем постепенно развивать, а всякий, кому чего-то не хватит, без особых проблем сможет добавить свое. Вот простой алгоритм, как этот магазин переделать под себя:
1. Разворачиваем эту сборку.
2. Делаем копии шаблонов (assets/components/modxsite/templates/default/ (публичная часть шаблона) и core/components/modxsite/templates/default/ (Смарти-шаблоны)). Называем шаблон каким-то своим именем.
3. Меняем название шаблона в настройке. ?
На самом деле можно было просто переименовать эти папки и настройку поменять :-) Но я так, описал полностью возможный механизм.
Все, у вас свое собственное оформление сайта. То есть пока еще только такой же шаблон, но вы его можете смело редактировать как хочется. Так вот, далее просто надо учесть, что у нас Смарти, а не просто сухие чанки, то есть в самих шаблонах можно менять логику отображения и работы сайта. А так же можно создавать свои процессоры и расширять имеющиеся. За счет этого вообще кардинально можно все изменить.
Но есть еще один огроменный фронт: новые модули для магазина. Мы закладываем основу так, чтобы можно было довольно легко добавить что-нибудь свое. Покажу один пример, правда он чисто для программистов.
Вот у нас есть оплата через робокассу, и стоит задача прикрутить еще какой-нибудь способ оплаты. Посмотрим, как это делается.
Вот это базовый процессор для любых типов оплаты: gist.github.com/Fi1osof/0d0df9bb085195205d25 Он абстрактный, и его нельзя вызвать напрямую, так как у каждой конкретной платежной системы свои механизмы проверки платежа. Но этот класс уже обеспечивает всю необходимую логику, и от расширяющего процессора ждет только одного: подтверждения правильности платежа и установки суммы и прочих данных платежа. И вот расширяющий процессор конкретно для робокассы:
<?php /* Проводка платежа от робокассы */ require_once dirname(dirname(__FILE__)). '/create.class.php'; class modWebPaymentsRobokassaCreateProcessor extends modWebPaymentsCreateProcessor{ public function initialize(){ $this->setProperties(array( "paysystem_id" => $this->modx->getOption('robokassa.bill_serv_id'), )); return parent::initialize(); } /* Проверяем подпись с робокассы */ protected function checkSignature(){ $mrh_pass2 = $this->modx->getOption('robokassa.mrh_pass2'); // Параметры, передаваемые в запросе от робокассы $crc = mb_strtoupper($this->getProperty('SignatureValue')); $out_sum = $this->getProperty('OutSum'); $inv_id = $this->getProperty('InvId'); $shp_aid = $this->getProperty('shp_aid'); $shp_order = $this->getProperty('shp_order', null); $shp_trff = $this->getProperty('shp_trff'); $shp_uid = $this->getProperty('shp_uid'); $my_crc = mb_strtoupper(md5("{$out_sum}:{$inv_id}:{$mrh_pass2}:shp_aid={$shp_aid}:shp_order={$shp_order}:shp_trff={$shp_trff}:shp_uid={$shp_uid}")); $this->modx->log(xPDO::LOG_LEVEL_INFO, "[Robokassa - robokassa.payResult]", print_r($_REQUEST, true)); // проверка корректности подписи if ($my_crc !=$crc){ $error = "[Robokassa - robokassa.payResult] - Неверная подпись. Получена: '{$crc}'. Должна быть: '{$my_crc}'"; $this->modx->log(xPDO::LOG_LEVEL_ERROR, $error); return "bad sign"; } // else $this->setProperties(array( "sum" => $out_sum, "order_id" => $shp_order, "owner" => $shp_uid, "paysys_invoice_id" => $inv_id, )); return true; } protected function getSuccessMessage(){ return 'OK'.$this->getProperty('InvId'); } }
Как видно, это всего 60 строчек кода. Но в результате не только будет проведена оплата с учетом кто платил, через что, сколько и т.п., но и будет автоматически изменен статус заказа на Оплачен. И вот прикрутить еще какой-нибудь способ оплаты — это всего несколько десятков строк.
Вот пока на этом я прервусь. Скачивайте сборку, устанавливайте, изучайте, задавайте вопросы.
Коля, привет! Ставлю через ssh, такая проблема:
<h5>[2013-09-25 16:31:27] (INFO)</h5><pre>Installing files from /home/i/isaev8/test.nspmsk.ru/public_html/core/packages/shopmodxbox-2.0.0-beta/xPDOFileVehicle/bdea4fbba92c9879820f025ac815f76d/ to /home/i/isaev8/test.nspmsk.ru/public_html/core/components/vapor/model/vapor</pre> <h5>[2013-09-25 16:31:27] (INFO)</h5><pre>Attempting to preserve files at /home/i/isaev8/test.nspmsk.ru/public_html/core/components/vapor/model/vapor into archive /home/i/isaev8/test.nspmsk.ru/public_html/core/packages/shopmodxbox-2.0.0-beta/xPDOFileVehicle/bdea4fbba92c9879820f025ac815f76d.preserved.zip</pre> <h5>[2013-09-25 16:31:27] (ERROR)</h5><pre>Error 42S02 executing statement: Array ( [0] => 42S02 [1] => 1146 [2] => Table 'isaev8_test.modx_modhybridauth_providers' doesn't exist ) </pre> <h5>[2013-09-25 16:31:27] (WARN)</h5><pre>Could not load package metadata for package modxsite.</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:30] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:31] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:32] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:32] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:32] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:32] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:33] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:33] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:34] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:35] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:35] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:35] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:35] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:35] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:36] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:36] (DEBUG)</h5><pre>Language string not found: "logout"</pre> <h5>[2013-09-25 16:31:36] (DEBUG)</h5><pre>Language string not found: "cmpgenerator"</pre> <h5>[2013-09-25 16:31:36] (DEBUG)</h5><pre>Language string not found: "cmpgenerator.desc"</pre> Terminated
Привет. Весь список сообщение — это не проблема. Я об этом говорил в ролике, это просто отладка (уровень Debug, Info и Warn — это не критично). А вот Terminated — это проблема. Где-то на хостинге устанавливаешь? Установка идет секунд 40-50, и хостинг действительно может отбить запрос. Я на digitalocean.com за $5 в месяц сижу, и все ОК. Так же попробуй установить на modxcloud.com через менеджер пакетов.
Да, ставил на BEGET.RU Cейчас попробую на modxcloud.com
Кстати, вот еще моя статья на хабре: habrahabr.ru/post/195090/ Почитайте, там есть дополнительная информация. И поддерживайте комментариями/плюсиками :-)
На таймвебе другое ограничение есть — 5 секунд 100%-ая загрузка ядра — и тоже процесс обламывается.
Поставил на modxcloud. А как backup забрать оттуда?
Еще поставил локально, но почему-то выдает мне 404 на любые страницы, кроме главной
Информация о системе/база данных выдает ? (биллинговые таблицы по 279Мб)
Разобрался — нужно было ht.access переименовать в .htaccess :)
Для тех, кто решил установить до просмотра видео, пользователь/пароль по умолчанию admin/admin. Я три раза переустановил MODX, прежде чем начал искать на видео упоминание про пароль.
Спасибо! Очень кстати! :)
Зайди по SSH и сделай архив сайта и разверни у себя.
Я думаю, это косяк самого MODX-а (ты же смотришь в админке это?). зайди в phpMyAdmin, и убедись, что там нет таких цифр. Думаю, это связано с тем, что движок таблиц биллинговых — InnoDB, а MODX традиционно рассчитывает только на MyIsam (Джейсон не любит innoDB и считает его переоцененным).
Блин, забыл сказать))))
На будущее, маленькая хитрость: если вдруг есть доступ к файлам сайта, но нет доступа в админку. В индексном файле админке пишите сразу после $modx->initialize():
$modx->setOption(xPDO::OPT_SETUP); $user = $modx->newObject('modUser', array( 'username' => $username, 'password' => $password, 'sudo' => 1, )); $profile = $modx->newObject('modUserProfile', array( 'email' => $email, )); $user->addOne($profile); $user->save();
И выполняете обновление страницы. Вам будет создан ваш судо-пользователь.
Снял backup, переставил на свой хостинг — магазин запускается, но при попытке отправить что-нить в корзину выдает JS окно «Ошибка выполнения запроса»
Ссылку на магаз в студию.
Следующий раз обязательно заглядывай в логи MODX-а.
[2013-09-25 18:55:59] (ERROR @ /assets/components/basket/connectors/connector.php) [Basket] - Add - Ошибка выполнения запроса [2013-09-25 18:55:59] (ERROR @ /assets/components/basket/connectors/connector.php) Array ( [quantity] => 1 [action] => add_product [product_id] => 26 [order_id] => )
Сразу видно, что в целом работа есть, процессор добавления товара отработал, но возникла ожидаемая ошибка и он вренул сообщение об ошибке. То есть проблема с большой долей вероятности не в конфигах или типа того.
А далее куча ошибок типа:
[2013-09-25 18:55:59] (ERROR @ /assets/components/basket/connectors/connector.php) Path specified for package billing is not a valid or accessible directory: /.../public_html/core/components/billing/model/ [2013-09-25 18:55:59] (ERROR @ /assets/components/basket/connectors/connector.php) Processor /.../public_html/core/components/billing/processors/web/orders/products/add.php does not exist; Array ( [processors_path] => /.../public_html/core/components/billing/processors/ )
У тебя по какой-то причине отсутствует папка core/components/billing/ У тебя на modxcloud.com все работало? Просто или там не полностью развернулся снимок, или архив сайта не корректно создан/развернут.
не, я с локального тянул — на modxcloud ssh только у платных аккаунтов я посмотрел, есть папка core/components/Billing Не может в этом проблема быть?
не, я с локального тянул — на modxcloud ssh только у платных аккаунтов
Как же? Они же на бесплатных возвращали ssh. Или реально нету?
я посмотрел, есть папка core/components/Billing
Да, в этом :-))) Billing с большой — это сгенерированный CMPgenerator-ом. Он не нужен. А нужен с маленькой. Но на иксах с этим не возникает проблем (там система чувствительна к регистру букв), а вот винда все объединила в одну папку… Отмечу себе, что надо удалить все технические папки.
Зайди в админку сайта на modxcloud.com и packMan-ом сделай патч с папкой core/package/billing и накати на свой новый сайт. С пакманом работал? Там не сложно.
Да, все заработало. И вылез баг с корзиной: ?
Все добрый вечер. При попытке авторизоваться через соцсети выдает ошибки:
[2013-09-25 12:37:31] (ERROR @ /assets/components/modhybridauth/connectors/profile/auth.php) [modHybridAuth] <b>got an error!</b> The provider 'Google' is not enabled. [2013-09-25 12:40:26] (ERROR @ /assets/components/modhybridauth/connectors/profile/auth.php) [modHybridAuth] <b>got an error!</b> The provider 'Twitter' is not enabled. [2013-09-25 12:40:31] (ERROR @ /assets/components/modhybridauth/connectors/profile/auth.php) [modHybridAuth] <b>got an error!</b> The provider 'Facebook' is not enabled.
? Сайт на бесплатном modxcloud, при установке вроде не было ошибок, только сессия слетела. Подскажите, провайдеров сложно вручную добавить, или лучше переустановить?
Смотрите внимательно видео. Оно 20 минут, но сэкономит вам же много времени. Там я про социалки тоже говорил: www.youtube.com/watch?feature=player_embedded&v=g_cSfGgSO9g#t=887
Как и робокассу, социалки надо настраивать индивидуально, подключая сайт к конкретным сетям.
Кстати, если в логи MODX-а гляните, там будет написано, что такой-то провайдер социальной сети выключен.
Да, с корзиной действительно есть баги (мы там не все отладили, а запросы местами есть сложные). За это пока не переживайте (пока сайты не боевые, а в работе). На выходных сделаю патч и выложу его, это все поправимо.
Николай, прошу прощения. Спасибо большое. Посмотрел видео урывками, сильно хотелось попробовать. Поторопился, пойду посмотрю.
? я понял, что не дают на бесплатных.
ага, все-таки ssh нету, только sftp… Печаль.
Опять поторопился
Хотел написать как я сделал. Написал — опять попробовал и выдало ошибку. Поэтому удалил комментарий.
Заработало после того как кэш почистил. Может кому пригодится. На примере Google.
1) Идем сюда code.google.com/apis/console/ 2) Слева в меню нажимаем на "API Access" ? далее жмем на синюю кнопку "Create an OAuth 2.0 client ID..." ? 3) Вводим в поле "Product name", например название вашего сайта (mysite.com), жмем «Next». 4) В "Your site or hostname" меняем на http, адрес пишем (домен подставляем свой) такой:
mysite.com/assets/components/modhybridauth/connectors/profile/auth.php?hauth.done=Google
и щелкаем мышкой за пределы поля — должен сформироваться Redirect URI. После нажимаем «Create client ID». ? 5) Дальше идем в phpMyAdmin и подставляем эти данные: ? в таблицу modx_modhybridauth_providers (как в видео) 6) Все работает
Жирный плюс за мануал! Да, я так же делал. Но все это так много времени отняло, что даже некогда было написать мануал :-) Но гугл — это самое сложное. Твиттер вообще без проблемно подключается. Здесь: dev.twitter.com/ И фейсбук тоже. В мордокниге только не забудьте снять галочку «Песочница». developers.facebook.com/apps/
?
На фейсбуке коллбэк-адрес не требуется вроде, он получает его от сервера в запросе.
И да, ключи указываете, провайдеры активируете и все должно работать.
Только ключики в гугле перегенерируй, не секурно получается.
Я на картинке для mysite.com сгенерировал) Спасибо
Для Яндекса еще проще 1) Идем сюда: oauth.yandex.ru/client/new ? Название: mysite.com Яндекс.Логин: выбираем все Callback URI:
http://mysite.com/assets/components/modhybridauth/connectors/profile/auth.php?hauth.done=Yandex
Жмем "Создать" Получили: ? 2) Идем в phpMyAdmin и в таблице modx_modhybridauth_providers копируем запись Google. Ставим в поле id значение 4, в поле name Google заменяем на Yandex, в поле keys в id подставляем Id приложения, в secret — Пароль приложения. 3) Открываем Modx SDK и в ShopModxBox-1.1.0-beta -> Media Sources -> modHybridAuth core -> model -> modhybridauth -> Hybrid -> щелкаем правой кнопкой мышки на папке Providers -> «Быстро создать файл» Имя: Yandex.php Содержимое:
<?php /*! * HybridAuth * http://hybridauth.sourceforge.net | http://github.com/hybridauth/hybridauth * © 2009-2012, HybridAuth authors | http://hybridauth.sourceforge.net/licenses.html * * Provider writed by xbreaker | https://github.com/xbreaker/hybridauth */ /** * Hybrid_Providers_Yandex provider adapter based on OAuth2 protocol * */ class Hybrid_Providers_Yandex extends Hybrid_Provider_Model_OAuth2 { /** * IDp wrappers initializer */ function initialize() { parent::initialize(); // Provider apis end-points $this->api->api_base_url = "https://login.yandex.ru/info"; $this->api->authorize_url = "https://oauth.yandex.ru/authorize"; $this->api->token_url = "https://oauth.yandex.ru/token"; $this->api->sign_token_name = "oauth_token"; } /** * load the user profile from the IDp api client */ function getUserProfile() { $response = $this->api->api( "?format=json" ); if ( ! isset( $response->id ) ){ throw new Exception( "User profile request failed! {$this->providerId} returned an invalide response.", 6 ); } $this->user->profile->identifier = (property_exists($response,'id'))?$response->id:""; $this->user->profile->firstName = (property_exists($response,'real_name'))?$response->real_name:""; $this->user->profile->lastName = (property_exists($response,'family_name'))?$response->family_name:""; $this->user->profile->displayName = (property_exists($response,'display_name'))?$response->display_name:""; $this->user->profile->photoURL = 'http://upics.yandex.net/'. $this->user->profile->identifier .'/normal'; $this->user->profile->profileURL = ""; $this->user->profile->gender = (property_exists($response,'sex'))?$response->sex:""; $this->user->profile->email = (property_exists($response,'default_email'))?$response->default_email:""; $this->user->profile->emailVerified = (property_exists($response,'default_email'))?$response->default_email:""; if( property_exists($response,'birthday') ){ list($birthday_year, $birthday_month, $birthday_day) = explode( '-', $response->birthday ); $this->user->profile->birthDay = (int) $birthday_day; $this->user->profile->birthMonth = (int) $birthday_month; $this->user->profile->birthYear = (int) $birthday_year; } return $this->user->profile; } }
4) Идем во вкладку «Элементы» и выбираем чанк dbt.lgnLoginTpl? Добавляем ссылку
<a href="[[++assets_url]]components/modhybridauth/connectors/profile/auth.php?provider=Yandex&redirect_id=104" alt="Yandex" title="Войти через Яндекс" class="social Yandex"></a>
5) На всякий случай я почистил кэш
У меня без бубнов заработало
я использую awesomescreenshot. Там сразу и редактирование картинки перед постингом.
За мануал с Яшей тоже спасибо!
Яшу добавлю в новую сборку и на выходных постараюсь сделать патч, чтобы можно было быстренько Яшку добавить в модель, чтобы руками не приходилось этого делать.
О, спасибо! Не пробовал еще.
Не за что. Но если лимит пространства будет исчерпан, он попросит оплатить. Что-то там в районе 5 или 10 баксов. Я заплатил. Сам довольно много скринов делаю, так что я не жалею.
Ребят, а есть в вашем магазине импорт/экспорт из 1с УТ? через CommerceML
Здравствуйте!
Сразу озвучу общую политику по модулям: бОльшая часть из того, что будет разрабатываться для тех или иных проектов, будет включаться в сборку. К примеру, выгрузка в Яндекс.Маркет уже сейчас включена в сборку: shopmodx.modxclub.ru/yandexmarket.xml
Модули, которых еще нет, будут появляться примерно по такому принципу: Вариант 1. Опрос + голосование + обсуждение общего бюджета + донейты = модуль. Но это требует времени. Вариант 2. Заказ модуля + полный бюджет = модуль в кратчайшие сроки. Это быстрый вариант. Вариант 3. Кто-то где-то для кого-то сделал модуль и поделился им для сообщества.
Вообще конечно же в планах маркетплейс, просто не все сразу.
А импорт/экспорт — это вполне решаемая задача. Вот, к примеру, вот такой модуль импорта большого каталога мы делали: modxclub.ru/blog/vehicles/145.html
В свое время чинил импорт на битриксе, там стандартный обмен данными на XML-е, так что никаких особых проблем нет.
У меня без бубнов заработало
А я полтора часа протанцевал. До сих пор не знаю в чем реально проблема была. Есть вариант, что пробел затисался. Но я его убирал, и потом все равно никак не мог авторизоваться. Потом удалил приложение, опять создал, еще 10-15 минут секса и вроде заработало. Включаю его в сборку 2.0.1 Патч тоже выложу.
А вот пропатчился на shopmodx.modxclub.ru, зарегил приложение, прописал ключи в БД, обновил кеш и сайт без проблем зашуршал через Яшу. Патч чуть выложу.
5) На всякий случай я почистил кэш
Кстати, кеш чистить надо обязательно, так как modHybridAuth кеширует настройки, и пока их вручную не сбросишь (через меню Сайт->Обновить сайт), изменения не вступят в силу.
Доброй ночи, не могу установить на хостинг данную сборку. Уже что только не перепробовал но видимо руки кривые :( У хостинг провайдера попросил увеличить время но всреавно реезультат нет 405 и все сайт на половину загрузиился либо тупо крокозябли. Помогите установить сборку :(
Если таким способом делаю ) жалуется на timezona. Возник такой вопрос я как понимаю я не смогу к примеру установить на локалке а потом просто перенести на сервак эту сборку? А и вот VPS у fornex брал. Подскажите пожалуйста что еще можно предпринять ибо очень понравилась ваша сборка :)
Если таким способом делаю ) жалуется на timezona. Возник такой вопрос я как понимаю я не смогу к примеру установить на локалке а потом просто перенести на сервак эту сборку?
Жалуется на timezona — это вопрос к php. У php настройки отдельно для апача (или что там) и отдельно для консоли (CLI). Зайдите в CLI-настройки (php5/cli/php.ini) и пропишите зону. У меня так:
date.timezone = Europe/Moscow
И все заработает. То есть это вообще не вопрос к MODX-у. А так все это на локал так же ставиться.
Все настроил кроме твиттера, есть у кого-то мануал? И simplesearch есть, а на сайте поиска не вижу.
Ctrl+F по странице наводит на ссылку dev.twitter.com В целом с твиттером не было никаких проблем, он нормально подключается.
Думаю, можете использовать любой поисковый модуль для MODX-а. А позже появится наш, конкретно для ShopModxBox (войдет в новую версии). На одном проекте уже пишется. ?
Может я что-то делаю не так?! Вот пошагово: 1. Авторизируемся на Twitter.com 2. Идем по адресу dev.twitter.com/apps 3. Жмем 'Create a new application' dev.twitter.com/apps/new Заполняем форму Name: вводим название, к кримеру: mysite.ru Description: к примеру: вход на сайт mysite.ru Website: вводите адрес вашего сайта Сохраняемся Получили consumer key и consumer secret копируем их в базу, чистим кэш заходим на сайт. Но у меня все равно выдает ошибку?!
Шлите в личку доступы к админке и ключи твиттера.
Никаких проблем на стороне сайта не вижу. Twitter упорно возвращает ошибку 'Authentification failed! Twitter returned an error. 401 Unauthorized.' (пишется в логи MODX-а).
Видимо, что-то у вас в твиттере не так настроено. У меня вот так:
?
Что интересно, у меня не стоит галочка «Allow this application to be used to Sign in with Twitter». Попробуйте удалить приложение и опять создать.
Вот официальный гайд: hybridauth.sourceforge.net/userguide.html#index И конкретно по твиттеру: hybridauth.sourceforge.net/userguide/IDProvider_info_Twitter.html
Удалил создал по новой твиттер работает, остальные три перестали. Это я еще до робокассы не добрался…
Это у вас задача — просто настройки прописать. А представьте это все с нуля писать :-)))
Получил сообщение в личку: Теперь Facebook и Яндекс подхватывают данные твиттера а Гугл вообще перестал работать…
Отвечаю: скорее всего просто куки и кеш в браузере. Я сейчас без проблем авторизовался у вас на сайте через все четыре социалки (смотрите записи в БД). Ошибок в логах никаких нет.
приветик решил попробовать вашу сборку установил как сказано в уроке кодировка слетела одни ??????? подскажите что делать? SSMaker.ru/6cda4e0e/
1. В базе данных таблица сопоставление UTF_general_ci?
2. Судя по нераспарсенным MODX-тегам, у вас там критическая ошибка php. Из-за этого не отправляются заголовки с указанием кодировки, и браузер может не понять, какую кодировку использовать.
добрый день :) а скачать сборку где можно? не увидел ссылки :(
Добрый. Смотрите видео. Добавьте репозиторий rest.modxstore.ru/extras/ и качайте оттуда.
о… спасибо :)
Николай, Добрый день.
Как жаль, что я не стал изначально пробовать свои силы в создании магазина на ShopModx. Все вроде просто и понятно… У меня уже много сделано на Shopkeeper и в связи этим вопрос: Возможно ли каким-нибудь способом применить к Shopkeeper корзину, какая в ShopModx. Интересует функция сохранения неоформленных заказов пользователей. А также интересует, каким образом реализуется возможность сохранения товара в корзине пользователя при его выходе из учетной записи и повторном входе спустя некоторое время (несколько часов, сутки, неделя и пр.)
Добрый день.
Возможно ли каким-нибудь способом применить к Shopkeeper корзину, какая в ShopModx.
Учитывая сколько на это пришлось бы потратить времен и сил, можно сказать, что нет. В сборке ShopModxBox корзина, это не только компонент basket (не оформленный в отдельный публичный пакет), но еще и главное — компонент billing (так же не оформленный), который как раз и обеспечивает работы с заказами, оплатами и т.п. В Shopлeeper-е и в минишопе механизм с заказами абсолютно другой. И в целом принципы работы тех модулей другие, так что нашу корзину туда прикрутить нельзя. Но можно перенести сайт с шопкипера на наш ShopModxBox (это мы уже делали не раз). Правда сами вы не знаю справитесь ли нет. А нашими силами переносить это обычно стоит 20-30 тысяч рублей, и ценник может быть и выше с учетом уже заложенного в исходный сайт функционала.
А также интересует, каким образом реализуется возможность сохранения товара в корзине пользователя при его выходе из учетной записи и повторном входе спустя некоторое время (несколько часов, сутки, неделя и пр.)
Все заказы хранятся в базе данных. Если пользователь при добавлении товара в корзину не был авторизован и идентификатор корзины хранится в сессии, то как только сессия пользователя слетит, корзина для него будет потерянная. Ежели пользователь был авторизован, то в заказ сохраняется id пользователя, так что когда бы он вновь не авторизовался, активная корзина всегда будет для него идентифицирована.
Спасибо за развернутый ответ. Прискорбно, что не получится применить вашу корзину в Shopkeeper. Грустно :( И дело даже в не в том, что мне хочется быстро и безболезненно решить вопрос с корзиной в своем проекте. Жалко времени. Времени, как обычно, катастрофически не хватает. Не хватает также знаний. Есть только настойчивость и желание довести до конца то, что начал. В связи с этим вопрос: Можно ли посмотреть написанный принцип сохранения id сессии пользователя, то что указано вами выше в комментах? Понимаю, что у вас тоже времени не всех нет. Однако… рискну просить об этом
Можно ли посмотреть написанный принцип сохранения id сессии пользователя, то что указано вами выше в комментах?
Проект выложен на гитхаб, и там вы можете смотреть что угодно, в том числе и механизм с сессиями. К примеру, вот здесь идет получение id заказа из сессии. Но это все равно вам скорее всего никак не поможет, потому что весь этот механизм конкретно для ShopModxBox-а.
Приветствую, Николай. Решил попробовать сделать интернет-магазин на ShopModx так как на первый взгляд для меня, новичка в этом деле, на видео все довольно доступно и понятно рассказано. Слышал про большие возможности самого modx в плане доработки чего-либо, в связи с чем у меня есть такой вопрос: А каким образом можно реализовать пересчет товаров по весу? Насколько я понимаю, делается все это в модуле, привязанном к корзине, грубо говоря, нужно задавать дополнительное поле/свойство, которое будет содержать информацию о весе в заданных единицах, в итоге сумма которых будет строго ограничиваться и не допускаться к оплате. Заранее благодарен.
Добрый день!
Вопрос интересный :) Да, сделать можно действительно многое, в том числе и пересчет по весу. И как раз у нас сейчас на одном магазине примерно такая же задача встала, только смысл там немного другой. Мы прикручиваем агрегатор служб доставки multiship.ru/ и там обязательные параметры посылки — вес, ширина, высота и длина. То есть нам пришлось вводить эти параметры для товаров, а потом подсчитывать их сумму для всего заказа, чтобы передавать в запрос создания заказа на доставку. Вот код измененного процессора. Там вы найдете подсчет суммарных габаритов заказа. В оригинале это вот этот процессор. Он получает полную информацию по указанному заказу. Вот здесь я писал, как переопределить add-процессор (см. заголовок «Переопределяем процессоры»). Вот этот процессор вы можете переопределить и переписать метод process(). В частности, дописать свою проверку, начиная с этой строчки. Почему именно там? Потому что при добавлении товара может выполняться два разных процессора (на добавление товара (если его еще не было) или на обновление количества этих товаров в заказе (если товар уже содержится)). Получите текущие данные заказа, вес добавляемого товара (помноженный на количество добавляемого товара) и проверьте общий вес. Если будет ошибка, вернете ее методом return $this->failure($msg);
Спасибо. Буду пробовать.
Я не очень хорошо знаком с modex, поэтому мои действия могут показаться и смешными, вот подробное описание того что я сделал:
Создал новое дополнительное поле weight (параметры ввода->тип ввода: Число, точность 3(до граммов, будет как в СИ
в килограммах), макс 200 (к примеру 200, пусть будет равно максимально
допустимому весу)) Доступно для шаблонов: Товар На сайте вес не отображается, видимо, это нужно добавить в каком-то из
шаблонов, только не понял в каком.
габариты как в примере процессора я не создавал в доп полях, они мне к
счастью, пока не требуются, с весом бы разобраться)
В измененном процессоре видел место где идет подсчет общего веса по всему
заказу, помещенный в weight
строчки, относящиеся к габаритам не трогал, вообще не удалял ничего из
процессора.
Добавляю товар в корзину, у которого вес превышает допустимый в условии, но получаю ответ «Ошибка выполнения запроса»
Реакция должна бы быть при добавлении очередного товара, как я понимаю, который перевалит суммарный вес за допустимый в условии. А как это реализовать невозможностью перехода к оформлению заказу?
В нужное место кода вставил проверку условия, но получаю выше упомянутую ошибку…
$wgt = modBasketMgrOrdersProductsGetdataProcessor::weight; if( $wgt > 200) { return $this->failure($error); }
Проблема где-то в моем условии, когда его комментирую все работает исправно. И само сообщение со стопом лучше конечно по нажатию на оформление заказа, так это предоставит возможность у клиента выбрать что ему важнее, а что он может удалить… Элементы оформления заказа тоже желательно корректировать, туда тоже впишу условие, а здесь обойдусь лишь сообщением о превышении.
На сайте вес не отображается, видимо, это нужно добавить в каком-то из шаблонов, только не понял в каком.
Конечно, просто так ничего не появится. Эти данные сразу же попадают в массив данных товара, но в шаблоне их надо добавлять. Смотрите видео про разработку с использованием modxSmarty. Особенно полезно видео здесь, здесь и здесь.
Добавляю товар в корзину, у которого вес превышает допустимый в условии, но получаю ответ «Ошибка выполнения запроса»
Ставьте firebug или используйте встроенный трекер, если есть, и смотрите что в ответе идет. Так же включите плагин Debug. Смотрите что в ответе. Скорее всего у вас синтаксическая ошибка или типа того.
А как это реализовать невозможностью перехода к оформлению заказу?
Вот эти задачи довольно сложные, и если у вас недостаточно опыта в программировании, мы просто так не поможем. Это из области платных доработок, так как мы здесь можем в общих чертах подсказать направление, но мы не можем неделями заниматься обучением программированию.
$wgt = modBasketMgrOrdersProductsGetdataProcessor::weight;
Здесь синтаксис неверный. Будет ошибка php.
Здравствуйте! А есть ли как то мануал более подробный для установки через консоль? Скачал Putty пробую от корня сайта дать команду: php vapor/import.php package=core/packages/shopmodxbox-2.0.0-beta.transport.zip — мне пишет Зарещено, команда должны быть из командой строки. Что это значит? скриншот: clip2net.com/s/6urQ8s
Не подскажу что это именно за ошибка, но у вас php-5.2.13. Попробуйте обновить до 5.3 хотя бы.
Добрый день! У меня проблема… В самих товарах не отображается «содержимое ресурса». Хотя контент на главной странице меняется… В чём может быть проблема ?? ?
Всё гуд, большое спасибо!!!
Хочу добавить в шаблон отображения товара вес, который определен как tv, добавляю теги в layout.tpl: <tr>                                <td>Вес:[.[.*weight].].</td>                                <td> кг.</td>                            </tr> Но вижу установленное мною значение по умолчанию вместо того, что в карте товара. Предполагаю что в modxSmarty как-то хитрее используется tv параметр, но не очень понимаю как. И если это в массиве данных товара, то в каком файле идет его описание?
Если вы используете стандартный MODX-синтаксис, то и обрабатывается он стандартно. То есть если у вас TV-параметр weight, то пишете [[*weight]] и получаете результат на текущей странице исходя из его значения. Здесь нет никакой отдельной логики. Если же вы получаете данные товаров через getdata-процессор, то там данные TV-параметров в массиве $object.tvs. Только следует учитывать, что в getdata-процессорах в настоящий момент не учитываются значения TVшек по умолчанию (это будет доработано в ближайшем релизе shopModx).
Да, было бы здорово их учитывать, от них много пользы для нестандартных задач)
То есть если у вас TV-параметр weight, то пишете [[*weight]] и получаете результат на текущей странице исходя из его значения.
С логикой и связан мой вопрос, так как у самого TV weight указано значение по умолчанию, например 1, тип число, вывод стоит по умолчанию. И при добавлении в вышеупомянутом виде я вижу значение по умолчанию, хотя в карте товара в доп полях прописано иное. В общем, выводится дефолтное значение параметра, а не конкретного товара. Я менял тип данных с числа на текст и т.д. но та же картина. Возможно ли вставлять в Smarty шаблоны текущие значения тв еще каким-то образом, если не хочет работать [[*? Может быть это что-то с modx, или php? У меня Apache/2.2.22 (Win32) mod_ssl/2.2.22 OpenSSL/1.0.1c PHP/5.3.13 Server at localhost Port 80 и MODX Revolution 2.2.10-pl (traditional)
Да, отображается так как надо при просмотре одного товара, при просмотре категории подставляется значения по умолчанию данного tv у каждого товара)
создал еще одни tpl шаблон для отображения товара без этого tv, и fetch.tpl теперь формирует категорию без отображения веса товаров, но с весом было бы интереснее) Пока не разобрался…
Я менял тип данных с числа на текст и т.д. но та же картина.
Тип ввода влияет только на элемент ввода в админке, то есть на странице редактирования товара. На вывод это никак не влияет. Вряд ли у вас проблема в сервере, больше правды в следующем комментарии, там и отвечу остальное.
Да, отображается так как надо при просмотре одного товара, при просмотре категории подставляется значения по умолчанию данного tv у каждого товара)
Пришлите в личку доступ в админку сайта и ссылку на проблемную страницу, посмотрю что у вас там в шаблонах. Судя по всему просто логическая ошибка.
[[*weight]] — обрабатывается только для текущего документа. Вот такое в цикле вывода товаров не будет работать:
<tr> <td>Вес: </td> <td>[[*weight]] кг.</td> </tr>
То есть каждый раз это будет tv для текущего документа, а не для каждого выводимого в списке товара. Не зря же мы пишем {$object.category_uri} и т.п.
В вашем случае правильней использовать {$object.tvs.weight.value}. Почему? Смотрите видео и читайте топики. Повторюсь: если не хватает навыков в программировании, то лучше за эту сборку и не браться. Порог вхождения в ней довольно высокий.
При попытке добавить репозиторий rest.modxstore.ru/extras/ получаю: MODX получил пустой ответ от поставщика. Пожалуйста, проверьте URL-адрес поставщика и убедитесь, что поставщик является корректным поставщиком.
такое же было. добавляй http://rest.modxstore.ru/extras/ почему-то не добавляются поставщики если урл без http://
Как-то без протокола вставилось. Даже если с протоколом, всё-равно:
MODX получил пустой ответ от поставщика. Пожалуйста, проверьте URL-адрес поставщика и убедитесь, что поставщик является корректным поставщиком.
Попробуйте на другом хостинге. Я попробовал с нескольких разных сайтов, и проблем не возникло.
Подскажите как корректно настроить сборку на хостинге TimeWeb
Если вы про то, чтобы развернуть там снимок сборки — то 95% никак. Там скрипт отбивается, если в течение 5-ти секунд нагружает процессор на 100%. Это политики таймвеба. Разворачивайте сборку на другом каком-нибудь хостинге, который позволяет это сделать, и потом уже переносите файлы и БД на таймвеб.
Скажите пож-та. Авторизация через социальные сети. Жму вход, например через Яндекс, тупо перенаправляет на страницу регистрации, где пароль от соцсети надо указывать дополнительно. Посмотрел на сайте шоколада тоже самое. Соцсети должны вообще облегчать задачу, и регистрации без ввода пароля в том числе. На Яндексе, пример, описание help.yandex.ru/passport/social.xml?ncrnd=1135 или что то не правильно понимаю?
Пароль надо там не от соцсети указывать, а желаемый. То есть будет создана учетка на сайте и сразу привязан ваш аккаунт из соцсети. В дальнейшем при авторизации через соцсеть вам уже не понадобится вводить логин/пароль. Но вы сможете и через обычный логин/пароль войти. Согласен, что надо как-то будет юзабилити побольше добавить, какое-то сообщение прописать, чтобы было понятней. Сделаем позже.
черезобновление сайта упорно не хотел авторизироваться решилось удалением вручную всего содержимого папки core/cache сразу запахал как миленький вопрос: это нормально, что он не чистит толком кеш? и не вредно ли это для сайта (когда удаляю вручную)?
Может у веб-сервера не было прав на часть кеш-папок, из-за чего не происходило полноценного сброса кеша. Конечно же в таких случаях удаление папки core/cache - наше все. Далее сброс кеша сайта через меню должен нормально идти (если вы не игрались с настройками типа cache_prefix). А то, что не хотел авторизовываться - это нормально. Настройки эти кешируются и пока не сбросить кеш сайта, изменения в соцпрофилях не имеет силы.

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