2015-05-03 2 views
1

Реально ли получать содержимое блока из родительского файла в дочерний? Например, у меня есть 3 файла parent.tpl & first-child.tpl & second-child.tplНаследование основного блочного кода Smarty

Родитель содержит этот код:

<div> 
    {block name='greetings'}{/block} 
</div> 

первого ребенка содержит:

{extends file="parent.tpl"} 
{block name='greetings'} 
    <h1>Hello! I'm child</h1> 
{/block} 

второго ребенка содержит так же, как первые приветствия блока (только тот же текст), но вместо h1 тег, использование второго ребенка h4 тег:

{extends file="parent.tpl"} 
{block name='greetings'} 
    <h4>Hello! I'm child</h4> 
{/block} 

Я не хочу, чтобы дублировать текст Hello! I'm child в каждом ребенке, но положить это в собственный блок. Это можно сделать так: Создайте новый файл greeting_text.tpl и включите их в каждый дочерний элемент, но я не хочу выделять для этого собственного файла. Я пытался заявить, что текст в parent.tpl:

... 
{block name='greetings_text'}Hello! I'm child{/block} 

И получаю, что у детей:

{extends file="parent.tpl"} 
{block name='greetings'} 
    <h1>{block name='greetings_text'}{/block}</h1> 
{/block} 

и второго ребенок:

{extends file="parent.tpl"} 
{block name='greetings'} 
    <h4>{block name='greetings_text'}{/block}</h4> 
{/block} 

Но я понял, что это невозможно принять block содержания от родителя к ребенку. Или, может быть, я ошибаюсь. Пожалуйста, дайте мне совет, как я могу это сделать, кроме как положить greeting_text в свой собственный файл и включить их в детей? Благодаря!


Редакция:

К сожалению, предыдущий текст вопроса был немного неправильно (не в полной мере описать то, что я пытаюсь сделать)

Как писал sofl, это работа с append строительство. Но проблема в том, что у меня есть 3 файлов, и два из них выдвижная (layout.tpl, DEFAULT.TPL и page.tpl)

layout.tpl

<div class="layout"> 
    {block name="content"}{/block} 
</div> 

DEFAULT.TPL

{extends file="layout.tpl"} 

{block name='menu'} 
    <ul> 
     <li>Link 1</li> 
     <li>Link 2</li> 
     <li>Link 3</li> 
    </ul> 
{/block} 

page.tpl

{extends file="default.tpl"} 

{block name="content"} 
    <div class="first-page-example"> 
     {block name='menu' append}{/block} 

     <span>I'm text only for first page....</span> 
    </div> 
{/block} 

запускает page.tpl ($smarty->display('page.tpl')), и я хотел бы получить menu от default.tpl к каждому ребенку (page.tpl, P.S. может быть много детей page1.tpl, page2.tpl, ...Но для всех из них необходимо было установить меню по умолчанию от default.tpl) И положите все на layout.tpl, как content. Так как я могу сделать это с block строительство? Пожалуйста, любые советы.

+0

Пожалуйста, помогите мне, ребята. Я знаю, что есть много опытных Smarty, парни, которые знают, почему эта конструкция не работает. Дайте мне совет, как это лучше делать, пожалуйста ... :) – kxc

ответ

2

Используйте prepend или append, чтобы сохранить содержимое родительского блока. http://www.smarty.net/docs/en/language.function.block.tpl

родитель

<div> 
    {block name='greetings'}<h4>Hello! I'm child</h4>{/block} 
</div> 

ребенок

{extends file="parent.tpl"} 
{block name='greetings' append} 
    <h5>...here I am</h5> 
{/block} 

ОБНОВЛЕНО ОТВЕТ

кажется ABIT сложно. Вы можете использовать более одного блока content. Блок menu в default.tpl не имеет места.

Некоторые возможности

layout.tpl

<div class='layout'> 
    {block name='content'}{/block} 
</div> 

default.tpl

{extends file='layout.tpl'} 

{block name='content'} 
    {block name='menu'} 
     <ul> 
      <li>Link 1</li> 
      <li>Link 2</li> 
      <li>Link 3</li> 
     </ul> 
    {/block} 
    {block name='actualContent'}{/block} 
{/block} 

page.tpl

{extends file='default.tpl'} 

{block name='menu'} 
    <div class="first-page-example"> 
     {$smarty.block.parent} 
    </div> 
{/block} 
{block name='actualContent'} 
    <span>I'm text only for first page....</span> 
{/block} 

Я мало знаю о вашем проекте, но лично я бы не добавил слишком много структуры к page.tpl. Так что мой альтернативный будет выглядеть так

layout.tpl

<div class='layout'> 
    {block name='content'}{/block} 
</div> 

default.tpl

{extends file='layout.tpl'} 
{block 'content'} 
    <header> 
     <nav> 
     {block 'menu'} 
      <ul> 
       <li>Link 1</li> 
       <li>Link 2</li> 
       <li>Link 3</li> 
      </ul> 
     {/block} 
     </nav> 
    </header> 
    <main> 
     {block 'actualContent'}comming soon...{/block} 
    </main> 
{/block} 

page.tpl

{extends file='default.tpl'} 
{block 'actualContent'} 
    <article>I'm text only for first page....</article> 
{/block} 

Это точно не отвечает на ваш вопрос, но может помочь, я думаю.

+0

Спасибо, это действительно работает. Но я немного неправильно объясняю, что я пытаюсь получить, потому что у меня есть 3 файла 'layout.tpl default.tpl page.tpl'. Я отредактировал мой вопрос, не могли бы вы проверить его? – kxc

+0

Yeap, это работает, но не совсем то, что я пытаюсь получить. В этом случае вы не можете прямо установить, в каком месте блок 'menu' из' default.tpl' будет добавлен в 'page.tpl'. Например, если вы попытаетесь добавить 'menu' в child (' page.tpl') между текстовыми 'only' и' for', вы не сможете этого сделать. : [ – kxc

+1

Если размещение меню не исправить, и вам действительно не нужно переписывать его содержимое, здесь может быть лучшим выбором 'include'. – sofl

Смежные вопросы