У нас есть несколько сайтов, размещенных на экземпляре 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.
По предложению из нашей заявки в службу поддержки я также попробовал следующую 1-строчную альтернативу указанным выше строкам:
#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. На самом деле, как показывает Firefox "View / Source" или cURL, ответ содержит в точности:
<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), сможет решить эту проблему или принять другое приемлемое решение. Я предоставлю любую дополнительную информацию или разъяснения, которые могу.
Спасибо!