Создание модуля контроля в Magento.

В этой статье мы постараемся объяснить, как можно создать модуль Magento, который будет фиксировать информацию от сторонних источников (например, внешнего веб-сайта или новостной рассылки по электронной почте) и включать HTML скрипты для проверки успешности преобразований на странице.

Мы будем рассматривать следующие темы:

  • Сбор данных об идентификаторах ресурса (URI);
  • Сохранение и извлечение значений из куки-файлов;
  • Проверка успешности добавления пользовательского контента на страницу;
  • Добавление модуля конфигурации в панель администрирования Magento;
  • Создание общедоступного модуля без закодированных установок.

Как всегда, этот модуль будет создан таким образом, что ни один из основных файлов не будет изменен. Это позволит сохранить его портативность и основные преимущества характеристик Magento.

Перед тем как мы начнем.

Это руководство предполагает, что вы уже знакомы с основами создания модуля Magento, и ознакомлены с вопросами, затронутыми в нашей предыдущей статье о Компоновке Magento. Так что может быть стоит немного остановиться на данной информации, для тех читателей, которые еще не проработали весь материал.

Мы будем добавлять любые специфические параметры веб-сайта, как настраиваемые установки в панель администрирования Magento. Как следствие, наш модуль будет представлять собой «объединение модулей» код которого будет принадлежать файлу app/code/community. Идея заключается в том, что мы можем поместить это объединение модулей в любой объект Magento, и никакие модификации кода не будут нуждаться в полной работоспособности.

Для начала, создайте следующее структурное дерево с пустыми файлами, которые можно будет заполнить позднее.

app (приложение)
  - code (код)
      - community (объединение)
          - SmashingMagazine
              - Affiliate (структурная единица)
                  - Block (блок)
                      - Conversion.php
                  - Model (модель)
                      - Observer.php
                  - etc (и так далее)
                      - config.xml
  - design (проект)
      - frontend (внешний интерфейс)
          - base (основная часть)
              - default (установки по умолчанию)
                  - layout (компоновка)
                      - smashingmagazine_affiliate.xml
                  - template (шаблон)
                      - smashingmagazine_affiliate
                          - conversion.phtml

  - etc (и так далее)
      - modules (модули)
          - SmashingMagazine_Affiliate.xml

Мы уже можем организовать заполнение информацией файла SmashingMagazine_Affiliate.xml:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <SmashingMagazine_Affiliate>
            <active>true</active>
            <codePool>community</codePool>
        </SmashingMagazine_Affiliate>
    </modules>
</config>

Сбор данных о структурных направлениях.

Первой задачей отслеживания структурных процессов, является сбор данных о направлениях, которые обычно предоставлены в виде $_GET параметров URI из сторонних веб-сайтов или новостных рассылок. Например smashingmagazine.com/?utm_source=some_affiliate_id где some_affiliate является идентификатором дочернего подразделения, которое мы будем награждать, если клиент совершит приобретение.

Определение событий блока наблюдений.

Мы хотим, чтобы наши дочерние подразделения имели возможность ссылаться на любую страницу нашего сайта, для того, чтобы клиенты могли перейти непосредственно к интересующему их продукту или услуге. Поэтому необходимо организовать метод проверки для  $_GET параметров на каждой странице. Как уже было принято, мы не будем изменять код в основных файлах Magento, так как хотим сохранить модуль портативным, с максимально возможным уровнем базовых функций. Мы будем использовать команду event observer.

Существует одно событие, которое обрабатывается на каждой странице controller_front_init_before, поэтому давайте создадим собственный файл config.xml с функцией observer для этого события.

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <SmashingMagazine_Affiliate>
            <version>0.0.1</version>
        </SmashingMagazine_Affiliate>
    </modules>
    <global>
        <models>
            <smashingmagazine_affiliate>
        <class>SmashingMagazine_Affiliate_Model</class>
            </smashingmagazine_affiliate>
        </models>
        <events>
            <controller_front_init_before>
                <observers>
                    <smashingmagazine_affiliate>
         <class>smashingmagazine_affiliate/observer</class>
                        <method>captureReferral</method>
                        <type>singleton</type>
                    </smashingmagazine_affiliate >
                </observers>
            </controller_front_init_before>
        </events>
    </global>
</config>

Теперь при каждой загрузке страницы, будет вызываться наша процедура SmashingMagazine_Affiliate_Model_Observer::captureReferral(), давайте добавим в файл Observer.php следующее содержимое:

<?php
class SmashingMagazine_Affiliate_Model_Observer
{
public function captureReferral(Varien_Event_Observer $observer)
    {
// here we add the logic to capture the referring affiliate ID
    }
}

Сбор дочерних идентификаторов.

Событие controller_front_init_before осуществляется из основной процедуры Magento Mage_Core_Controller_Varien_Front::init(), и включает в себя ссылку на тот же класс, что и в следующем фрагменте кода из файла app/code/core/Mage/Core/Controller/Varien/Front.php:

Mage::dispatchEvent(
    'controller_front_init_before',
    array('front' => $this)
);

Можно получить доступ к экземпляру Mage_Core_Controller_Varien_Front, включив следующий код в событие event observer:

<?php
class SmashingMagazine_Affiliate_Model_Observer
{
public function captureReferral(Varien_Event_Observer $observer)
    {
        $frontController = $observer->getEvent()->getFront();
    }
}

Команда controller отвечает за синтаксический анализ URI. Теперь у нас есть доступ к соответствующему объекту, и мы должны определить существует ли наш $_GET параметр:

<?php
class SmashingMagazine_Affiliate_Model_Observer
{
public function captureReferral(Varien_Event_Observer $observer)
    {
        $frontController = $observer->getEvent()->getFront();

        $utmSource = $frontController->getRequest()
            ->getParam('utm_source', false);

        if ($utmSource) {
            // here we will save the referrer affiliate ID
        }
    }
}

В приведенном выше коде, мы вызываем getRequest(), чтобы получить Mage_Core_Controller_Request_Http например, от controller, который будет содержать всю требуемую информацию о текущем запросе URI, включая $_POST или $_GET параметры. Нас интересует utm_source в параметре $_GET, и мы можем получить его значение из процедуры getParam().

Переменная $utmSource теперь будет содержать ссылку на дочерний идентификатор.

Сохранение дочернего идентификатора.

Теперь нам нужно сохранить значение переменной $utmSource, для того, чтобы мы могли вознаградить свой филиал за совершение клиентом покупки. Есть несколько способов сделать это, но в этом уроке мы будем использовать простую переменную $_COOKIE. Magento имеет встроенную функциональность для работы с cookie , так что все будет очень просто:

<?php
class SmashingMagazine_Affiliate_Model_Observer
{
const COOKIE_KEY_SOURCE = 'smashingmagazine_affiliate_source';

public function captureReferral(Varien_Event_Observer $observer)
    {
        $frontController = $observer->getEvent()->getFront();

        $utmSource = $frontController->getRequest()
            ->getParam('utm_source', false);

        if ($utmSource) {
            Mage::getModel('core/cookie')->set(
                self::COOKIE_KEY_SOURCE,
                $utmSource,
                $this->_getCookieLifetime()
            );
        }
    }

    protected function _getCookieLifetime()
    {
        $days = 30;

        // convert to seconds
        return (int)86400 * $days;
    }
}

Мы инициализировали новую постоянную COOKIE_KEY_SOURCE, потому что мы будет ссылаться на это же значение из другого класса. При необходимости вызова значения из разных мест, появляется удобная возможность использовать постоянную. Таким образом, мы сводим работу над улучшением внутренней структуры программного кода (рефакторинг) к минимуму, ведь уменьшается число значений, которые когда-нибудь понадобится изменить. Мы также инициализировали новый защищенный метод, _getCookieLifetime(), для установления величины времени жизни cookie строго на 30 дней.

Уведомление об изменениях.

На данный момент, вся информация от партнерского идентификатора хранится в файле cookie. Давайте предположим, что клиент добавил некоторые продукты в корзину, завершил процесс проверки и сейчас находится на странице оплаты. Это случай, когда большинство партнерских схем требуют определенного уведомления, что справочные данные из каталога преобразованы в заказ. Как правило, это достигается путем активации фрагментов JavaScript кода или крошечного изображения в нижней части страницы.

Есть, конечно, и другие способы обновления партнерских модулей, например, через серверные вызовы API, которые могут быть сделаны с помощью команды event observers. Но в этом уроке мы будем использовать макет Magento для того, чтобы отобразить пользовательский выбор в нижней части страницы.

Мы должны обновить файл config.xml чтобы обслуживать blocks и обновить макет:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <SmashingMagazine_Affiliate>
            <version>0.0.1</version>
        </SmashingMagazine_Affiliate>
    </modules>
    <global>
        <blocks>
            <smashingmagazine_affiliate>
                <class>SmashingMagazine_Affiliate_Block</class>
            </smashingmagazine_affiliate>
        </blocks>
        <models>
            <smashingmagazine_affiliate>
                <class>SmashingMagazine_Affiliate_Model</class>
            </smashingmagazine_affiliate>
        </models>
        <events>
            <controller_front_init_before>
                <observers>
                    <smashingmagazine_affiliate>
                 <class>smashingmagazine_affiliate/observer</class>
                        <method>captureReferral</method>
                        <type>singleton</type>
                    </smashingmagazine_affiliate >
                </observers>
            </controller_front_init_before>
        </events>
    </global>
    <frontend>
        <layout>
            <updates>
                <smashingmagazine_affiliate
                         module="SmashingMagazine_Affiliate">
                    <file>smashingmagazine_affiliate.xml</file>
                </smashingmagazine_affiliate>
            </updates>
        </layout>
    </frontend>
</config>

Добавление компоновки нового файла.

Мы заинтересованы в успешном выполнении команды onepage_checkout_success, так как именно эта команда отображает успешность процедуры оплаты. Давайте создадим новый макет файла:

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <checkout_onepage_success>
        <reference name="before_body_end">
            <block type="smashingmagazine_affiliate/conversion"
     name="smashingmagazine_affiliate_conversion"
     template="smashingmagazine_affiliate/conversion.phtml" />
        </reference>
    </checkout_onepage_success>
</layout>

Добавление шаблона нового файла.

Содержимое файла conversion.phtml будет зависеть от требований конкретного партнерского модуля. В данном примере мы будем использовать общую форму, которая включает в себя одно пиксельное изображение с динамическим отображением информации о торговце и партнерском идентификаторе:

<img
src="http://media.smashingmagazine.com/themes/smashingv4/images/logo.png
    	?merchant_id=<?php echo $this->getMerchantId() ?>
    	&affiliate_id=<?php echo $this->getAffiliateId() ?>"
    width="1"
    height="1"
/>

Создание пользовательского блока.

Теперь нам нужно создать новый файл block для заполнения динамических данных в нашем шаблоне:

<?php
class SmashingMagazine_Affiliate_Block_Conversion
    extends Mage_Core_Block_Template
{
    public function getMerchantId()
    {
        return '12345';
    }

    public function getAffiliateId()
    {
        return Mage::getModel('core/cookie')->get(
 SmashingMagazine_Affiliate_Model_Observer::COOKIE_KEY_SOURCE
        );
    }
}

Добавление элементов в панель администриро …

Если вы хотите прочитать полностью статью, посетите сайт наших спонсоров

Comments are closed.