Использование Smarty 3, Code Igniter 2 и HMVC вместе с наследованием Smarty?

Я использую Code Igniter, библиотеку HMVC и Smarty с этой библиотекой.

Smarty работает нормально по умолчанию, однако, если я пытаюсь использовать функцию наследования smarty ({extends file="master.tpl"}) тогда мы столкнемся с проблемой.

Функция extends не ищет в папке представлений модуля расширенный файл (в приведенном выше случае master.tpl), вместо этого он выглядит только в application/views/ папку и выдает ошибку, если не может ее найти.

Я мог бы добавить APPPATH."modules/smartytest/views" к $config['template_directory'] массив в конфигурационном файле smarty. но это выдает ошибку для каждого элемента в массиве, который он сначала проверяет на наличие файла. filemtime(): stat failed for application/views/master.tpl

и это имеет дополнительную проблему: если у меня есть три модуля, весь массив и все модули имеют master.tpl, то независимо от того, какой модуль я называю расширением из него, будет загружаться первый найденный.

Итак, есть ли способ заставить функцию расширения smarty хорошо работать с модулями HMVC?

2 ответа

Решение

Ах, нашел рабочее решение,

в My_Parser.php отредактируйте блок в строке 30, чтобы он читал:

// Modular Separation / Modular Extensions has been detected
if (method_exists( $this->CI->router, 'fetch_module' ))
{
    $this->_module  = $this->CI->router->fetch_module();
    //add the current module view folder as a template directory
    if ($this->_module !== '')
        $this->CI->smarty->addTemplateDir(APPPATH."modules/".$this->_module.'/views');
}

Единственным недостатком этого метода является то, что smarty будет искать в вашей папке application/views перед тем, как папка модулей просматривает. если кто-то знает решение этого вопроса, это было бы фантастически.

Проблема в том, что CI не проверяет, error_reporting() возвращает 0, потому что Smarty использует оператор @ control: поэтому добавьте строку вверху функции "_exception_handler":

if (error_reporting() == 0) return;

В файл "Common.php" в функции "_exception_handler" (строка 469) или создайте собственную функцию с тем же именем перед вызовом "CodeIgniter.php" в файле index.php.

Лучший!

Другие вопросы по тегам