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>

または、どうすればこれを自分でデバッグできますか?

Magento1.7.0.1で発生しています。

4

2 に答える 2

1

これを調べたところ、新しくインストールしたバージョンの1.7.0.1では問題を再現できませんでした。これは、システムの構成に何か違いがあることを意味します。おそらくファイルパーミッションのこと、おそらくいくつかの変更されたMagentoコード、おそらく私が考慮していないことです。

これは、何が起こっているのかを理解するために残された唯一の方法は、Magentoがテンプレートへのパスを決定する方法を介した長いハードデバッグスローグであることを意味します。通常のシステム操作では、これがnullを返すことはありません。あなたのシステムに何らかの理由でそれはあります。このような呼び出しの通常の呼び出しスタックの概要を以下に示します。うまくいけば、それはあなたがあなたのシステムを操作可能にするために必要な情報をあなたに与えるでしょう。

また、呼び出しスタックに到達する前に、継承チェーンやテンプレートブロックメソッドが混乱している可能性があります。値は、マジックセッターが呼び出され、値が設定されていない場合nullに返される値です。あなたのクラスがまだそのメソッドを持っていることVarien_Objectを確認してくださいMage_Core_Block_TemplategetTemplateFile

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

The_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()されるか、開発者モードによってはまったく出力されない可能性があります。

Magento1.4.1.0までgetTemplateFile()定義されていなかったことに注意してください。その場合、最も可能性の高い問題は、ローカルまたはコミュニティのコードプールに変更されたものとして存在するかどうかにかかわらず、またはの誤ったバージョン、または報告されている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 に答える