Использование 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.
Лучший!