4

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

<?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 上。

4

2 回答 2

1

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

这意味着要弄清楚发生了什么,唯一的方法是通过 Magento 如何确定模板路径的漫长而艰难的调试过程。在正常系统操作下,这永远不会返回 null。出于某种原因,在您的系统上是这样。我将在下面概述此类调用的正常调用堆栈。希望这将为您提供使系统运行所需的信息。

此外,在我们进入调用堆栈之前,您的继承链和/或模板块方法可能已经被弄乱了。该null值是Varien_Object调用 a 的魔法设置器但未设置任何值时返回的值。检查您的Mage_Core_Block_Template课程是否仍然具有它的getTemplateFile方法,并且

class Mage_Core_Block_Template extends Mage_Core_Block_Abstract

abstract class Mage_Core_Block_Abstract extends Varien_Object    

请记住,下面的文件路径假定没有人在系统上的某个位置放置类覆盖或重写

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.

#File: app/code/core/Mage/Core/Model/Design/Package.php    
public function validateFile($file, array $params)
{
    $fileName = $this->_renderFilename($file, $params);
    $testFile = (empty($params['_relative']) ? '' : Mage::getBaseDir('design') . DS) . $fileName;
    if (!file_exists($testFile)) {
        return false;
    }
    return $fileName;
}

...

protected function _renderFilename($file, array $params)
{
    switch ($params['_type']) {
        case 'skin':
            $dir = $this->getSkinBaseDir($params);
            break;

        case 'locale':
            $dir = $this->getLocaleBasedir($params);
            break;

        default:
            $dir = $this->getBaseDir($params);
            break;
    }
    return $dir . DS . $file;
}    

Somewhere along this path your null正在被插入到混合中。

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

于 2012-07-02T21:21:40.297 回答
1

正如Vinai在他对 OP 的原始评论中指出的那样,这个问题需要一个 tarball 来解决。

Mage_Core_Block_Abstract 必须加载的类定义,否则将输出有关include()或非对象操作的错误,或者可能根本没有输出,具体取决于开发人员模式。

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

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());
}
于 2012-07-03T12:03:51.700 回答