为什么我对Magento Block的getTemplateFile方法的调用返回null?

时间:2012-07-02 21:20:23

标签: php oop magento

当我在索引控制器中使用以下代码时

<?php
class Nofrills_Booklayout_IndexController  extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $block = new Mage_Core_Block_Template();        
        $block->setTemplate('helloworld.phtml');
        var_dump($block->getTemplateFile());
    }
}

我希望得到类似的结果

string 'frontend/base/default/template/helloworld.phtml' (length=47)

然而,在我的系统上,我得到了

null

我的系统有什么问题,它正在返回null来调用

<code>getTemplateFile</code>

我该如何自行调试?

在Magento 1.7.0.1上发生。

2 个答案:

答案 0 :(得分:1)

我调查了这个,我无法在新安装的1.7.0.1版本上重现该问题。这意味着您的系统配置有所不同。可能是一个文件权限的东西,可能是一些改变了Magento代码,可能是我不考虑的东西。

这意味着找出正在发生的事情的唯一方法是通过Magento如何确定模板路径的长期艰难调试。在正常的系统操作下,永远不会返回null。由于某种原因,你的系统是。我将在下面列出这种调用的正常调用堆栈。希望这能为您提供使系统运行所需的信息。

此外,在我们进入调用堆栈之前,您的继承链和/或模块块方法可能已被搞乱。 null值是在调用Varien_Object魔术设置器且未设置任何值时返回的值。检查您的Mage_Core_Block_Template课程是否还有getTemplateFile方法,以及

class Mage_Core_Block_Template extends Mage_Core_Block_Abstract

abstract class Mage_Core_Block_Abstract extends Varien_Object    

请记住下面的文件路径假设没有人在您的系统上放置类覆盖或重写

{/ 1}}方法在

中定义
getTemplatefile

您可以在设计包对象上看到这是#File: app/code/core/Mage/Core/Block/Template.php public function getTemplateFile() { $params = array('_relative'=>true); $area = $this->getArea(); if ($area) { $params['_area'] = $area; } $templateName = Mage::getDesign()->getTemplateFilename($this->getTemplate(), $params); return $templateName; } 的包装器。

getTemplateFilename

反过来又是#File: app/code/core/Mage/Core/Model/Design/Package.php public function getTemplateFilename($file, array $params=array()) { $params['_type'] = 'template'; return $this->getFilename($file, $params); }

的包装器
getFilename

反过来,这是对#File: app/code/core/Mage/Core/Model/Design/Package.php public function getFilename($file, array $params) { Varien_Profiler::start(__METHOD__); $this->updateParamDefaults($params); $result = $this->_fallback($file, $params, array( array(), array('_theme' => $this->getFallbackTheme()), array('_theme' => self::DEFAULT_THEME), )); Varien_Profiler::stop(__METHOD__); return $result; }

的调用
_fallback

#File: app/code/core/Mage/Core/Model/Design/Package.php protected function _fallback($file, array &$params, array $fallbackScheme = array(array())) { if ($this->_shouldFallback) { foreach ($fallbackScheme as $try) { $params = array_merge($params, $try); $filename = $this->validateFile($file, $params); if ($filename) { return $filename; } } $params['_package'] = self::BASE_PACKAGE; $params['_theme'] = self::DEFAULT_THEME; } return $this->_renderFilename($file, $params); }

_fallback method also calls the validateFile and _renderFilename methods.

validateFile已插入到混音中。

(如果您最终找到答案,请告诉我们)

答案 1 :(得分:1)

Vinai中指出original comment on the OP,此问题需要使用tarball进行故障排除。

Mage_Core_Block_Abstract 的类定义必须被加载,否则会输出有关include()或非对象操作的错误,或者可能没有输出完全取决于开发者模式。

应该注意getTemplateFile() was not defined直到Magento 1.4.1.0。最可能的问题是Mage_Core_Block_TemplateMage_Core_Model_Design_Package的错误版本,无论是在本地或社区代码池中修改,还是报告的Magento版本不正确。有用的输出如下:

public function indexAction()
{
    ini_set('display_errors',1);
    Mage::setIsDeveloperMode(true);

    $block = new Mage_Core_Block_Template();
    $block->setTemplate('helloworld.phtml');
    $debug = new ReflectionClass($block);

    echo Mage::getVersion();

    Zend_Debug::dump($debug->getFileName());
    Zend_Debug::dump($debug->getMethods());
}