tag:blogger.com,1999:blog-12030811155932405552024-02-08T09:46:59.499-08:00 Учусь X-Cart 5 (5.3)DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.comBlogger19125tag:blogger.com,1999:blog-1203081115593240555.post-3688340994625058432016-11-03T04:24:00.002-07:002016-11-03T04:25:37.737-07:00Установка Яндекс Метрики<div dir="ltr" style="text-align: left;" trbidi="on">
Последнее время у меня был сторонний модуль Метрики для X-CART, честно купленный за 5 баксов, но после перехода на версию движка 5.3 он приказал долго жить (даже с конвертацией в twig), авторы его что то молчат, ну и ладно.<br />
<br />
В папке ваш скин\layout\footer создаем файл <b>main.footer.metrika.twig</b>, содержащий<b><br /></b><br />
<br />
<span style="background-color: #ead1dc;">{##<br /> # Yandex Metrika<br /> #<br /> # @ListChild (list="layout.main.footer", weight="2000")<br /> #}<br /><br /><!-- Yandex.Metrika counter --></span><br />
<span style="background-color: #ead1dc;"><br /></span>
<span style="background-color: #ead1dc;">Тут код метрики, скопированный из ее настроек на сайте Метрики.</span><br />
<span style="background-color: #ead1dc;"><br /><!-- /Yandex.Metrika counter --></span><br />
<br />
<b><br /></b>Все! Мне не жалко 5 баксов, просто когда времени на выпрашивание уходит больше, чем на "написать самому" это не прикольно.<b><br /></b><br />
<b><br /> </b></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com2tag:blogger.com,1999:blog-1203081115593240555.post-69256443641811824022016-11-03T02:53:00.002-07:002016-11-03T02:53:26.397-07:00Установка кодов подтверждения покупки<div dir="ltr" style="text-align: left;" trbidi="on">
Установка на страницу "Спасибо" стороннего кода нужна в системах аналитики от Гугля и Яндекса и во всевозможных партнерках, которые хотят знать, что покупка была совершена.<br />
<br />
!!! Будьте внимательны! Чужие скрипты (и в ифреймах в том числе) могут делать что угодно, любые вредоносные действия.<br />
<br />
Идем в папку с нашим скином, затем в <b>default/checkout/</b> (если этих папок нет - создаем) и создаем папку <b>success</b>, в которую будем помещать twig файлы для разных сервисов.<br />
<br />
Так для Гугл Адвордс создадим файл google.twig содержащий<br />
<br />
<span style="background-color: #d9d2e9;">{##<br /> # Order success for Google<br /> #<br /> # @ListChild (list="checkout.success.panel", weight="1000")<br /> #}<br /><br /><div>google code</div></span><br /></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com1tag:blogger.com,1999:blog-1203081115593240555.post-59588723190945087182015-11-28T23:07:00.000-08:002015-11-28T23:07:03.607-08:00Если вы ошиблись в коде (PHP)<div dir="ltr" style="text-align: left;" trbidi="on">
Правлю модуль доставки, вроде бы все ОК. перегружаю магазин - получаю вот такое:<br />
<br />
Deploying store [step 1 of 13], please wait...<br /><br /><span style="background-color: #cfe2f3;">Cleaning up the cache... [0.00sec, 1.0MB (53kB)]<br />Building classes tree... [0.81sec, 9.1MB (8.1MB)]<br />Run the "Doctrine_Plugin_Cache" plugin... [0.00sec, 9.2MB (131kB)]<br />Run the "Doctrine_Plugin_DocBlock_FakeEntities" plugin... </span><br /><br /><br /><span style="background-color: #f4cccc;">ERROR: "Includes\ErrorHandler::FATAL_ERROR" (code 2)<br />Class 'XLite\Model\OrderAbstract' not found</span><br />
<br />
<span style="background-color: white;">и виснет. </span><br />
<br />
<span style="background-color: white;">Причем то, что подсвечено розовым - отображается далеко не всегда, а только после удаления папки VAR (хотя виснет всегда).</span><br />
<br />
<span style="background-color: white;">а все было просто - в PHP коде забыл одну скобку... </span></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com1tag:blogger.com,1999:blog-1203081115593240555.post-4621399426854143352015-11-19T04:43:00.000-08:002015-11-19T04:43:17.158-08:00Немного о CSS<div dir="ltr" style="text-align: left;" trbidi="on">
Помещенный в папку skins/YouSkin/default/en/css/ файл style.css оказывает влияние на стили сразу, не требуя перезагрузки x-cart<br />
<br />
НО!!! @media запросы у меня в нем так и не заработали...</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-37143304581537791322015-10-19T04:11:00.000-07:002015-10-19T04:19:30.899-07:00Начиная с 5.2.6 - могут быть проблемы с вашими шаблонами.<div dir="ltr" style="text-align: left;" trbidi="on">
Совершенно не думал об этом до сегодняшнего дня, пока не понадобилось настроить рассылку почты через яндексовый SMTP сервер.<br />
<br />
и в логах до кучи нашел вот такую каку:<br />
<br />
XLite [warning] Warning: call_user_func_array() expects parameter 1 to be a valid callback, class 'XLite\Module\DAG\MaayaSkin\Main' does not have a method 'getLayoutTypes' in /home/almaayar/data/www/maaya.ru/var/run/classes/XLite/Model/Module.php on line 426<br />
<br />
Вроде бы варнинг, но разобраться то хочется. ответ есть по ссылке :<span class="main_header"> <a href="https://forum.x-cart.com/showthread.php?t=72546" target="_blank">Errors with custom skin</a></span><br />
<br />
<span class="main_header">То есть все (все? но ошибка вроде бы ушла) что нужно сделать - это в Main скина дописать</span><br />
<span class="main_header"></span><br />
<br />
<pre class="alt2" style="border: 1px inset; height: 82px; margin: 0px; overflow: auto; padding: 6px; width: 640px;"> public static function getLayoutTypes()
{
return \XLite\Core\Layout::getInstance()->getLayoutTypes();
}</pre>
<span class="main_header"><br /></span>
<span class="main_header">ну и чудесно.</span><br />
<br />
<span class="main_header">второй варнинг </span><span class="main_header">"does not have a method getLayoutColors" лечится ровно так же - пишем в main.php код</span><br />
<span class="main_header"></span><br />
<br />
<pre class="alt2" style="border: 1px inset; height: 130px; margin: 0px; overflow: auto; padding: 6px; width: 640px;"> const COLOR_SCHEME_STANDARD = 'Standard';
public static function getLayoutColors()
{
return array(
static::COLOR_SCHEME_STANDARD => \XLite\Core\Translation::lbl('Pmall'),
);
}</pre>
<span class="main_header"><br /></span>
<span class="main_header">Кстати о почте - в настройках почты ЧЕТЫРЕ ящика, а слать почту можно только с одного, иначе сервер сделает вашему письму rejected. Кто сразу догадается, с какого? </span></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-62284265411276915562015-06-04T05:59:00.001-07:002015-06-04T05:59:17.412-07:00Как изменить шаблон чужого МОДУЛЯ<div dir="ltr" style="text-align: left;" trbidi="on">
Это важно, потом сам забуду <br />
<br />
в X-CART есть такой замечательный модуль Add2CartPopup и вот его шаблон то мне и понадобилось поправить.<br />
<br />
Напрямую - нельзя, при его следующем обновлении моим изменениям придет капут, да и отслеживать их все - глупо и лениво.<br />
<br />
Простое дублирование item.message.tpl (мне его надо было поправить) в своем модуле приводит к тому, что и ожидалось - перекрытия нет, это message отображается два раза, старое и новое.<br />
<br />
А вот если разместить item.message.tpl по пути \skins\ваш_скин\<span style="color: #660000;"><b>default\en\modules\XC\Add2CartPopup</b></span>\parts то все перекроется просто расчудесно!<br />
<br />
Интересно, а что будет, если я когда нибудь забуду о этой зависимости и снесу Add2CartPopup? Скорее всего ничего страшного, лень проверять заранее...</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-71855535769130676642015-06-04T05:51:00.002-07:002015-06-04T05:51:59.360-07:00Перешел на 5.2.5<div dir="ltr" style="text-align: left;" trbidi="on">
В общем то все прошло быстро и не больно, только мой скин теперь не отключается, можно только зайти в... "его" настройки, и сменить его. ну и ладно.<br />
<br />
Зачем только все это менять, только люди привыкли...</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-48392202009561473782015-04-28T06:13:00.001-07:002015-04-28T06:22:01.706-07:00И еще раз о Яндекс Метрике.<div dir="ltr" style="text-align: left;" trbidi="on">
В общем, не заработала она у меня - модуль активен, ,код в страницу вставляется верно, а не видит его Метрика, хоть треснись об него...<br />
<br />
Путем экспериментов выяснилось что нужно разделить JS скрипт метрики и сам счетчик, убрав у счетчика тег <nosctipt><br />
<br />
Как результат - я вообще удалил этот модуль, а все, что нужно для метрики - дописал в powered_by.tpl, причем сначала идет код счетчика, потом - вывод копирайта, и уже потом - JS скрипт Метрики.<br />
<br />
<br />
А копирайт оказывается удалять было нельзя... йо... вернул, поставил сылку на x-cart.com - так правильно. :)</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-69606725687452708562015-04-28T00:27:00.000-07:002015-04-28T00:31:12.974-07:00О скидках в X-Cart<div dir="ltr" style="text-align: left;" trbidi="on">
Надо было давно написать... уже сам забыл все :(<br />
<br />
В общем модуль скидок в X-Cart конечно есть, но он есть в платной версии (полбеды) плюс мне нужны были очень специфические скидки, которые все равно было им не реализовать...<br />
<br />
Спасибо Антону, ПОМОГ, /// за прошедшее время на офф сайте появилось много документации <a href="http://kb.x-cart.com/display/XDD/Changing+store+logic" rollapp-href="http://kb.x-cart.com/display/XDD/Changing+store+logic">http://kb.x-cart.com/display/XDD/Changing+store+logic</a> - прошу любить и жаловать :)<br />
<br />
В моем случае код (вдруг кому пригодится) такой:<br />
<br />
1. Определяем, имеет ли покупатель право на 10% скидку, для этого у него не должно быть невыкупленных заказов и должны быть выкупленные:<br />
<br />
<span style="background-color: #cfe2f3;"> protected function has10Discount()<br /> {<br /> $discountState = false; <br /><br /> $profile = \XLite\Core\Auth::getInstance()->getProfile();<br /> if ($profile) {<br /> $cnd = new \XLite\Core\CommonCell();<br /> $cnd->profile = $profile;<br /> foreach (\XLite\Core\Database::getRepo('XLite\Model\Order')->search($cnd) as $order) {<br /> $orderState = $order->getPaymentStatusCode();<br /> if ($orderState == \XLite\Model\Order\Status\Payment::STATUS_REFUNDED)<br /> { $discountState = false; break; }<br /> if ($orderState == \XLite\Model\Order\Status\Payment::STATUS_PAID)<br /> $discountState = true;<br /> }<br /> }<br /><br /> return $discountState;<br /> }</span><br />
<br />
<br />
2. Вычисляем скидку в зависимости от количества товаров:<br />
<br />
<span style="background-color: #cfe2f3;"> public function calculate()<br /> {<br /><br /> $quantity = 0;<br /> $surcharge = 0;<br /> $pastaPrice = 700;<br /> $pastaOptDiscount = 300;<br /><br /> foreach ($this->getOrderItems() as $item) <br /> {<br /> if (floor($item->getItemPrice()) == $pastaPrice)<br /> $quantity += $item->getAmount();<br /> }<br /><br /> if ($quantity < 3) $surcharge = 0;<br /> if ($quantity > 2 && $quantity < 6) $surcharge = $pastaPrice;<br /> if ($quantity == 6) $surcharge = 2*$pastaPrice;<br /> if ($quantity > 6)<br /> {<br /> if (round($quantity/6,0) != round($quantity/6,1)) $surcharge = 2*$pastaPrice;<br /> else $surcharge = $quantity*$pastaOptDiscount;<br /> }<br /><br /> if ($this->has10Discount())<br /> $surcharge += floor(($this->getOrder()->getSubtotal() - $surcharge)/ 10);<br /><br /> if ($surcharge <= 0) {<br /> $surcharge = null;<br /> } else {<br /> $surcharge = $this->addOrderSurcharge($this->code, $surcharge * -1);<br /> }<br /><br /> return $surcharge;<br /> }</span><br />
<br />
Куда и как положить этот код - смотрите на офф сайте по ссылке<a href="http://kb.x-cart.com/display/XDD/Creating+global+discount" rollapp-href="https://www.blogger.com/" target="_blank"> http://kb.x-cart.com/display/XDD/Creating+global+discount</a>, я же отмечу, что скидка считается не на товар, а общая, то есть при покупке трех товаров по 700 рублей сумма будет 2100 и сумма скидки - 700. Если это повторный заказ - то скидка будет уже 840...<br />
<br />
Обидно, что за прошедшее время сам забыл, как активировать этот код (если это вообще надо)... Ну понадобится - вспомню, а впредь буду писать в блог сразу, он же именно для этого...</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-42724492863166530662015-04-27T22:01:00.005-07:002015-04-28T00:07:22.865-07:00И снова о Powered by X-Cart<div dir="ltr" style="text-align: left;" trbidi="on">
Строка "Powered by X-Cart" (на самом деле целиком оно звучит вот так: Powered by X-Cart <a href="http://www.x-cart.com/?sl=en" rollapp-href="http://www.x-cart.com/?sl=en" target="_blank">eCommerce solution</a> - первое что все почему то хотят удалить. Оставлю в покое совесть удаляющего, ибо не возбраняется разработчиками X-Cart, а значит можно.<br />
<br />
Раньше (до 5.2) это удалялось или стилями (чаще всего) или в модуле (visible = false, по моему..), или в шаблоне (реже всего, потому что чайнеку пришлось бы разобраться с ними, что само по себе задача)<br />
<br />
Лично я "очищался" в моем модуле, отвечающем за коррекцию отображения скина, вот так:<br />
<br />
<span style="background-color: #d0e0e3;"><?php<br />namespace XLite\Module\DAG\MySkin\View;<br /> <br />class PoweredBy extends \XLite\View\PoweredBy implements \XLite\Base\IDecorator<br />{<br /> protected function getPhrase()<br /> {<br /> return '';<br /> }<br />}</span><br />
<br />
Апдейт до 5.2 ОК, перегружаю магазин, ОП! "Powered by X-Cart" появилось. <br />
<span style="background-color: white;"><br /></span>
<span style="background-color: white;">Да, смотрю шаблон (/skins/default/en/powered_by.tpl) - вот оно, прям жостко зашито:</span><br />
<span style="background-color: #d0e0e3;"><br /></span>
<span style="background-color: #d0e0e3;"><div class="powered-by"><br />...<br /> <p class="powered-by-label"><span style="color: #990000;">Powered by X-Cart</span> {getMessage():h}</p><br /></div></span><br />
<br />
а <span style="background-color: #d0e0e3;">getMessage():h <span style="background-color: white;">= </span></span><span style="background-color: #d0e0e3;">getPhrase() <span style="background-color: white;">из кода выше.</span></span><br />
<br />
<span style="background-color: #d0e0e3;"><span style="background-color: white;">Убрать всё это можно, воспользовавшись инструкцией на офф сайте: http://kb.x-cart.com/pages/viewpage.action?pageId=6389847 </span></span><br />
<br />
<span style="background-color: #d0e0e3;"><span style="background-color: white;"> </span></span>Insert the following CSS code into the field below:<br />
<span style="background-color: #d0e0e3;"><span style="background-color: white;"><br /></span></span>
<span style="background-color: #cfe2f3;">.powered-by .powered-by-label {<br /> display: none;<br />}</span><br />
<span style="background-color: #d0e0e3;"><span style="background-color: white;"><br /></span></span>
<span style="background-color: #d0e0e3;"><span style="background-color: white;">Мне эта затея не нравится, поэтому копируем powered_by.tpl из дефаултного шаблона в наш, убираем из него строку </span><p class="powered-by-label">, <span style="background-color: white;"> за ненадобностью (теперь) убираем из модуля файл с </span></span><span style="background-color: white;"></span><span style="background-color: #d0e0e3;"><span style="background-color: white;">getPhrase(), пересобираем магазин...</span></span><br />
<br />
<span style="background-color: #d0e0e3;"><span style="background-color: white;">Все работает. и теперь чего бы не добавляли разработчики в футер - буду надеяться, что у меня это не скоро отобразится.</span></span></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-79797535724671578942015-04-27T06:28:00.000-07:002015-04-28T01:23:46.159-07:00Обновление X-Cart до 5.2.3<div dir="ltr" style="text-align: left;" trbidi="on">
Хоть и затянулось внедрение моего магазина, а обновлять его надо. И вот сегодня проделал оное с версии 5.1.15 - на 5.2.3<br />
<br />
Обновление установилось приятно беспроблемно, единственное - пришлось отключить модуль Яндекс Метрики, которое еще перед обновлением заругалось... уже не помню как, ну мне проще его установить заново, благо реально то сайт еще не работал...<br />
<br />
Еще выяснилось, что мои модули - отключены.И включаться не хотят. Ну тут все просто - после обновления движка меняем в их Main.php <br />
<br />
<span style="background-color: #cfe2f3;"> public static function getMajorVersion()</span><br />
<span style="background-color: #cfe2f3;"> {</span><br />
<span style="background-color: #cfe2f3;"> return <span style="color: red;">'5.2'</span>;</span><br />
<span style="background-color: #cfe2f3;"> }</span><br />
<br />
и в базе для этих модулей апдейтим: <br />
<span style="background-color: #cfe2f3;"><br /></span>
<span style="background-color: #cfe2f3;">UPDATE `xc5_modules` SET `majorVersion` = '5.2' WHERE `xc5_modules`.`moduleID` = ваш ID модуля</span><br />
<br />
Включаю модули, один включается, а модуль скидок ругается:<br />
<span style="background-color: #cfe2f3;"><br /></span>
<span style="background-color: #cfe2f3;"><span style="color: red;">Unknown column type "uinteger" requested. </span>Any Doctrine type that you use
has to be registered with \Doctrine\DBAL\Types\Type::addType(). You can
get a list of all the known types with
\Doctrine\DBAL\Types\Type::getTypesMap(). If this error occurs during
database introspection then you might have forgot to register all
database types for a Doctrine Type. Use
AbstractPlatform#registerDoctrineTypeMapping() or have your custom types
implement Type#getMappedDatabaseTypes(). If the type name is empty you
might have a problem with the cache or forgot some mapping information...</span><br />
<br />
Забавно. Это у меня в модуле использовалась (точнее создавалась, до реального использования руки не дошли) моя таблица, и одно из полей имело тип <span style="background-color: #cfe2f3;"><span style="color: red;">uinteger</span></span>. Больше такой тип не поддерживается? Меняю тип<br />
<br />
<span style="background-color: #cfe2f3;"> /**<br /> * Unique ID<br /> *<br /> * @var integer<br /> *<br /> * @Id<br /> * @GeneratedValue (strategy="AUTO")<br /> * @Column (type="<span style="color: red;">integer</span>")<br /> */</span><br />
<br />
<br />
Все ОК, модуль включается.<br />
<br />
<br />
Все обновление заняло минут 10... Имхо, это по божески!<br />
Иду в Маркетплейс, нахожу Yandex Metrika (надо же ее вернуть после обновления) - йопт! а оно уже $4.99 стоит! йопт... не, я конечно понимаю, что все это дело хозяйское, но.... Хочу дам, хочу отберу обратно - это не дело.<br />
Посмотрел код модуля Yandex Metrika, который был бесплатен в 5.1 - там на 90% стандартный main.php плюс тоже стандартный JS код метрики. Поскольку мне продавать модуль не надо (а значит не нужен и ввод - сохранение ID счетчика) написание своего модуля "по мотивам" заняло минут 15 :)</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-69990930746495053292015-02-28T01:24:00.000-08:002015-02-28T01:38:29.148-08:00Где в X-CART 5 смотреть ошибки?<div dir="ltr" style="text-align: left;" trbidi="on">
Все просто: <b>/VAR/LOGS</b><br />
<br />
Причем логи ведутся по человечески, все наглядно и достаточно для отладки. Причем наверно не стоит забывать их чистить... Судя по моему другому сайду они могут разбухать до сотен мегабайт в год, а зачем оно надо... бекапить все это сто раз (например)<br />
<br />
Эх, еще бы в случае критических ошибок сделать так, чтобы мне на телефон отправлялась СМС... это так, заметка на будущее )))</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-58962231575470245522015-02-16T05:36:00.000-08:002015-02-17T11:47:29.961-08:00Как перестать бояться REST API и полюбить ее<div dir="ltr" style="text-align: left;" trbidi="on">
Прежде всего читаем официальную доку: <a href="http://kb.x-cart.com/display/XDD/REST+API+documentation">http://kb.x-cart.com/display/XDD/REST+API+documentation</a> вполне возможно, что информация там уже куда более новая и дополненная, ну а это... это я пишу для себя.<br />
<br />
<span style="color: #660000;"><b>1.</b></span> Прежде всего важно, что можно получать не только <b>product</b>, <b>user</b> and <b>order</b> entities, но и другие, ровно точно так же, например, передав &_path=address/22 вернет нам адрес с его ID=22.<br />
<br />
<span style="color: #660000;"><b>2</b>.</span> REST API X-Cart (в 5.1.10 - точно) может отдавать данные не только JSON, но и XML, для этого нам нужно просто WebRequest.Accept присвоить значение 'application/xml', но какого то практического смысла я в этом не нашел (хотя с XML работал много и привык).<br />
<br />
<span style="color: #660000;"><b>3.</b></span> Мы можем выбирать данные с ЛЮБЫМИ условиями, для этого нам надо уметь их передать... это делается так:<br />
<br />
<div class="container" title="Hint: double-click to select code">
<div class="line number1 index0 alt2">
<code class="php plain">http:</code><code class="php comments">//<MY-XCART-PATH>/admin.php?target=RESTAPI&_key=rest-api-key&_path=product</code>&<span style="color: red;">_cnd[orderNumber]=3 </span></div>
</div>
<br />
Если нам нужно передать больше параметров, то передаем их как массив... <br />
<br />
...<code class="php comments"></code>&<span style="color: red;">_cnd[orderNumber][<span style="color: #0c343d;">0</span>]=3</span>&<span style="color: red;">_cnd[orderNumber]<span style="color: #274e13;">[1</span>]=8 </span><br />
<br />
<h3 style="text-align: left;">
<span style="color: red;"><span style="color: black;">Какие же выборки мы можем делать?</span></span></h3>
<br />
<span style="color: red;"><span style="color: black;">Идем в папку xcart\classes\XLite\Model\Repo - вот какие классы мы тут видим, те мы и можем выбирать, по крайней мере для меня это кажется логичным.</span></span><br />
<br />
<span style="color: red;"><span style="color: black;">Далее, какие условия для фильтрации данных нам доступны? Смотрим код интересующего нас класса - видим блок</span></span><br />
<br />
<span style="color: red;"><span style="color: black;"> /**<br /> * Allowable search params<br /> */</span></span><br />
<span style="color: red;"><span style="color: black;"></span></span><br />
<br />
<span style="color: red;"><span style="color: black;">Это оно. Например для Currency доступно два параметра </span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;"> const SEARCH_ORDER_BY = 'orderBy';<br /> const SEARCH_LIMIT = 'limit';</span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;">а гдето ниже по коду мы найдем два соответствующих метода... да, есть такие! например</span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span><span style="color: red;"><span style="color: black;"><span style="font-size: x-small;">protected function prepareCndOrderBy(\Doctrine\ORM\QueryBuilder $queryBuilder, array $value, $countOnly)<br /> {<br /> if (!$countOnly) {<br /> list($sort, $order) = $this->getSortOrderValue($value);<br /> $queryBuilder->addOrderBy($sort, $order);<br /> }<br /> }</span></span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;">интереснее конечно выборки например для ордеров</span></span><br />
<span style="color: red;"><span style="color: black;"></span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;"> protected function <span style="color: red;">prepareCnd</span><span style="background-color: #f1c232;">OrderMore</span>(\Doctrine\ORM\QueryBuilder $queryBuilder, $value)<br /> {<br /> if (!empty($value)) {<br /> $queryBuilder->andWhere('o.order_id > :<span style="background-color: #f1c232;">order</span></span></span><span style="color: red;"><span style="color: black;"><span style="background-color: #f1c232;"><span style="color: red;"><span style="color: black;">More</span></span></span>')<br /> ->setParameter('<span style="background-color: #f1c232;">order</span></span></span><span style="color: red;"><span style="color: black;"><span style="background-color: #f1c232;"><span style="color: red;"><span style="color: black;">More</span></span></span>', $value);<br /> }<br /> }</span></span>
<span style="color: red;"><span style="color: black;">а вызывать мы его будем как </span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;">........&_path=order&_cnd[<span style="background-color: #f1c232;">orderMore</span>]=value</span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;">важно только не забыть (я поначалу забыл) прописать </span></span><br />
<br />
<span style="color: red;"><span style="color: black;"> const <span style="background-color: #f1c232;">ORDER_MORE</span> = '</span></span><span style="color: red;"><span style="color: black;"><span style="color: red;"><span style="color: black;"><span style="background-color: #f1c232;">orderMore</span></span></span>';<br /><br /><span style="background-color: #cfe2f3;"> protected function getHandlingSearchParams()<br /> {<br /> $params = parent::getHandlingSearchParams();<br /> $params[] = self::<span style="background-color: #f1c232;">ORDER_MORE</span>;<br /> return $params;<br /> }</span><br /> </span></span><br />
<span style="color: red;"><span style="color: black;">разумеется все это кладем в </span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
<span style="color: red;"><span style="color: black;">abstract class Order extends \XLite\Model\Repo\Order implements \XLite\Base\IDecorator<br />{<br />.....</span></span><br />
<br />
<span style="color: red;"><span style="color: black;">в соответствующий файл (в нашем случае - Order.php) в папку /Model/Repo вашего модуля.</span></span><br />
<span style="color: red;"><span style="color: black;"><br /></span></span>
</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-72624169183028698482015-01-28T07:11:00.003-08:002015-01-28T07:11:50.686-08:00Где X-Cart хранит настройки (например логин и пароль - доступ к БД)<div dir="ltr" style="text-align: left;" trbidi="on">
Все очень просто - /etc/config.php<br />
<br />
Постоянно забываю, лучше запишу тут.</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-57791674854665471272015-01-09T22:39:00.000-08:002015-01-09T23:03:16.502-08:00Как отключать некоторые виды оплаты в зависимости от способа доставки<div dir="ltr" style="text-align: left;" trbidi="on">
Весьма обыденная ситуация: вам нужно запретить "наложенный платеж" при доставке "транспортной компанией" (собственно, варианты могут быть любые, например ваш курьер не принимает карты, не важно - принцип один).<br />
<br />
Как правило, в крупных, давно и правильно настроенных ИМ (типа Озона) это делается путем последовательного отображения пользователю страниц выбора адреса - вариантов доставки - вариантов оплаты. В X-Cart 5 же (и это ЛУЧШЕ - потому что наглядно, потому что все видно сразу) все это собрано на одной странице, а значит (де)активация способов оплаты должна происходить динамически, в зависимости от выбранного пользователем способа доставки.<br />
<br />
Мой вопрос на офф форуме, его обсуждение и ссылку на статью в документации по X-Cart можно <a href="http://forum.x-cart.com/showthread.php?p=381726#post381726" target="_blank">посмотреть по ссылке</a>.<br />
<br />
В моем случае есть два способа доставки:<br />
= Почта (ID=1) и Транспортная Компания (ID=2)<br />
и два способа оплаты:<br />
= Яндекс Касса (ID=67) и Наложенный Платеж (ID=73).<br />
ID методов доставки и оплаты можно увидев, зайдя в админке в их
настройку - ID отобразится в урле соответствующей страницы, например
так: site.ru/admin.php?target=payment_method&method_<span style="color: #990000;"><b>id=67</b></span>.<br />
<br />
Мне нужно запретить Наложенный Платеж в случае, если доставка будет осуществляться транспортной компанией. Для этого в вашем модуле, который отвечает за бизнес логику вашего ИМ, создаем файл XLite\Module\DAG\SpecialOffer\Model\<b>Order.php</b> (на имя конкретно моего модуля внимания не обращаем, так вышло, что я начал со скидок, а теперь уже просто лень его переименовывать)<br />
<blockquote class="tr_bq">
<span style="font-size: x-small;"><span style="color: #073763;"><span style="background-color: #cfe2f3;"><?<br />// vim: set ts=4 sw=4 sts=4 et:<br /><br />namespace XLite\Module\DAG\SpecialOffer\Model;<br /><br />/**<br /> * Class represents an order<br /> */<br />abstract class Order extends \XLite\Model\Order implements \XLite\Base\IDecorator<br />{<br /> public function getPaymentMethods()<br /> {<br /> if (0 < $this->getOpenTotal()) <br /> {<br /><br /> $list = \XLite\Core\Database::getRepo('XLite\Model\Payment\Method')<br /> ->findAllActive();<br /><br /> foreach ($list as $i => $method) <br /> {<br /> if (!$method->isEnabled() || !$method->getProcessor()->isApplicable($this, $method) <br /> || $this->getShippingId() == <span style="color: #990000;"><span style="font-size: small;"><b>2</b></span></span> && $method->getMethodId() == <span style="color: #990000;"><b><span style="font-size: small;">73</span></b></span>) <br /> {<br /> unset($list[$i]);<br /> }<br /> }<br /><br /> } <br /> else <br /> {<br /> $list = array();<br /> }<br /><br /> return $list;<br /> }<br />}</span></span></span></blockquote>
Красным цветом выделены ID методов доставки и оплаты, комбинация которых недопустима. Перезагружаем магазин, убеждаемся что работает. Честно говоря, я не ожидал, что будет работать так здорово!<br />
<br />
<br />
<br />
<br /></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-64421463717086207272015-01-09T03:13:00.000-08:002015-01-09T03:51:57.306-08:00Много пустого места вокруг иконок с изображением товара<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Или сами иконки слишком мелкие</b>, реально 180 х 180 пикселов — ну куда это годится для современных мониторов?<br />
<br />
Код простой, в файле XLite\Module\<b>DAG</b>\<b>MaayaSkin</b>\View\ItemsList\Product\Customer\<b>ACustomer.php</b> вашего модуля-скина пишем следующее:<br />
<br />
<blockquote class="tr_bq">
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> <?php</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"><br /></span></span>
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;">namespace XLite\Module\DAG\MaayaSkin\View\ItemsList\Product\Customer;</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"><br /></span></span>
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;">abstract class ACustomer extends \XLite\View\ItemsList\Product\Customer\ACustomer implements \XLite\Base\IDecorator</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;">{</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"><br /></span><span style="font-size: x-small;">
<span style="color: #20124d;"> public static function getIconSizes()</span></span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> {</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> return array(</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> static::WIDGET_TYPE_SIDEBAR . '.' . static::DISPLAY_MODE_STHUMB => array(180, 180),</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> static::WIDGET_TYPE_SIDEBAR . '.' . static::DISPLAY_MODE_BTHUMB => array(180, 180),</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> static::WIDGET_TYPE_CENTER . '.' . static::DISPLAY_MODE_GRID => array(220, 220) </span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> static::WIDGET_TYPE_CENTER . '.' . static::DISPLAY_MODE_LIST => array(220, 220),</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> 'other' => array(110, 110),</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> );</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;"> }</span></span><br />
<span style="background-color: #cfe2f3;"><span style="color: #20124d; font-size: x-small;">}</span></span></blockquote>
Уверен, что где прописать размеры иконок продуктов - понятно :) где какие иконки - понятно не сразу, но разобраться не сложно.<br />
<br />
Сложнее другое. Эти иконки общие и используются и в других модулях, дизайн которых портится после изменения размена иконок. Так, например "рекомендуемые товары" в модуле Add2CartPopup начинают наползать друг на друга. И что делать?<br />
<br />
Нужно найти ВСЕ такие проблемные модули и декорировать их классы, указав, что виджет должен оперировать "старым" размером изображений товаров. Для Add2CartPopup я в своем модуле-скине добавил файл XLite\Module\DAG\MaayaSkin\View\Products.php со следующим кодом (использование именно этого метода класса Products спорно, но почему бы и нет?):<br />
<br />
<blockquote class="tr_bq">
<span style="background-color: #cfe2f3; font-size: x-small;"><span style="color: #351c75;"><?php<br />// vim: set ts=4 sw=4 sts=4 et:<br /><br />namespace XLite\Module\DAG\MaayaSkin\View;<br /><br />class Products extends \XLite\Module\XC\Add2CartPopup\View\Products implements \XLite\Base\IDecorator<br />{<br /><br /> protected function getMaxCount()<br /> {<br /> $this->widgetParams[self::PARAM_ICON_MAX_WIDTH]->setValue(180);<br /> $this->widgetParams[self::PARAM_ICON_MAX_HEIGHT]->setValue(180);<br /><br /> return static::PARAM_MAX_PRODUCT_COUNT;<br /> }<br /><br />}</span></span></blockquote>
Перезагружаем магазин и видим, что все ОК.<br />
<br />
Я <i>подозреваю</i>, что явно указывая вместо self нужный класс виджета (в нашем случае это <span style="background-color: #cfe2f3; font-size: x-small;"><span style="color: #351c75;">\XLite\Module\XC\Add2CartPopup\View\Products)</span></span>- можно менять его параметры из другого виджета, не затрагивая кода самого класса.<br />
<br />
обсуждение этой темы на офф форуме X-Cart доступно <a href="http://forum.x-cart.com/showthread.php?t=69871" target="_blank">по ссылке</a></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-77146809449014951992014-12-18T00:35:00.000-08:002015-01-10T01:37:25.454-08:00Особенности установки и подстройки "под себя" X-Cart 5. <div dir="ltr" style="text-align: left;" trbidi="on">
CMS X-Cart 5 отличается от привычных советскому пионеру CMS, таких как Водрпресс, Друпал, Джумла (что там еще? да легион их) тем, что тот код, который вы правите (не важно что это - шаблон, прием платежа или расчет скидки) - сервером сайта НЕ ИСПОЛНЯЕТСЯ.<br />
<br />
После того, как в код внесены все необходимые изменения - запускается специальный процесс пересборки магазина, который берет все что нужно из всех нужных папок и собирает это в одну папку /VAR. Именно содержимое этой папки и будет работать - продавать посетителям сайта ваши товары. Учитывая это, нам нужно знать несколько вещей, а именно:<br />
<br />
<span style="color: #660000;"><span style="font-size: large;"><b>!</b></span></span> На хостинге ваш сайт на основе X-Cart 5 займет примерно вдвое больше места, чем вы ожидали (вместо примерно 35МБ - 70МБ). Соответственно, вы должны купить у вашего хостера минимум 100МБ дискового пространства.<br />
<br />
<span style="color: #660000;"><span style="font-size: large;"><b>!</b></span></span> После того, как вы внесете в ваши модули очередные изменения - процесс перезагрузки магазина будет виснуть. Разумеется не всегда, но иногда (в прямой зависимости от ваших ошибок) - будет точно. Определить это можно очень просто - если любой из элементов сборки повис более чем на 5-10 секунд - все. Можете больше не ждать. По незнанию я раз прождал семь (!!!) часов, разумеется не дождался - если сборщик повис - это 100% навсегда.<br />
<br />
Что же делать? <br />
<br />
Самый простой способ - откатить последние изменения в коде и удалить папку /VAR. Да, да. Прямо так, всю папку. Ну а дальше - как повезет, я так понял - процесс пересборки лучше всего (просьба не пинать - чисто мой опыт) запускается при обращении к любой странице в админке сайта, например site.ru/admin.php?target=product_list<br />
<br />
<span style="color: #660000;"><span style="font-size: large;"><b>!</b></span></span> Почти наверняка вы поставили бесплатную версию X-Cart 5? Так вот, она не будет обновляться, пока вы не снесете ВСЕ предустановленные "платные" модули. Так что мышку в руки и удаляем... удаляем, удаляем. Да и зачем они вам? Имхо, в итоге должно остаться полтора-два десятка модулей, не более.<br />
<br />
<br />
<br /></div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com1tag:blogger.com,1999:blog-1203081115593240555.post-22536159963255807392014-12-10T04:09:00.000-08:002015-01-09T04:10:20.453-08:00Убрать ссылку на X-Cart в строке статуса<div dir="ltr" style="text-align: left;" trbidi="on">
Наверно это аналог Hello Word - каждый должен пройти. Зачем удалять - вопрос второй, люди БЕСПЛАТНО дают вам мощнейший и современный движок - это не стоит упоминания о них в футере вашего сайта? Ну да ладно.<br />
<br />
Как всегда, правим ваш модуль-скин, файл XLite\Module\DAG\MaayaSkin\View\<b>PoweredBy.php</b> должен содержать следующий код:<br />
<br />
<blockquote class="tr_bq">
<span style="color: #073763;"><span style="background-color: #cfe2f3;"><span style="font-size: x-small;"><?php<br />namespace XLite\Module\DAG\MaayaSkin\View;<br /> <br />class PoweredBy extends \XLite\View\PoweredBy implements \XLite\Base\IDecorator<br />{<br /> protected function getPhrase()<br /> {<br /> return '';<br /> }<br />}</span></span></span></blockquote>
Этот пример отличается от примеров <a href="http://kb.x-cart.com/display/XDD/Developer+docs" target="_blank">в документации</a> и на офф форуме (там предлагается скрыть строку целиком, через CSS или в коде класса, сказав ей чтоб она стала невидимой) - мы заменяем ссылку на пустую строку, когда понадобится - легко сможем тут вывести что то свое.<br />
<br />
Перезагружаем магазин, наблюдаем изменения.</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0tag:blogger.com,1999:blog-1203081115593240555.post-33294604095333891112014-12-08T01:45:00.000-08:002015-01-10T01:51:19.775-08:00X-Cart 5 Видеоуроки (или это семинары?)<div dir="ltr" style="text-align: left;" trbidi="on">
Уже поняли, что X-Cart 5 отличается некоторым... своебразием и философией? Нет? Тем хуже для вас )))<br />
<br />
Самому можно догадаться. Методом проб, ощибок... Боже, как я искал это видео, даже тему на сече создавал, мол помогите братья сестры, подкиньте ссылку на уроки...<br />
<br />
В общем смотрим видео. Кому кажется длинным - смотрим два раза ))) Это реально потом сэкономит вам время, силы, нервы и деньги.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/06mzCyRDoxY?feature=player_embedded' frameborder='0'></iframe></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/VdLF56ij0NQ?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/fd8Lbswj80s?feature=player_embedded' frameborder='0'></iframe></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="https://ytimg.googleusercontent.com/vi/72_dx9pmWxU/0.jpg" height="266" width="320"><param name="movie" value="https://youtube.googleapis.com/v/72_dx9pmWxU&source=uds" /><param name="bgcolor" value="#FFFFFF" /><param name="allowFullScreen" value="true" /><embed width="320" height="266" src="https://youtube.googleapis.com/v/72_dx9pmWxU&source=uds" type="application/x-shockwave-flash" allowfullscreen="true"></embed></object></div>
<br />
Если найдете (или у вас уже есть) еще подобное видео на русском языке - буду ЧРЕЗВЫЧАЙНО благодарен, если пришлете мне ссылку на него или даже само видео. Спасибо заранее :)</div>
DAGhttp://www.blogger.com/profile/03965062233474982369noreply@blogger.com0