Скорость #parse, но назначить ее переменной - PullRequest
9 голосов
/ 18 октября 2008

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

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

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

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

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

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

$ {тело}

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

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

Ответы [ 3 ]

10 голосов
/ 31 октября 2008

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

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

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

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

3 голосов
/ 28 октября 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 .

0 голосов
/ 30 октября 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")
...