четверг, 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 "Вложенные портлеты", при этом конфигурация вложенных портлетов инициализируется на страницах автоматически.

Комментариев нет:

Отправить комментарий