четверг, 30 января 2014 г.

Liferay вложенные портлеты 4

Шаблоны страниц в Liferay, к сожалению, не работают так, как хотелось бы:
  • Если для страницы созданной по шаблону включен режим propagation изменений шаблона, то нет возможности кастомизировать страницу (хотя бы в какой-то одной определенной области разметки) LPS-30114
  • Отключение propagation сводит на нет управление сквозными областями разметки (например боковые колоки в 2-х или 3-х колончатом макете страниц)
В результате, для того чтобы добавить портлет в сквозную область настроенный портлет (например, баннерный блок под главное меню в левой колонке) необходимо пройти по всем страницам сайта, повторяя одно и то же действие "Добавить портлет". Даже с учетом возможности использования архивированных настроек портлета, это очень не удобно и не гарантирует внесение изменения на всех страницах сайта.

Можно конечно использовать layout-template устанавливаемые в виде плагина, но в этом случае требуется инструментарий типа IDE. Да и вообще шаблоны страниц должны редактироваться средствами CMS.

Workaround: В JournalArticle есть возможность runtime портлета с помощью тега <runtime-portlet/>, но задать необходимые настройки он не позволяет. Можно предвариательно сохранить PortletPreferences для вызываемого портлета в VM скрипте шаблона сетевого контента. Создаем структуру "LAYOUT_PORTLETS" и шаблон для нее:
#set($themeDisplay=$request.get("theme-display")) 
#set($companyId=$themeDisplay.get("company-id")) 
#set($ownerId=$getterUtil.getLong("0")) 
#set($ownerType=$getterUtil.getInteger("3")) 
#set($plid=$getterUtil.getLong($themeDisplay.get("plid"))) 
#set($portletPreferencesService=$serviceLocator.findService("com.liferay.portal.service.PortletPreferencesLocalService")) 

## Настраиваем портлет
$velocityPortletPreferences.setValue("portletSetupUseCustomTitle", "true") 
$velocityPortletPreferences.setValue("portletSetupTitle_ru_RU", "Урааа!!!") 
$velocityPortletPreferences.setValue("groupId", "10180") 
$velocityPortletPreferences.setValue("articleId", "10870") 

## Проверяем сохранены ли настройки портлета в БД, при необходимости сохраняем
#set($portletId="56_INSTANCE_banner1") 
#set($portletPreferences=$portletPreferencesService.getPortletPreferences($ownerId, $ownerType, $plid, $portletId)) 
#if(!portletPreferences || "$portletPreferences" == "")
     #set($portletPreferences=$portletPreferencesService.updatePreferences($ownerId, $ownerType, $plid, $portletId, $velocityPortletPreferences.toString()))
#end
$velocityPortletPreferences.reset() 

## Вызываем портлет
<runtime-portlet instance="banner1" name="56" querystring=""/>

Предварительно в свойствах портала разрешаем работу с serviceLocator. Добавляем в portal-ext.properties директиву:
journal.template.velocity.restricted.variables=
Добавляем статью в созданную структуру и накидываем портлет "Отображение сетевого контента" с выводом этой статьи: портлет внутри статьи отрабатывает уже настроенным!!! При этом, число портлетов вызываемых в статье по шаблону может быть более одного.

В результате, я создал 2 статьи "Левая колонка" и "Правая колонка", закрепил на всех страницах сайта в соответствующих областях разметки. Для изменения левой или правой колонки редактирую соответствующую статью.

Получилось некое подобие стандартного портлета Liferay "Вложенные портлеты", при этом конфигурация вложенных портлетов инициализируется на страницах автоматически.