2012-07-02 57 views
4

當我在索引控制器使用下面的代碼爲什麼我調用Magento塊的getTemplateFile方法返回null?

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

+1

奇怪的問題,我無法重現(嘗試了幾個版本)。你是否願意/能夠提供安裝和數據庫轉儲的焦油球? – Vinai

+0

我同意這很奇怪。我要求一個客戶,所以我沒有tarball。 http://www.pulsestorm.net/nofrills-layout-chapter-one#comment-574707059 –

回答

1

由於Vinai在他original comment on the OP表示,這個問題需要一個壓縮包來解決。

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()); 
} 
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  

請記住下面的文件路徑假設沒有人置於一個類重寫或您的系統

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_renderFilename方法的調用。

#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; 
}  

在此路徑的某處,您的空正被插入混合中。

(如果你最終找到答案,請讓我們知道)

相關問題