null

Liferay - интеграция портлета в тему портала

При работе над порталом достаточно часто возникает потребность сделать какой-нибудь портлет (например, облако тегов или выбор локализации) элементом темы оформления, доступным на каждой странице. Реализуется это достаточно просто - достаточно разбираться в структуре модифицируемой темы и знать идентификатор нужного нам портлета.

Что нужно делать

Идентификатор портлета можно найти его конфигурационном файле (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>
...

Сохраняем шаблон, разворачиваем тему на сайте и любуемся на теги рядом с логотипом:

Теги рядом с логотипом

Коротко о себе:

Работаю ведущим программистом в компании Tune IT и ассистентом кафедры Вычислительной техники в Университете ИТМО .

Занимаюсь проектами, связанными с разработкой разного рода веб-приложений (порталы, CRM-системы, системы электронного документооборота), а также, в рамках научной работы на кафедре, изучаю возможности применения семантического анализа в задачах САПР.