2012-06-24 2 views
2

Magento 1.4.1.1Перезапись блок появляется в дополнение к модулю перезаписью

Назад в истории, приложение/код/​​ядро ​​/ Mage/GoogleAnalytics/Block/Ga.php был скопирован в приложение/код/​​местные /Mage/GoogleAnalytics/Block/Ga.php и были внесены изменения, поэтому функция protected function _toHtml() {} создала бы азартную запись JavaScript на Google Analytics. У оригинала были проблемы, которые не отправляли информацию отслеживания в Google правильно для этого веб-сайта. Этот переписать был полностью функциональным с желаемым результатом.

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

приложений/и т.д./модули/Chief_GoogleAnalytics.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Chief_GoogleAnalytics> 
      <active>true</active> 
      <codePool>local</codePool> 
     </Chief_GoogleAnalytics> 
    </modules> 
</config> 

приложения/код/​​местные/Главный/GoogleAnalytics/и т.д./config.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <Chief_GoogleAnalytics> 
      <version>0.1.0</version> 
     </Chief_GoogleAnalytics> 
    </modules> 
    <global> 
     <blocks> 
      <googleanalytics> 
       <rewrite> 
        <ga>Chief_GoogleAnalytics_Block_Ga</ga> 
       </rewrite> 
      </googleanalytics> 
     </blocks> 
    </global> 
</config> 

приложение/код/​​местные/Главный/GoogleAnalytics/Block/Ga.php

/** 
* GoogleAnalitics Page Block 
* 
* @category Chief 
* @package Chief_GoogleAnalytics 
* @author  Magento Core Team <[email protected]> 
*/ 
class Chief_GoogleAnalytics_Block_Ga extends Mage_GoogleAnalytics_Block_Ga 
{ 
    /** 
    * Prepare and return block's html output 
    * 
    * @return string 
    */ 
    protected function _toHtml() 
    { 
     if (!Mage::getStoreConfigFlag('google/analytics/active')) { 
      return ''; 
     } 

     $this->addText(' 
<!-- BEGIN GOOGLE ANALYTICS CODE --> 
<script type="text/javascript"> 
//<![CDATA[ 
    var _gaq = _gaq || []; 
    _gaq.push(["_setAccount", "' . $this->getAccount() . '"]); 
    _gaq.push(["_trackPageview", "'.$this->getPageName().'"]); 

    (function() { 
     var ga = document.createElement(\'script\'); ga.type = \'text/javascript\'; ga.async = true; 
     ga.src = (\'https:\' == document.location.protocol ? \'https://ssl\' : \'http://www\') + \'.google-analytics.com/ga.js\'; 
     var s = document.getElementsByTagName(\'script\')[0]; s.parentNode.insertBefore(ga, s); 
    })(); 
//]]> 
</script> 
<!-- END GOOGLE ANALYTICS CODE --> 
     '); 

     $this->addText($this->getQuoteOrdersHtml()); 

     if ($this->getGoogleCheckout()) { 
      $protocol = Mage::app()->getStore()->isCurrentlySecure() ? 'https' : 'http'; 
      $this->addText('<script src="'.$protocol.'://checkout.google.com/files/digital/ga_post.js" type="text/javascript"></script>'); 
     } 

     return parent::_toHtml(); 
    } 
} 

Вместо ввода одного скорректированного сценария, как был нормальным, когда он шел от app/code/local/Mage/GoogleAnalytics/Block/Ga.php, теперь я получаю дублирование. Сначала начинается перебор Chief_GoogleAnalytics Block, за которым следует старый код нежелательной почты от app/code/core/Mage/GoogleAnalytics/Block/Ga.php. Существует XML-файл одного формата для Google Analytics, который определяет его для отображения в after_body_start, так что он работает. Вот дублирование, в котором отображаются новый блок и старый блок. Что дает?

<!-- BEGIN GOOGLE ANALYTICS CODE --> 
<script type="text/javascript"> 
//<![CDATA[ 
    var _gaq = _gaq || []; 
    _gaq.push(["_setAccount", "UA-xxxxxx-x"]); 
    _gaq.push(["_trackPageview", "/"]); 

    (function() { 
     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 
    })(); 
//]]> 
</script> 
<!-- END GOOGLE ANALYTICS CODE --> 

<!-- BEGIN GOOGLE ANALYTICS CODE --> 
<script type="text/javascript"> 
//<![CDATA[ 
    (function() { 
     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
     (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); 
    })(); 

    var _gaq = _gaq || []; 
    _gaq.push(["_setAccount", "UA-xxxxxx-x"]); 
    _gaq.push(["_trackPageview", "/"]); 
//]]> 
</script> 
<!-- END GOOGLE ANALYTICS CODE --> 

pages.phtml записи, которые загружают блок.

<?php echo $this->getChildHtml('after_body_start') ?> 

расположение googleanalytics.xml

<layout version="0.1.0"> 
    <default> 
     <!-- Mage_GoogleAnalytics --> 
     <reference name="after_body_start"> 
      <block type="googleanalytics/ga" name="google_analytics" as="google_analytics" /> 
     </reference> 
    </default> 
</layout> 

Добавлено судебно-медицинской экспертизы по использованиюMage::Log()с$this->getData()в стратегически важных местах Поскольку мы передаем объект массива вокруг здесь, это немного сложнее, чем работать со строкой.

Начало _toHtml функции()

2012-06-24T21:02:04+00:00 DEBUG (7): Array 
(
    [type] => googleanalytics/ga 
    [module_name] => Chief_GoogleAnalytics 
) 

Сразу причиной его загрузкиparent::_toHtml();с$original_output =parent::_toHtml

2012-06-24T21:02:04+00:00 DEBUG (7): Array 
(
    [type] => googleanalytics/ga 
    [module_name] => Chief_GoogleAnalytics 
    [account] => UA-xxxxxx-x 
    [page_name] =>/
    [text] => 
<!-- BEGIN GOOGLE ANALYTICS CODE --> 
<script type="text/javascript"> 
//<![CDATA[ 
    (function() { 
     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
     (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga); 
    })(); 

    var _gaq = _gaq || []; 
    _gaq.push(["_setAccount", "UA-xxxxxx-x"]); 
    _gaq.push(["_trackPageview", "/"]); 
//]]> 
</script> 
<!-- END GOOGLE ANALYTICS CODE --> 

) 

Чтобы предотвратить это превращается в; tldr, регистрация $this->getData(); где возвращение было в конце, выплевывает оба javascripts, но в обратная сторона оригинала.

$this->getData(); без ссылки parent::_toHtml передает следующее, что мы хотим для возвращаемого объекта. Один скрипт с соответствующими идентификаторами ...

2012-06-24T21:06:24+00:00 DEBUG (7): Array 
(
    [type] => googleanalytics/ga 
    [module_name] => Chief_GoogleAnalytics 
    [account] => UA-xxxxxx-x 
    [page_name] => /aircraft 
    [text] => 
<!-- BEGIN GOOGLE ANALYTICS CODE --> 
<script type="text/javascript"> 
//<![CDATA[ 
    var _gaq = _gaq || []; 
    _gaq.push(["_setAccount", "UA-xxxxxx-x"]); 
    _gaq.push(["_trackPageview", "/aircraft"]); 

    (function() { 
     var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; 
     ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; 
     var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); 
    })(); 
//]]> 
</script> 
<!-- END GOOGLE ANALYTICS CODE --> 

) 
+0

Бонусные баллы за указание конкретного номера версии, так как это было бы не так легко решить без него. – benmarks

+0

Спасибо, я нахожу, что это помогает совсем немного. Ничто не напоминает ответ на вопрос о MagentoCommerce, чтобы найти их на 1.2.x.x, и поэтому ваш ответ не имеет значения. ; ^) –

ответ

6

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

При использовании класса переопределение, вы говорите

Эй Magento, вместо того, чтобы в том числе файл класса для Mage_GoogleAnalytics_Block_Ga, включают в шахту вместо

Это полностью заменяет исходный класс в система.

При использовании класса рерайт, вы говорите

Эй Magento, при создании экземпляра в googleanalytics/ga (Mage_GoogleAnalytics_Block_Ga) объект блок, экземпляр объекта из моего класса вместо.

Тогда вы, добавив свой класс в класс Mage_GoogleAnalytics_Block_Ga, имеют объект, который ведет себя так же, как и исходный объект, и вы можете добавить свои методы. Однако, когда вы добавляете свои методы, их родительский метод представляет собой блок оригинала, который отличается от переопределения.

Шаг один будет удаление локальной файловой код бассейн

app/code/local/Mage/GoogleAnalytics/Block/Ga.php 

Это звучит, как вы уже сделали это.Далее, в вашем переписанном классе есть метод. При вызове метода parent::_toHtml();

protected function _toHtml() 
{ 
    //... your stuff here ... 
    return parent::_toHtml(); 
} 

ты говорил Magento «Эй, делать все, что исходный объект сделал бы». С блоками и методом _toHtml это означает получение одного и того же выхода. Вот почему вы получаете «старый код нежелательной почты». Контракт для метода _toHtml «любая строка, которая возвращается, будет включена в качестве выходного блока». Ваш новый код также включен, потому что вы используете метод addText, о котором знает ваш родительский метод.

Итак, если вы хотите изменить поведение _toHtml в блоке переписывание, что вам нужно сделать что-то вроде этого

protected function _toHtml() 
{ 
    $original_output = parent::_toHtml(); 
    $string = ''; 
    //... your code here which ultimately generates your output 
    //and places it in $string 
    return $string; 
} 

Вызвав родительский метод первым, вы убедитесь, что все, что блок делает из (что блок не должен делать, но, хорошо, мы знаем, как это происходит). Затем вы возвращаете свою строку.

+0

Не ссылайтесь на 'parent :: _ toHtml()' в функции и 'return $ this-> getData ('text');' похоже, делает это. Благодарим вас за повторную разницу между переопределением модуля и переписыванием. Я полностью понимаю, что происходит сейчас. Мне нужно было бы провести дополнительное тестирование через тележку, чтобы убедиться, что оно регистрирует информацию о заказе клиента, так как я не называю это, как объяснено, но, как указано в моем ответе Бен-Марксу, я перенес его в свой текущий логический вывод для образования, поскольку новая версия, которую я обновляю, была обновлена, чтобы сделать модуль ненужным. Спасибо! –

2

DDX: делает закомментировав <block type="googleanalytics/ga" ... /> код из googleanalytics.xml причины всех выходных исчезнуть?

Предполагая, что локальный файл переопределения кода был удален, проблема, безусловно, равна return parent::_toHtml(). Версия CE 1.4.1.1 родительского (основного) метода использует addText(), который получен из Mage_Core_Block_Text->_toHtml(). addText() добавит контент в _data['text'], а затем метод вернет его во время рендеринга. Таким образом, ваше переопределение устанавливает некоторый строковый контент в _data['text'], а затем, когда вы вызываете родительский метод, он добавляет его до _data['text'], а затем вызывает Mage_Core_Block_Text->_toHtml(), который просто возвращает значение _data['text'].

Обычно рекомендуется вызвать переопределенный метод, но это случай, когда он не будет работать. Учитывая, что этот метод был изменен в 1.4.2.0, чтобы просто вернуть строку из локальной переменной, вы должны быть в порядке, чтобы игнорировать родителя. Если это не сработает по какой-то причудливой причине, можно было бы использовать макет XML для замены экземпляра основного блока другим.

+0

Да, комментируя строку в макете, удаляются оба блока. И app/code/local/Mage/GoogleApps/Block/Ga.php был удален до установки модуля Chief_GoogleAnalytics. В рекомендации игнорировать родителя вы имеете в виду комментарий? // возвращаем parent :: _ toHtml(); ' –

+0

Да. Вам нужно будет вернуть текст из вашего метода, поэтому вы должны дублировать логику из ['Mage_Core_Block_Text'] (http://svn.magentocommerce.com/source/branches/1.7/app/code/core/Mage/Core /Block/Text.php) '-> _ toHtml()' – benmarks

+1

Я рассмотрел различия в коде между 1.4.1.1 и 1.4.2.0, и это определенно перешло к переработке основного кода. Код Google Analytics вставляется как первый элемент после тега body, где он должен находиться в более поздних версиях. Поскольку упражнение является очисткой до обновления до версии 1.6.2.0+, причина для этого существующего существующего модуля перестает существовать, и для целевой версии выполняется любая полировка функции GA. По крайней мере, я знаю, что сама модуляция работает. Спасибо за помощь! –

Смежные вопросы