当我在索引控制器中使用以下代码时
<?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上发生。
答案 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_Template
或Mage_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());
}