Как расширить файл шаблона, если в нем не предусмотрено хуков?..

Проблема в следующем — есть файл topic_part_header, но в нем не предусмотрено хуков, которые бы позволили добавить туда что-нибудь. Но туда нужно добавить ссылку на новое действие с топиком. Подскажите, пожалуйста, как быть? Лезть в шаблон и менять не хочется, хотелось бы через плагин.

14 комментариев

avatar
в ближайший хук вставляете код жс, которым «добираетесь» по структуре ДОМ куда нужно. лучше так, чем полное делегирование шаблона.

в разрабатываемой версии лс в шаблонах используется наследование, так что проблема решена.
avatar
class PluginRename extends Plugin {

    public $aDelegates = array(
      "template" => array(
        "topic_part_header.tpl" => "_topic_part_header.tpl"
      )

    );

Скопировать в /plugins/abcplugin/templates/skin/default/ и править уже там.
  • 777
  • 0
avatar
самый просто и не самый лучший в плане совместимости, о котором выше и идет речь
avatar
кстати, да. один из не многих tpl-ек без хуков, хотя плагины часто «используют» его — делегированием ((. предлагаю хотя бы в dev-версию добавить хуков?
avatar
в дев версии используется наследование, поэтому там нет такой острой необходимости в хуках.
avatar
В чем заключается это наследование?
avatar
вместо тысячи слов — откройте шаблон девелопер дев версии лс.
имеется основной «слой», состоящий из расширяемых, дополняемых, редактируемых блоков содержимого, которые могут меняться плагинами.
avatar
И что поменялось?
К примеру, как изменить вот эту часть:

{**
* Шапка
*}
<header class="grid-row grid-role-header" role="banner">
{hook run='header_banner_begin'}

<div class="site-info">
<h1 class="site-name"><a href="{router page='/'}">{cfg name='view.name'}</a></h1>
<h2 class="site-description">{cfg name='view.description'}</h2>
</div>
{hook run='header_banner_end'}
</header>
avatar
У меня сейчас в плагине переделегирован header_top.tpl и эта часть заменена на:

<header id="header" role="banner">
	{hook run='header_banner_begin'}
  {if !$noHeaderBanner}
  	<hgroup class="site-info">
  		<h1 class="site-name"><a href="{cfg name='path.root.web'}">{cfg name='view.name'}</a></h1>
  		<h2 class="site-description">{cfg name='view.description'}</h2>
  	</hgroup>
  {/if}
	{hook run='header_banner_end'}
</header>
avatar
И что поменялось?
вы замечаете такие вещи:
{block name='layout_options'}{/block}

?
набор блоков вполне ещё может поменяться в зависимости от потребностей разработчиков. почаще заглядывайте на гит, просматривая места, которые нужно расширять.

эту часть нужно обернуть в блок. создайте исюшку.
avatar
Я не понимаю идеологию этих блоков. Что они делают?
Вот, к примеру, идет хук, а потом сразу блок:
        {hook run='html_head_begin'}
        {block name='layout_head_begin'}{/block}

Зачем?
avatar
хук — для старой совместимости, блок — новый ф-л.

Я не понимаю идеологию этих блоков. Что они делают?
www.smarty.net/docs/en/advanced.features.template.inheritance.tpl
avatar
И тем не менее, это не решает проблему с делегированием шаблона. Все равно там, где хуков нет, придется делегировать его полностью. Нет такой гибкости, как с наследованием классов.

Было бы шикарно, если бы каждый шаблон мог делегироваться, сохраняя свой parent, и при этом добавляя в нужные места нужные дополнения.

Хуки в таком случае вообще можно добавлять автоматически, некоторые стандартные, которые должны быть всегда — типа layout_start \ end, для каждого блока в html — block_{block_id}_start \ end, и т.п.

Это я к тому, что подобная система блоков ничем не отличается по сути от хуков. И если блок не прописан в шаблоне, его все равно не поменять иначе, кроме как полным делегированием (или, как вы и предложили, через js).
avatar
И тем не менее, это не решает проблему с делегированием шаблона. Все равно там, где хуков нет, придется делегировать его полностью.
вы о чем сейчас?
Нет такой гибкости, как с наследованием классов.
вы по ссылке прошли и прочитали все?
Это я к тому, что подобная система блоков ничем не отличается по сути от хуков. И если блок не прописан в шаблоне, его все равно не поменять иначе, кроме как полным делегированием (или, как вы и предложили, через js).
чтобы не писать не совсем верные вещи нужно все же осилить и прочитать документацию.

наследование частично (большую часть) этих проблем решает именно из-за использования блоков. прочитайте про манипуляции их содержимого.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.