Наследование в 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? Ну не вставлять же верстку повторно?
А может плохая идея вставлять блоки в блоках?
Sphinx
08 сентября 2016, 06:22
modx.pro
3
2 980
0

Комментарии: 11

Максим
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}
    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, которые трогать не надо, а надо просто унаследовать от первого шаблона. Можно так сделать?
      Максим
      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}
        Sphinx
        08 сентября 2016, 18:38
        0
        Наверное можно, если расширять блоки без учета вложенности.
        Во, уже ближе. В общем, редактировать блоки по ходу дела надо с последней вложенности. Буду думать, потом отпишусь.
          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 пустые. Не наследуются с предыдущего шаблона(
            Максим
            08 сентября 2016, 20:03
            0
            При расширении наследуются блоки шаблона, а не блоки блоков (: Как-то так, не могу сформулировать правильно без разбора кода шаблонизатора. Лучше наверное задать этот вопрос разработчику на гитхабе.

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

          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11