Изменить разметку Wicket FormComponent без панели? - PullRequest
3 голосов
/ 26 июля 2011

В Wicket я бы хотел создать подкласс компонента формы TextField для добавления дополнительной разметки вокруг тега.

Почему я не хочу создавать панель:

1) Я хочу, чтобы дизайнер веб-страниц использовал тег ввода: <input wicket:id="blah">

2) Я не хочу, чтобы подкласс терял семантику FormField в Java, например: field.setRequired(true); и т. Д.

Я в порядке с жестким кодированием разметки упаковки в Java. Но я бы хотел, чтобы в Java он вел себя как FormField.

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

Edit: Я знаю о границах, но моя проблема в том, что вы должны добавить их как в разметку, так и в Java. Например:

<div wicket:id="border">
<input type="text" wicket:id="field"/>
</div>

-

FormComponent<Integer> field = new TextField<Integer>("field", new Model(1));
field.setRequired(true);
Border border = new MyBorder("border");
border.add(field);
form.add(border);

Это заставляет дизайнера веб-страниц знать о специальной разметке, и Java не может быть инкапсулирован (как подкласс FormField).

Ответы [ 3 ]

3 голосов
/ 26 июля 2011

Ах, вот что я хотел через IBehavior:

Мое поведение оболочки (извините за синтаксис Scala):

class FieldWrapper extends AbstractTransformerBehavior {
  def transform(component: Component, output: CharSequence): CharSequence = """
<div class="blah">
  Blah blah blah  
  %s
</div>
""".format(output)
}

Мой подкласс:

class MyField[T](id: String, model: IModel[T]) extends TextField[T](id, model) {
  add(new FieldWrapper)
}

Оригинальная разметка:

<input type="text" wicket:id="foobar"/>

Сгенерированная разметка:

<div class="blah">
  Blah blah blah  
  <input type="text" value="" name="foobar" xmlns:wicket="http://wicket.apache.org">
</div>

Спасибо ТАК за то, что я запустил свой ум: -)

2 голосов
/ 26 июля 2011

Вам даже не нужно создавать подкласс TextField.хотя это может быть проще, если вы хотите использовать его повторно.Если вы просто хотите добавить разметку за пределы исходного тега, это вариант использования плаката для Граница .

0 голосов
/ 26 июля 2011

Если необходимо углубиться в рендеринг компонента,

MarkupContainer#onRender()

- ваш друг.

Примером может быть:

AbstractTree#onRender()

mf

...