gpt4 book ai didi

magento - 除了模块覆盖之外,还出现覆盖 block

转载 作者:行者123 更新时间:2023-12-02 18:26:44 25 4
gpt4 key购买 nike

Magento 1.4.1.1

回顾历史,app/code/core/Mage/GoogleAnalytics/Block/Ga.php 被复制到 app/code/local/Mage/GoogleAnalytics/Block/Ga。 php 并进行了更改,因此 protected function _toHtml() {}函数将在页面上生成正确的 Google Analytics 异步 javascript 条目。原始版本存在问题,无法正确向 Google 发布该网站的跟踪信息。这次重写功能齐全,达到了预期的结果。

为了清理问题,决定将这一更改模块化为本地命名空间模块。创建了以下文件...

apps/etc/modules/Chief_GoogleAnalytics.xml

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

apps/code/local/Chief/GoogleAnalytics/etc/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>

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

/**
* GoogleAnalitics Page Block
*
* @category Chief
* @package Chief_GoogleAnalytics
* @author Magento Core Team <core@magentocommerce.com>
*/
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 的旧库存垃圾代码。 Google Analytics 有一个布局 XML 文件,将其定义为在 after_body_start 中显示,因此可以正常工作。这是显示新 block 覆盖和旧 block 的重复。给出了什么?

<!-- 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 -->

加载该 block 的page.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(); return 位于最后,吐出两个 javascript,但与原始相反。

$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 -->

)

最佳答案

首先,看似迂腐的命名约定。当您将文件放入 local 时,这不是重写,而是代码池覆盖。当您创建自定义模块并使用 rewrite 节点时,这就是类重写。这是两个不同的操作,并且每个操作的行为都不同。这些差异就是您所看到的行为的原因。

当您使用类覆盖时,您是在说

Hey Magento, instead of including your class file for a Mage_GoogleAnalytics_Block_Ga, include mine instead

这完全取代了系统中原来的类。

当你使用类重写时,你是在说

Hey Magento, when you instantiate a googleanalytics/ga (Mage_GoogleAnalytics_Block_Ga) block object, instantiate the object from my class instead.

然后,通过让您的类扩展原始 Mage_GoogleAnalytics_Block_Ga 类,您将获得一个与原始对象行为相同的对象,并且您可以添加您的方法。但是,当您添加方法时,它们的父方法是原始 block ,这与覆盖不同。

第一步是删除本地代码池文件

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

听起来您已经完成了此操作。接下来,是您重写的类中的方法。当您调用 parent::_toHtml(); 方法

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

你告诉Magento“嘿,做原始对象会做的事情”。使用 block 和 _toHtml 方法,这意味着产生相同的输出。这就是为什么你会得到“旧股票垃圾代码”。 _toHtml 方法的约定是“无论返回什么字符串,都将作为 block 输出包含在内”。您的新代码也会被包含在内,因为您正在使用您的父方法知道的 addText 方法。

因此,如果您想在 block 重写中更改 _toHtml 的行为,您需要执行以下操作

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

通过首先调用父方法,您可以确保 block 从状态角度所做的任何事情仍然会发生( block 不应该这样做,但是,我们知道这是如何进行的)。然后,您返回字符串。

关于magento - 除了模块覆盖之外,还出现覆盖 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11179732/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com