четверг, 23 октября 2014 г.

IE11 vs CKEditor Filemanager (Liferay 6.1.x): Object doesn't support property or method createNSResolver

В браузере Internet Explorer 11 (возможно и 10й версии тоже) не работает файлменеджер визуального редактора CKEditor используемого в Liferay 6.1.x. В консоли бьёт ошибку "Object doesn't support property or method createNSResolver".

Необходимо в HTML-файлы файлменеджера:

[liferay-app-dir]/html/js/editor/ckeditor/editor/filemanager/browser/liferay/browser.html

добавить метатег совместимости с IE9:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" />

среда, 12 марта 2014 г.

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