Скорость #parse, но назначьте ее переменной

Допустим, у вас есть стандартный шаблон с включенными (проанализированными) шаблонами заголовка, тела и нижнего колонтитула.

В шаблоне тела определена такая переменная, как $subject, и вы хотите, чтобы она также отображалась в шаблоне заголовка.

В некоторых других языках шаблонов, таких как HTML::Mason (на основе perl), вы должны сначала оценить шаблон тела, чтобы выбрать переменную $subject, но временно сохранить его вывод в переменной, чтобы ваш окончательный вывод мог оказаться в правильном порядке (заголовок, тело, нижний колонтитул)

По скорости это будет выглядеть примерно так

установить ($ body = # parse ("body.vm"))

разбор ("header.vm")

${тело}

синтаксический анализ ("нижний колонтитул.vm")

Однако это, похоже, не работает, есть мысли о том, как это сделать?


person Community    schedule 17.10.2008    source источник


Ответы (3)


Любое из двух решений выше будет работать. Для решения VelocityLayoutServlet требуется дополнительный пакет (также от Velocity) под названием Velocity Tools. Я сам неравнодушен к этому подходу (и вариантам).

Третий способ — просто поместить #parse в кавычки:

set ($body="#parse('body.vm')")

Внутри #set оценивается все, что заключено в двойные кавычки. Строки в одинарных кавычках передаются буквально.

person Will Glass    schedule 31.10.2008

Вы можете сделать это с помощью VelocityLayoutServlet, который является частью VelocityTools.

Это позволяет вам определить макет для вашего приложения — назовем его application.vm — в котором вы можете анализировать заголовки, нижние колонтитулы и т. д. и объявлять, где размещается основной контент, используя объявление screen_content, например:

<html>
  <head>
    <title>$subject</title>
  </head>
  <body>
  #parse("header.vm") 
  $screen_content
  #parse("footer.vm") 
  </body>
</html>

VelocityLayoutServlet будет оценивать шаблоны (и, следовательно, переменные) перед рендерингом, что позволяет вам установить переменную $subject в вашем шаблоне тела, например:

#set($subject = "My Subject")
<div id="content">
</div>

Более подробную информацию можно найти в документации Velocity.

person Olly    schedule 28.10.2008

Если я вас правильно понял, вы хотите, чтобы переменная Velocity с именем $subject была интерполирована в шаблоны header.vm и body.vm. Прямо сейчас переменная определена в шаблоне body.vm, поэтому вы не можете ссылаться на нее в более раннем шаблоне header.vm.

Почему бы вам не абстрагировать определение $subject в отдельный фрагмент шаблона, скажем, с именем globals.vm, а затем включить его в шаблон верхнего уровня. Итак, у вас будет:

#parse("globals.vm")
#parse("header.vm")
#parse("body.vm")
#parse("footer.vm")
person Dov Wasserman    schedule 30.10.2008