rozhur
Проверенные
- Сообщения
- 144
- Решения
- 3
- Реакции
- 201
- Баллы
- 1,755
Здравствуйте.
Понадобилось добавить свой тег, аналогичный
Создал класс
Изучая движок, не нашел метода, как его добавить. Вижу, что за генерацию этих тегов отвечает класс
Решил пойти костыльным путем: В
Итог: Все работает, но последствия такого способа, хоть, вроде, и не критичны, вручную модификация шаблона спокойно применяется, но при установке уже "релизнутого" плагина, когда добавляется модификация шаблона с этим тегом, обработчик app_setup в это время "спит", в следствии чего, он не вносит новый тег в класс и компилятор ругается, в итоге модификация не применяется из-за ошибки компилятора.
Есть ли другие решения?
Понадобилось добавить свой тег, аналогичный
<xf:sidenav..
.Создал класс
Template\Compiler\Tag\SidePanel
, добавил нужные переменные в PAGE_CONTAINER
, и т.д. Проблема лишь в том, что при добавлении неизвестного тега происходит ошибка, что его не существует.Изучая движок, не нашел метода, как его добавить. Вижу, что за генерацию этих тегов отвечает класс
Template\Compiler
, но система расширений классов его не расширяет, и сама переменная, где хранятся эти теги, является protected.Решил пойти костыльным путем: В
Compiler
нашел метод setTag
, через который все таки можно добавить свой тег, к которому даже можно указать свой класс тега. Т.к. Compiler
расширить не получится, решил ловить ивент app_setup
:
PHP:
public function setTag($name, $tag)
{
if (is_string($tag))
{
$class = $tag[0] == '\\' ? $tag : __NAMESPACE__ . '\\Compiler\\Tag\\' . $tag;
$tag = new $class($name);
}
if (!($tag instanceof AbstractTag))
{
throw new \InvalidArgumentException("Tag must be a class name or object that is an instance of AbstractTag");
}
$this->tags[$name] = $tag;
return $this;
}
PHP:
<?php
namespace Extender;
class Listener
{
public static function init(\XF\App $app)
{
$compiler = $app->templateCompiler();
$compiler->setTag('sidepanel', '\Extender\Template\Compiler\Tag\SidePanel');
}
}
Итог: Все работает, но последствия такого способа, хоть, вроде, и не критичны, вручную модификация шаблона спокойно применяется, но при установке уже "релизнутого" плагина, когда добавляется модификация шаблона с этим тегом, обработчик app_setup в это время "спит", в следствии чего, он не вносит новый тег в класс и компилятор ругается, в итоге модификация не применяется из-за ошибки компилятора.
Есть ли другие решения?