rozhur
Проверенные
- Сообщения
- 147
- Решения
- 3
- Реакции
- 214
- Баллы
- 3,355
Здравствуйте.
Понадобилось добавить свой тег, аналогичный
Создал класс
Изучая движок, не нашел метода, как его добавить. Вижу, что за генерацию этих тегов отвечает класс
Решил пойти костыльным путем: В
Итог: Все работает, но последствия такого способа, хоть, вроде, и не критичны, вручную модификация шаблона спокойно применяется, но при установке уже "релизнутого" плагина, когда добавляется модификация шаблона с этим тегом, обработчик 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 в это время "спит", в следствии чего, он не вносит новый тег в класс и компилятор ругается, в итоге модификация не применяется из-за ошибки компилятора.
Есть ли другие решения?
