Помощники шаблонов в стиле Rails в Velocity

Мне нужно добавить несколько очень сложных динамических структур HTML в мой шаблон Velocity. Если бы я попытался написать их прямо в шаблоне, это был бы полный беспорядок.

Позвольте мне объяснить, что я пытаюсь сделать... скажем, на моем веб-сайте пользователь может оставлять комментарии. Вместо того, чтобы писать всю сложную динамическую структуру HTML, которая входит в таблицу комментариев и форму публикации, я хотел бы иметь возможность сделать это в своем шаблоне:

<div>
    // call to a method that generates the comments table
</div>
<div>
    // call to a method that generates the comments form
</div>

В Ruby On Rails есть вещи, которые называются помощники, которые позволяют вам из шаблонов вызывать, по сути, метод, который возвращает динамически сгенерированный фрагмент HTML для встраивания в шаблон прямо там, где вы его вызываете. В хелперах хорошо то, что вы тратите ЦП только на те, которые используете. С методом VelocityContext.put() кажется, что мне нужно заранее сгенерировать все, что мне нужно. Это проблема, потому что в конечном итоге у меня будет около 50 разных помощников, и мне нужен веб-дизайнер, не являющийся программистом, чтобы иметь возможность менять их местами по своему желанию.

Поэтому я спрашиваю,

  1. Могу ли я сделать что-то подобное с Velocity?
  2. Если нет, могу ли я сделать что-то подобное с другим механизмом шаблонов?
  3. Есть ли лучший способ сделать то, что я пытаюсь сделать?

person alexantd    schedule 17.11.2010    source источник


Ответы (2)


Рассматривали ли вы (или уже используете) Velocity Tools? Я склонен рассматривать их как аналоги хелперов Rails и, безусловно, лучшее место для хранения логики, специфичной для представления. В зависимости от точной реализации вы можете рассматривать проводку в своем помощнике как настраиваемый инструмент, а затем позволить платформе инструментов беспрепятственно управлять созданием экземпляра и т. д. Если ваш помощник — это просто POJO, вы можете обнаружить, что он уже работает как инструмент без каких-либо изменений.

В качестве альтернативы, если ваши помощники создают только структуру HTML и не имеют сложных зависимостей Java, возможно, вы могли бы просто создать их как макросы?

person Will Prescott    schedule 17.11.2010
comment
А с VelocityTools 2 инструменты даже не создаются, пока вы их не используете. - person Nathan Bubna; 17.11.2010

Извините, я представил это, не используя свой мозг. Все, что вам нужно сделать, это создать класс Helper:

public class HtmlHelper {

    public String getSomeHtml() {
        return "<p>badgers</p>";
    }

}

Затем добавьте экземпляр в контекст:

VelocityContext context = new VelocityContext();
HtmlHelper helper = new HtmlHelper();
context.put("helper", helper);

Затем в шаблоне:

<div>
    $helper.getSomeHtml()
</div>

Наконец, станцуйте меренге с собакой в честь праздника.

person alexantd    schedule 17.11.2010
comment
И вы можете использовать VelocityTools, чтобы ваш HtmlHelper автоматически создавался и помещался в контекст, когда вы ссылаетесь на $helper в своем шаблоне. - person Nathan Bubna; 17.11.2010