Я использую Smarty Template Engine (http://smarty.net) на сайте, но у меня есть дополнительные, настраиваемые функции для обработки задач компиляции шаблонов.
Чтобы иметь возможность обновлять файлы инфраструктуры Smarty (например, /smarty/Smarty.class.php) и не нужно копировать и вставлять мою пользовательскую функцию в класс внутри Smarty.class.php, я подумал: «эй, давайте просто сделаем мой собственный класс и расширить класс Smarty! » Тем не менее, я не могу заставить это работать и буду признателен за любые полезные советы 🙂
Файл стороннего поставщика и класс, который я не хочу трогать:
class Smarty {
// various vars declarations
public function __construct() {
// ...
}
function _compile_source($resource_name, &$source_content, &$compiled_content, $cache_include_path=null) {
// magic...
$smarty_compiler = new $this->compiler_class;
// more magic...
}
// more class methods declarations
}
Другой файл и класс сторонних поставщиков, который я не хочу трогать:
class Smarty_Compiler extends Smarty {
// various vars and methods declarations...
function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
$this->_trigger_fatal_error("syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
}
// more various methods declarations...
}
Мой пользовательский включаемый файл Smarty с новыми подклассами и экземпляром объекта $ smarty:
/**
* My extensions for the Smarty Class
*/
Class MySmarty extends Smarty {
// different custom vars declarations
/**
* My ADDITIONAL custom Template Compile function
*/
public function compile ($template, &$errors) {
// custom code
}
}
/**
* My extensions for the Smarty_Compiler Class
*/
Class MySmarty_Compiler extends Smarty {
// different custom vars declarations
var $_manual_compiler_errors = array();
/**
* My REPLACEMENT _syntax_error function
*/
public function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
global $_manual_compiler_errors;
if ($_manual_compiler_errors) {
array_push($_manual_compiler_errors, "smarty syntax error on line ".$this->_current_line_no.": $error_msg");
}else{
$this->_trigger_fatal_error("smarty syntax error: $error_msg", $this->_current_file, $this->_current_line_no, $file, $line, $error_type);
}
}
}
// Instantiate Smarty
include_once($_SERVER['DOCUMENT_ROOT'].'/smartylib/Smarty.class.php');
$smarty = new Smarty;
$smarty->debugging = true;
$smarty->force_compile = false;
Хорошо, я надеюсь, что мои намерения ясны из приведенных выше фрагментов кода: Я хочу объект $ умник содержать также
И потому что я используюпродолжается«для моего объявления 2 классов я думал, что это должно просто работать, используя:
$smarty->compile(...);
$smarty->_syntax_error(...);
Но, к сожалению, этого не происходит 🙁 Я МОГУ добавить свои пользовательские функции непосредственно в класс Smarty внутри Smarty.class.php — но это, очевидно, сделает файл не подлежащим обновлению.
Чего мне не хватает, используя мои 2 подкласса, расширяющие класс Smarty, и во время разговора с методами, объявленными в них? Или как бы вы подошли к расширению стороннего класса с помощью пользовательских / переписанных функций, не затрагивая оригинальный код?
Спасибо за любой совет!
✅ на основе этот stackoverflow-Вопрос / Ответы Я смог преодолеть свою проблему и запустить Код с моими пользовательскими классами и методами.
Class MySmarty extends Smarty {
...
}
Class MySmarty_Compiler extends Smarty {
function _syntax_error($error_msg, $error_type = E_USER_ERROR, $file=null, $line=null) {
...
}
}
// Instantiate Smarty the new way
include_once($_SERVER['DOCUMENT_ROOT'].'/smartylib/Smarty.class.php');
$smarty = new MySmarty; // Instantiate my Subclass, it loads the Main Class too
$smarty_compiler = new MySmarty_Compiler; // Overwrite the $smarty_compiler Object with my second patched Subclass, which loads the Smarty_Compile Class too
Если бы я все еще что-то пропустил или какие-либо рекомендации, я был бы рад услышать об этом 🙂
Других решений пока нет …