Как контролировать, где калитка добавляет элементы в заголовок? - PullRequest
4 голосов
/ 05 января 2011

Мне известны два способа добавления контента в раздел <head> страницы в калитке.Вы можете использовать HeaderContributor s и <wicket:head></wicket:head> в верхней части HTML-кода вашей панели калитки.

Моя проблема заключается в следующем: мне нужно добавить определенные метатеги в определенные страницы моего сайта для целей веб-аналитики, но мне нужно, чтобы они появлялись ДО сценария аналитики, который я включаю в раздел <head> на на каждой странице .У меня есть базовая абстрактная страница, которая расширяется на каждую другую страницу.Я хочу включить скрипт аналитики в базовую страницу и добавить метатеги на панели, которые расположены на страницах, расширяющих его.Однако по умолчанию wicket добавляет содержимое, которое вы поместили в <wicket:head></wicket:head> этих панелей ПОСЛЕ содержимого, включенного в раздел <head> базовой страницы.

Есть ли способ сообщить калитке, что нужно добавить этот <wicket:head></wicket:head> контент вместо его добавления?

ОБНОВЛЕНИЕ: Я использую Webtrends, а не Google Analytics, для которого требуется 2 сценария:раздел head, а также один в нижней части страницы.

1 Ответ

3 голосов
/ 06 января 2011

В Wicket 1.5 они экспериментируют с различными IHeaderRenderStrategy реализациями, такими как ChildFirstHeaderRenderStrategy (экспериментальная) или ParentFirstHeaderRenderStrategy (по умолчанию). Кажется, что переупорядочивание вкладок заголовка было проблемой в 1.4, поэтому они обращаются к нему.

Однако для Wicket 1.4 есть какое-то решение. Идея состоит в том, чтобы переупорядочить список поведений (вклад заголовков - просто еще один IBehavior). Каждый компонент имеет защищенный метод getBehaviors(), который можно перезаписать. Хитрость заключается в том, чтобы найти поведение, соответствующее вашему специальному файлу JS, который должен быть включен первым. Я сделал это, создав собственный экземпляр объекта HeaderContribution, чтобы я мог выполнить сравнение экземпляров и затем использовать ArrayList для перемещения объекта HeaderContribution из середины списка поведения в верхнюю часть списка поведения:

public abstract class BasePage extends WebPage {

public BasePage() {
    add(HeaderContributor.forJavaScript("foo-base.js"));
}

}

HomePage добавляет дополнительный скрипт, который должен отображаться первым. Домашняя страница также перезаписывает метод geBehaviors ():

public class HomePage extends BasePage {

private static final long serialVersionUID = 1L;

private final HeaderContributor contrib = new HeaderContributor(
        new IHeaderContributor() {
    public void renderHead(IHeaderResponse response) {
        response.renderJavascriptReference("foo-first.js");
    }
});

public HomePage(final PageParameters parameters) {
    add(new Label("message", "If you see this message ..."));
    add(contrib);
}

@Override
protected List getBehaviors(Class type) {
    List behaviors = super.getBehaviors(type);
    ArrayList sortedBehaviors = new ArrayList(behaviors);
    boolean moveToTop = true;
    if (moveToTop) {
        if (!sortedBehaviors.remove(contrib)) {
            throw new IllegalStateException();
        }
        sortedBehaviors.add(0, contrib);
    }
    return sortedBehaviors;
}
}

Теперь конечным результатом будет то, что скрипт, добавленный HomePage, будет отображаться первым, а скрипт, добавленный BasPage, - позже.

<html xmlns:wicket="http://wicket.apache.org/... >
<head>  
    <title>Wicket Quickstart Archetype Homepage</title>
<script type="text/javascript" src="foo-first.js"></script>
<script type="text/javascript" src="foo-base.js"></script>
</head>
...