вторник, 28 апреля 2015 г.

И еще раз о Яндекс Метрике.

В общем, не заработала она у меня - модуль активен, ,код в страницу вставляется верно, а не видит его Метрика, хоть треснись об него...

Путем экспериментов выяснилось что нужно разделить JS скрипт метрики и сам счетчик, убрав у счетчика тег <nosctipt>

Как результат - я вообще удалил этот модуль, а все, что нужно для метрики - дописал в powered_by.tpl, причем сначала идет код счетчика, потом - вывод копирайта, и уже потом - JS скрипт Метрики.


А копирайт оказывается удалять было нельзя... йо... вернул, поставил сылку на x-cart.com - так правильно. :)

О скидках в X-Cart

Надо было давно написать... уже сам забыл все :(

В общем модуль скидок в X-Cart конечно есть, но он есть в платной версии (полбеды) плюс мне нужны были очень специфические скидки, которые все равно было им не реализовать...

Спасибо Антону, ПОМОГ, /// за прошедшее время на офф сайте появилось много документации http://kb.x-cart.com/display/XDD/Changing+store+logic - прошу любить и жаловать :)

В моем случае код (вдруг кому пригодится) такой:

 1. Определяем, имеет ли покупатель право на 10% скидку, для этого у него не должно быть невыкупленных заказов и должны быть выкупленные:

    protected function has10Discount()
    {
        $discountState = false;

        $profile = \XLite\Core\Auth::getInstance()->getProfile();
        if ($profile) {
            $cnd = new \XLite\Core\CommonCell();
            $cnd->profile = $profile;
            foreach (\XLite\Core\Database::getRepo('XLite\Model\Order')->search($cnd) as $order) {
                $orderState = $order->getPaymentStatusCode();
        if ($orderState == \XLite\Model\Order\Status\Payment::STATUS_REFUNDED)
            { $discountState = false; break; }
                if ($orderState == \XLite\Model\Order\Status\Payment::STATUS_PAID)
            $discountState = true;
            }
        }

        return $discountState;
    }



2. Вычисляем скидку в зависимости от количества товаров:

    public function calculate()
    {

    $quantity = 0;
    $surcharge = 0;
    $pastaPrice = 700;
    $pastaOptDiscount = 300;

        foreach ($this->getOrderItems() as $item)
        {
                if (floor($item->getItemPrice()) == $pastaPrice)
                    $quantity += $item->getAmount();
        }

    if ($quantity < 3) $surcharge = 0;
    if ($quantity > 2 && $quantity < 6) $surcharge = $pastaPrice;
    if ($quantity == 6) $surcharge = 2*$pastaPrice;
    if ($quantity > 6)
    {
          if (round($quantity/6,0) != round($quantity/6,1)) $surcharge = 2*$pastaPrice;
          else $surcharge = $quantity*$pastaOptDiscount;
    }

    if ($this->has10Discount())
            $surcharge += floor(($this->getOrder()->getSubtotal() - $surcharge)/ 10);

        if ($surcharge <= 0) {
            $surcharge = null;
        }  else {
            $surcharge = $this->addOrderSurcharge($this->code, $surcharge * -1);
        }

        return $surcharge;
    }


Куда и как положить этот код - смотрите на офф сайте по ссылке http://kb.x-cart.com/display/XDD/Creating+global+discount, я же отмечу, что скидка считается не на товар, а общая, то есть при покупке трех товаров по 700 рублей сумма будет 2100 и сумма скидки - 700. Если это повторный заказ - то скидка будет уже 840...

Обидно, что за прошедшее время сам забыл, как активировать этот код (если это вообще надо)... Ну понадобится - вспомню, а впредь буду писать в блог сразу, он же именно для этого...

понедельник, 27 апреля 2015 г.

И снова о Powered by X-Cart

Строка "Powered by X-Cart" (на самом деле целиком оно звучит вот так: Powered by X-Cart eCommerce solution - первое что все почему то хотят удалить. Оставлю в покое совесть удаляющего, ибо не возбраняется разработчиками X-Cart, а значит можно.

Раньше (до 5.2) это удалялось или стилями (чаще всего) или в модуле (visible = false, по моему..), или в шаблоне (реже всего, потому что чайнеку пришлось бы разобраться с ними, что само по себе задача)

Лично я "очищался" в моем модуле, отвечающем за коррекцию отображения скина, вот так:

<?php
namespace XLite\Module\DAG\MySkin\View;
                                         
class PoweredBy extends \XLite\View\PoweredBy implements \XLite\Base\IDecorator
{
    protected function getPhrase()
    {
        return '';
    }
}


Апдейт до 5.2 ОК, перегружаю магазин, ОП! "Powered by X-Cart" появилось.

Да, смотрю шаблон (/skins/default/en/powered_by.tpl) - вот оно, прям жостко зашито:

<div class="powered-by">
...
  <p class="powered-by-label">Powered by X-Cart {getMessage():h}</p>
</div>


а getMessage():h = getPhrase() из кода выше.

Убрать всё это можно, воспользовавшись инструкцией на офф сайте: http://kb.x-cart.com/pages/viewpage.action?pageId=6389847 

 Insert the following CSS code into the field below:

.powered-by .powered-by-label {
    display: none;
}


Мне эта затея не нравится, поэтому копируем powered_by.tpl из дефаултного шаблона в наш, убираем из него строку <p class="powered-by-label">,  за ненадобностью (теперь) убираем из модуля файл с getPhrase(), пересобираем магазин...

Все работает. и теперь чего бы не добавляли разработчики в футер - буду надеяться, что у меня это не скоро отобразится.

Обновление X-Cart до 5.2.3

Хоть и затянулось внедрение моего магазина, а обновлять его надо. И вот сегодня проделал оное  с версии 5.1.15 - на 5.2.3

Обновление установилось приятно беспроблемно, единственное - пришлось отключить модуль Яндекс Метрики, которое еще перед обновлением заругалось... уже не помню как, ну мне проще его установить заново, благо реально то сайт еще не работал...

Еще выяснилось, что мои модули - отключены.И включаться не хотят. Ну тут все просто - после обновления движка меняем в их Main.php
    
     public static function getMajorVersion()
    {
        return '5.2';
    }

и в базе для этих модулей апдейтим:

UPDATE `xc5_modules` SET `majorVersion` = '5.2' WHERE `xc5_modules`.`moduleID` = ваш ID модуля

Включаю модули, один включается, а модуль скидок ругается:

Unknown column type "uinteger" requested. 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...

Забавно. Это у меня в модуле использовалась (точнее создавалась, до реального использования руки не дошли) моя таблица, и одно из полей имело тип uinteger. Больше такой тип не поддерживается? Меняю тип

    /**
     * Unique ID
     *
     * @var integer
     *
     * @Id
     * @GeneratedValue (strategy="AUTO")
     * @Column         (type="integer")
     */



Все ОК, модуль включается.


Все обновление заняло минут 10... Имхо, это по божески!
Иду в Маркетплейс, нахожу Yandex Metrika (надо же ее вернуть после обновления) - йопт! а оно уже $4.99 стоит! йопт... не, я конечно понимаю, что все это дело хозяйское, но.... Хочу дам, хочу отберу обратно - это не дело.
Посмотрел код модуля Yandex Metrika, который был бесплатен в 5.1 - там на 90% стандартный main.php плюс тоже стандартный JS код метрики. Поскольку мне продавать модуль не надо (а значит не нужен и ввод - сохранение ID счетчика) написание своего модуля "по мотивам" заняло минут 15 :)