Можно ли разделить doLayout на страницу вызова шаблона? - PullRequest
3 голосов
/ 04 июня 2011

В представлениях инфраструктуры воспроизведения вы можете выполнить основной импорт кода в файл базового шаблона с помощью тега doLayout.

Однако, скажем, в моем базовом файле есть несколько разделенных областей, например

<html>
<head></head>
<body>
<div1>doLayout</div1>
<div2>some text in here thats standard across all views...</div2>
<div3>doLayout..again</div> 
</body>
</html>

Таким образом, в моих представлениях, использующих этот базовый html-файл, я хочу добавить ссылку на фотографию в div1 и div 2, разместить в некотором тексте, но я хочу, чтобы doLayouts был отделен и учитывал содержимое (div2) разделяя их.

Ответы [ 2 ]

4 голосов
/ 04 июня 2011

Play поддерживает мощный тег {{set /}, который позволяет вам предоставить фрагмент кода и назначить его заполнителю на вашей HTML-странице.Например, вы можете увидеть это в некоторых примерах кода (хотя не помню, какой именно).

В layout.html:

<head>
    <link href="skin.css'}" rel="stylesheet" type="text/css" media="all" />
    #{get 'moreStyles' /}
</head>

В any_page.html:

<div id='normal_dolayout_body'>
    <p>This is the doLayout body</[p>
</div>

#{set 'moreStyles'}
   <link href="extra.css" rel='stylesheet' type='text/css' media='all' />
#{/set}

Полученная страница будет содержать обе декларации CSS.Теперь для создания сложных макетов вы используете теги #set и #include, например:

в layout.html:

<!--div.container start -->
<div class="container">  
<div class="center">
<div id="layout">
        <div id='content'>
    #{doLayout/}
</div>
<div id='sidebar'>
    #{get 'sidebar'/}
    </div>
</div>
</div>
<!--div.container end -->

<!--div.footer start -->
<div class="footer">
    #{get 'promo' /}
    #{get 'footerlinks' /}
</div>
<!--div.footer end -->

в any_page.html:

<div id='normal_body'>Will be included by doLayout</div>

<!-- You may have any number of #set tags which will be matched with any #get declared in your main layout. -->
#{set 'promo'}
   #{include 'my_custom_promo.html'/}
#{/set}

#{set 'sidebar'}
    #{if user.isHappy }
        #{include '/Commons/happy_user_sidebar.html' /}
    #{/if}
    #{else}
        #{include '/Commons/default_sidebar.html' /}
    #{/else}
#{/set}

Промо и блоки боковой панели будут вставлены в соответствующий заполнитель #get в шаблоне.

Как вы можете, используя теги #set и include, вы можете применять принципы DRY к сборке вашей страницы с блочным подходом к сборке пользовательского содержимого страницы.Вы даже можете определить свой собственный тег, чтобы скрыть сложную логику в симпатичном теге # {sidebar user: user /}, если хотите упростить задачу для своих дизайнеров.

1 голос
/ 04 июня 2011

Используя тег doLayout, тогда нет, вы не можете достичь того, о чем просите. doLayout использует тэг extends в тандеме, чтобы выяснить, где макет вставлен в мастер-макет, но он не принимает аргументов. Следовательно, если вы попытались вызвать doLayout несколько раз, то как бы он узнал, какая часть вводится?

Я вижу, что у вас есть два варианта.

Первый вариант, который у вас есть, это использовать тег includes. Это позволит вам сделать что-то вроде

#{include 'head.html' /}
your top layout code
#{include 'middle-common.html' /}
your bottom layout code
#{include 'foot.html' /}

Дополнительную информацию о разнице между include и doLayout можно найти здесь - В чем разница между doLayout и включением в шаблон в «Java Play!»?

Ваш второй вариант - использовать CSS для правильного выполнения макетов. Теоретически, вы должны иметь возможность поместить свой заголовок и просто использовать CSS, чтобы правильно расположить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...