Наследование в Fenom Новый


Добрый день!
Ни как не могу разобраться, как правильно записать на Fenom'е. Есть 2 шаблона, 2й наследует от первого. Есть 2 блока, один внутри другого. Надо поменять верстку во внешнем блоке, а внутренний оставить без изменений.

Приведу пример:
shablon_1
<html>
</html>
<head><title>Пример</title></head>
<body>
{block 'content'}
	<div>Текст 1</div>
	<div>Текст 2</div>
	{block 'sidebar'}
		<div>Сайдбар</div>
	{/block}
{/block}
</body>
</html>

shablon_2
{extends 'template:shablon_1'}
{block 'content'}
	<div>Текст 1</div>
	{block 'sidebar'}
		{parent}
	{/block}
{/block}

Получается во втором шаблоне мне надо чуть изменить верстку в блоке content, а в блоке sidebar ничего менять не надо. Но запись, описанная выше не работает. Она работает только в том случае, если в шаблоне shablon_2 уже определен блок sidebar. Подскажите пожалуйста, как правильно вставить блок sidebar без изменений, т.е. в том же виде как в шаблоне shablon_1? Ну не вставлять же верстку повторно?
А может плохая идея вставлять блоки в блоках?
08 сентября 2016, 09:22    Sphinx   
0    360 0

Комментарии (11)

  1. Максим 08 сентября 2016, 13:50 # +1
    Вот так нужно:
    <html>
    </html>
    <head><title>Пример</title></head>
    <body>
    {block 'content'}
    	{block 'main'}
    		<div>Текст 1</div>
    		<div>Текст 2</div>
    	{/block}
    	{block 'sidebar'}
    		<div>Сайдбар</div>
    	{/block}
    {/block}
    </body>
    </html>
    

    {extends 'template:shablon_1'}
    {block 'main'}
    	<div>Текст 1</div>
    {/block}
    
    1. Sphinx 08 сентября 2016, 14:53 # 0
      Ок, тогда по этому примеру как сделать такое?
      Первый шаблон такой же, а второй нужно:
      {extends 'template:shablon_1'}
      {block 'content'}
      	<div>Текст 3</div>
      	{block 'main'}
      		<div>Текст 1</div>		
      		<div>Текст 2</div>
      	{/block}
      	{block 'sidebar'}
      		<div>Сайдбар</div>
      	{/block}
      {/block}

      Т.е. мне нужно сделать изменение только в блоке conten (вставить текст 3)t, а в блоках main и sidebar оставить верстку такую же. Я думал, что можно так:
      {extends 'template:shablon_1'}
      {block 'content'}
      	<div>Текст 3</div>
      	{block 'main'}
      		{parent}
      	{/block}
      	{block 'sidebar'}
      		{parent}
      	{/block}
      {/block}

      Такой вариант не работает. Т.е. в блоке content я вношу нужные мне измения, но в нем есть блоки main и sidebar, которые трогать не надо, а надо просто унаследовать от первого шаблона. Можно так сделать?
      1. Максим 08 сентября 2016, 18:07 # 0
        Т.е. в блоке content я вношу нужные мне измения, но в нем есть блоки main и sidebar, которые трогать не надо, а надо просто унаследовать от первого шаблона. Можно так сделать?
        Наверное можно, если расширять блоки без учета вложенности. Например, так:
        {extends 'template:shablon_1'}
        {block 'content'}
        	<div>Текст 3</div>
        	{parent}
        {/block}
        {block 'sidebar'}
            <div>Сайдбар 2</div>
            {parent}
        {/block}
        
        1. Sphinx 08 сентября 2016, 18:38 # 0
          Наверное можно, если расширять блоки без учета вложенности.
          Во, уже ближе. В общем, редактировать блоки по ходу дела надо с последней вложенности. Буду думать, потом отпишусь.
          1. Sphinx 08 сентября 2016, 18:45 # 0
            Такой вариант работает, если текст надо вставить вверх верстки. А если в середину:
            {extends 'template:shablon_1'}
            {block 'content'}
            	{block 'main'}
            		{parent}
            	{/block}
            	<div>Текст 3</div>
            	{block 'sidebar'}
            		{parent}
            	{/block}
            {/block}

            Тут я опять голову ломаю и не пойму как сделать.

            PS вставляем «Текст 3» и получается в этом варианте блоки main и sidebar пустые. Не наследуются с предыдущего шаблона(
            1. Максим 08 сентября 2016, 20:03 # 0
              При расширении наследуются блоки шаблона, а не блоки блоков (: Как-то так, не могу сформулировать правильно без разбора кода шаблонизатора. Лучше наверное задать этот вопрос разработчику на гитхабе.

              А так, можно добавить код к блоку main вниз или к sidebar вверх. Или в content добавить пустой блок center и уже его менять.
        2. Sphinx 08 сентября 2016, 14:56 # 0
          Я хочу изменить внешний блок без написания верстки внутренних блоков (там же по верстке остается то же, что и было в первом шаблоне). К примеру я в первом шаблоне поменяю, и изменения будут учтены уже во втором шаблоне. В предложенном варианте мне приходится повторять верстку и если я в первом шаблоне изменю блок sidebar, то во втором шаблоне не будет изменений, т.к. там четко прописано что выводить.
          1. Андрей П 08 сентября 2016, 21:47 # 0
            Как мне видится, Вам нужно в shablon_1 в нужном для изменения месте указать блок пустой, например
            {block 'kakoytoblock'}
            	{/block}
            Потом выводите в его теле нужную Вам информацию
            {extends 'template:shablon_1'}
            {block 'kakoytoblock'}
            kakoytocod
            	{/block}
        3. Rahim Egamov 08 сентября 2016, 16:07 # +1
          Делай вот так
          1
          {include 'header'}
          {block 'sidebar'}
          	{include 'sidebar'}
          {/block}
          	
          {block 'content'}
          
          {/block}
          
          {block 'footer'}
          	{include 'footer'}
          {/block}
          2
          {extends 'template:main'}
          {block 'content'}
          	
          {/block}
          1. Sphinx 08 сентября 2016, 16:18 # -1
            Т.е. ты предлагаешь все засовывать в чанки? В принципе как вариант, но не очень удобно, т.к. в блоке может быть всего 2 строчки и их проще написать в шаблоне, а не создавая для этого отдельный чанк.
            1. Rahim Egamov 08 сентября 2016, 21:48 # +1
              Мде… ППЦ
              Я показал пример не надо быть только чанк.
              Убери
              {include 'footer'}
              став свой код и все!

          Вы должны авторизоваться, чтобы оставлять комментарии.