Встраивание портлетов в шаблон макета Liferay (не в тему) в 5.2 EE SP5 или 6.x

У нас есть несколько сайтов, размещенных на экземпляре Liferay 5.2, состоящих из нескольких сообществ, тем и шаблонов макетов, и все они работают должным образом. Однако эта настройка больше не работает в пакетах обновления EE 5.2 (в частности, последний EE SP5 — такой же, как 5.2.9) или последний 6.0.6 (CE). (Дополнительное тестирование показало, что в последний раз это работало в EE SP3 / 5.2.7, но стало проблемой в EE SP4 / 5.2.8.) Нам срочно необходимо выполнить обновление до последней версии пакета обновлений 5.2 (EE SP5) для решения других проблем - но обновление до Liferay 6 также возможно, если мы сможем найти комбинацию решения и версии, которая работает.

В частности, у нас есть файлы в теме (например, inc-side.vm), которые включены как часть темы и включены в шаблоны макета. Это позволяет контенту «принадлежать» теме, но использоваться в контексте различных шаблонов макета, даже если одни и те же шаблоны макета используются на нескольких сайтах (сообществах/темах). Размещение этого контента непосредственно в теме (без использования шаблона макета) не вариант, так как он должен быть размещен в пространстве пользовательского интерфейса макета, а различные макеты могут требовать, чтобы этот контент располагался в разных местах по отношению к тема.

Дополнительным требованием является то, что этот включенный контент должен состоять из «встроенных» портлетов, то есть не перетаскиваться в пользовательский интерфейс на страницу, а быть связанным с каждой темой/макетом. Просто применяя тему + макет к сайту/странице, правильные портлеты автоматически добавляются на каждую страницу. Это необходимо, так как для некоторых сайтов/сообществ, состоящих примерно из 100 или более страниц, добавление этого контента на страницу и поддержание его согласованности без встраивания в тему + макет было бы непрактичным и неудобным в сопровождении. (Возьмем всего 10 тем (сообществ) * 10 шаблонов макетов * 10 страниц/сообщество = 1000 комбинаций для настройки и поддержки.)

Опять же, все это работало в версии 5.2.3 (включая 5.2 EE SP1, SP2 и SP3), но перестало работать в версии 5.2 EE SP4. Мы являемся корпоративным клиентом службы поддержки Liferay, и уже почти 2 месяца у нас открыт запрос в службу поддержки, но решение по этому вопросу еще не предоставлено. В примечаниях к выпуску об этом ничего не упоминалось, и мы пока не смогли получить никаких указаний от Liferay относительно того, почему это изменилось, или каких-либо успешных обходных путей.

Вот некоторые особенности текущей проблемы:

Легко и стабильно воспроизводится при любой новой установке 5.2 EE SP4 или SP5.

Включите inc-side.vm в каталог templates темы. В этой теме нет ничего особенного — даже использование копии «классической» темы Liferay по умолчанию будет работать.

В inc-side.vm включите следующее:

<p>Before Diagnostics</p>
$theme.runtime("27_INSTANCE_0000", "", $velocityPortletPreferences.toString())
$velocityPortletPreferences.reset()
<p>After Diagnostics</p>

Обратите внимание, что «27» — это портлет, предоставленный Liferay по умолчанию, используемый для простоты и для демонстрации того, что эта проблема не характерна для какого-либо специально разработанного портлета. Однако я также создал с нуля свой собственный «диагностический портлет», который демонстрирует точно такую ​​же проблему.

В шаблон макета (*.tpl) включите следующие строки:

#set ($contextName = $themeDisplay.getTheme().getContextPath())
#set ($themeContext = $request.getAttribute("CTX").getContext($contextName))
#evaluate ($theme.include($themeContext, "/templates/inc-side.vm"))

Это следует тому же подходу, который показан на http://www.liferay.com/community/forums/-/message_boards/message/772138 .

По предложению из нашего запроса в службу поддержки я также попробовал следующую однострочную альтернативу приведенным выше строкам:

#parse ("$fullTemplatesPath/inc-side.vm")

(Примечание $fullTemplatesPath против $full_templates_path. Причина этого в том, что init.vm вызывает #set ($full_templates_path = $fullTemplatesPath), но init.vm не включается в шаблоны, только в тему.)

Результаты для любого подхода идентичны. Любой статический текст/HTML, содержащийся в inc-side.vm, отображается должным образом. Любые директивы Velocity анализируются и обрабатываются и не отображаются в выходных данных. Регистрация в портлете показывает, что он выполнен, и даже извлекает все настройки портлета, для которых установлено значение velocityPortletPreferences. Основная проблема заключается в том, что любое содержимое, сгенерированное портлетом, не отображается в ответе HTTP. На самом деле, с точки зрения "View/Source" или cURL Firefox, ответ содержит точно:

<p>Before Diagnostics</p>
<p>After Diagnostics</p>

В своем пользовательском портлете я даже пытался вызвать все методы flush() и close(), которые смог найти в ответе, думая, что это проблема, связанная со сбросом.

Вместо этого тестирование под Liferay 6.0.6 (при условии, что это была только проблема серии 5.2) дает другие, но интересные результаты. Включенный файл *.vm успешно прочитан на странице. Однако он не оценивается как код скорости. В отличие от версии 5.2 SP5, где включенная виртуальная машина выполняется, но не отображается, 6.0.6 выполняет визуализацию, но не оценку (или выполнение).

Мы рассмотрели http://www.liferay.com/web/raymond.auge/blog/-/blogs/11180056 ("Встраивание портлетов в темы на Liferay"), и приведенный выше подход действительно является "методом один". «Метод два» не является приемлемым вариантом, так как использование <iframe> вызывает проблемы с DOM страницы (в частности, с JavaScript IPC) — и это также потребует, чтобы размер пользовательского интерфейса каждого портлета был известен заранее, что не является практичным или приемлемым.


Мы надеемся, что кто-то, более знакомый с Liferay и/или механизмом шаблонов Apache Velocity (используемый Liferay), сможет предложить решение или другое приемлемое решение этой проблемы. Я предоставлю любую дополнительную информацию или разъяснения, которые я могу.

Спасибо!


person ziesemer    schedule 18.12.2011    source источник
comment
Я нашел ваш запрос в службу поддержки, и он выглядит довольно активным в настоящее время - так как он довольно длинный, я еще раз взгляну на это завтра (я в Европе, здесь глубокая ночь - неподходящие настройки для такого рода проблемы), но для теперь похоже, что обнаружена какая-то регрессионная ошибка.   -  person Olaf Kock    schedule 22.12.2011
comment
Спасибо, Олаф. Я только что получил уведомление о том, что патч доступен, и я буду тестировать его в течение следующих 24 часов. Если вы приложили руку к решению этой проблемы, опубликуйте его как ответ (или попросите соответствующего человека, который был вовлечен в Liferay, опубликовать его в качестве своей учетной записи) — и я с радостью присужу награду, как только подтвержу, что проблема решена.   -  person ziesemer    schedule 22.12.2011


Ответы (1)


Эта проблема устранена патчем Liferay lpe5096-ee5209-portal-kernel-jdk6.jar. Тот, который я эффективно использую, был предоставлен Liferay 29 декабря 2011 г. и имеет контрольную сумму SHA-1 adb6e0590bfc4850c127a792515941d6de5d385e.

person ziesemer    schedule 09.01.2012
comment
приятно видеть, что это решено - я потерял это из виду в праздничный сезон, но видел прогресс в заявке в службу поддержки, поэтому не ответил, когда все шло хорошо. Да, и: я не принимал непосредственного участия в этом, кроме как найти здесь вашу проблему. - person Olaf Kock; 27.01.2012