Debugging Tips: Filename cannot be empty

November 21, 2014  |  No Comments  |  by Raj (MagePsycho)  |  Latest, Magento

Problem

You may have seen this kind of error frequently logged in your Magento log file var/log/system.log:

Warning: include(): Filename cannot be empty in /app/code/core/Mage/Core/Block/Template.php on line xxx

This error means Magento is trying to include a template block with an empty string set as it’s template.

Solution

In order to find which template file is missing, simply edit the code in Mage_Core_Block_Template::fetchView() as:

public function fetchView($fileName)
{
    ...
    try {
        $includeFilePath = realpath($this->_viewDir . DS . $fileName);
        if (strpos($includeFilePath, realpath($this->_viewDir)) === 0 || $this->_getAllowSymlinks()) {
            /* edit - start */
            if (!is_file($includeFilePath)) {
                Mage::log($fileName, null, 'missing-phtml.log', true);
            }
            /* edit - end */
            include $includeFilePath;
        } else {
            Mage::log('Not valid template file:'.$fileName, Zend_Log::CRIT, null, null, true);
        }

    } catch (Exception $e) {
        ob_get_clean();
        throw $e;
    }
    ...
}

You will see the missing .phtml filenames being logged. And search for that name in your layout xmls which will show you where it went wrong.
Happy Debugging!

Using get_defined_vars() for debugging local scope variables

May 8, 2013  |  2 Comments  |  by Raj (MagePsycho)  |  Latest, Magento

Suppose say, you want to debug variables in some observer method.
You can either log the each variable or simply dump it. But when you have many variables, debugging each variables can be an overhead task. For this purpose we can use PHP’s inbuilt function: get_defined_vars()
How to use it?
CODE:

//put this line at the top of your variable declarations
$vars = get_defined_vars();

// Now your regular stuffs goes here...
$foo = 'foo';
$bar = 'bar';
$data = $model->getData();

// Only stores all the variables defined in current scope
$vars = array_diff(get_defined_vars(), $vars);

//Now you can either dump
Zend_Debug::dump($vars);
//or keep in log
Mage::log($vars, null, 'var-debug.log', true)

This approach can be very handy in debugging any local scope variables. At least it provides an easier approach with clean code.