При работе над порталом достаточно часто возникает потребность сделать какой-нибудь портлет (например, облако тегов или выбор локализации) элементом темы оформления, доступным на каждой странице. Реализуется это достаточно просто - достаточно разбираться в структуре модифицируемой темы и знать идентификатор нужного нам портлета.
Что нужно делать
Идентификатор портлета можно найти его конфигурационном файле (WEB-INF/liferay-portlet.xml):
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app
PUBLIC "-//Liferay//DTD Portlet Application 6.0.0//EN"
"http://www.liferay.com/dtd/liferay-portlet-app_6_0_0.dtd">
<liferay-portlet-app>
<portlet>
<portlet-name>MyPortlet</portlet-name>
<icon>/icon.png</icon>
<instanceable>false</instanceable>
</portlet>
...
</liferay-portlet-app>
Если портлет является "глобальным" (instanceable=false, или атрибут "instanceable" вообще отсутствует в конфигурации), то идентификатор портлета соответствует значению поля portlet-name (т.е. "MyPortlet").
Если портлет может существовать в нескольких экземплярах (instanceable=true), то идентификатор принимает следующий вид - "$PORTLET_NAME_INSTANCE_xxxx", где "$PORTLET_NAME" - имя портлета (значение параметра из конфигурации), а "xxxx" - 4 произвольные цифры, идентифицирующие конкретный экземпляр портлета.
Для стандартных (интегрированных в состав портала) портлетов правила точно такие же. Идентификаторы этих портлетов можно получить на основании данных из файла WEB-INF/liferay-portlet.xml внутри портала. Например, для портлета "Поиск по сайту" (portlet-name="3", instanceable="false") идентификатор примет значение "3", а для "Отображения сетевого контента" (portlet-name="56", instanceable="true") - "56_INSTANCE_1234" (вместо "1234" можно использовать любые другие 4 цифры).
Теперь, когда мы знаем идентификатор портлета, осталось только добавить его в нашу тему. Для этого открываем нужный нам шаблон (например, portal-normal.vm) и добавляем туда элемент следующего вида:
...
$theme.runtime("$PORTLET_ID")
...
где $PORTLET_ID - идентификатор нашего портлета. Всё! После этого тему можно развернуть на портале и проверить, появился ли портлет.
Пример
Рассмотрим, как интегрировать в шапку темы (рядом с логотипом) портлет "Облако тегов" (довольно бессмысленный пример, но решение задачи он иллюстрирует хорошо). Смотрим свойства этого портлета в конфигурационном файле портала:
...
<portlet>
<portlet-name>148</portlet-name>
<icon>/html/icons/asset_tags_cloud.png</icon>
<struts-path>asset_tags_cloud</struts-path>
<use-default-template>false</use-default-template>
<layout-cacheable>true</layout-cacheable>
<instanceable>true</instanceable>
<private-request-attributes>false</private-request-attributes>
<private-session-attributes>false</private-session-attributes>
<render-weight>50</render-weight>
<css-class-wrapper>portlet-asset-tags-navigation</css-class-wrapper>
</portlet>
...
Видим, что instanceable=true, т.е., идентификатор этого портлета будет выглядеть примерно так - "148_INSTANCE_2345". Открываем шаблон portal-normal.vm и добавляем вызов портлета по этому идентификатору сразу после логотипа:
...
<hgroup id="heading">
<h1 class="company-title">
<a class="logo" href="/"
title="#language("go-to")
$company_name" >
</a>
</h1>
$theme.runtime("148_INSTANCE_2345")
</hgroup>
...
Сохраняем шаблон, разворачиваем тему на сайте и любуемся на теги рядом с логотипом:
