У нас есть несколько сайтов, размещенных на экземпляре 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), сможет предложить решение или другое приемлемое решение этой проблемы. Я предоставлю любую дополнительную информацию или разъяснения, которые я могу.
Спасибо!