angle-left

Liferay 7: Декораторы портлетов

Liferay 7 принёс с собой много новых и полезных особенностей, в том числе некоторые привычные вещи теперь делаются несколько иначе. В этой статье мы поговорим об одном из таких нововведений - декораторах портлетов.

В Liferay 6.2 границы портлета настраивались в разделе Look and Feel настроек портлета, где вы могли выбрать отображать их или не отображать. В Liferay 7 эта опция заменена более мощным механизмом декораторов.

Рис.1 Интерфейс настроек портлета Liferay 6.2

Каждый портлет обёрнут в некоторое количество родительских тегов, обеспечивающих базовые функции, такие как перетаскивание и стиль границ. Для защиты этих функций, изменение данного уровня разметки из темы невозможно. Поскольку в настройках портлета было выбрано скрывать границы, в коде можно увидеть соответствующий класс portlet-borderless.

Рис. 2. Разметка портлета со скрытыми границами

Декораторы предлагают способ добавления пользовательских CSS-классов к одному из тегов-обёрток через настройки портлета. Определив в теме правила для каждого класса, вы получаете возможность менять стили границ, а не только включать или выключать их.
Однако, поскольку декораторы определяются в теме, нужно учитывать, что если ваша тема их не определяет, по умолчанию ни одного декоратора не будет доступно. В том числе привычных “с границами” и “без границ”. В классической теме (Classic theme) определены три декоратора, которые рекомендуется иметь в теме:

  • Decorate - включает заголовок портлета, границы и белый фон
  • Borderless - только заголовок
  • Barebone - никаких обрамлений

Декораторы описываются в файле настроек темы liferay-look-and-feel.xml, пример для упомянутых декораторов из классической темы Лайфрея приведён ниже.

<?xml version="1.0"?>
<!DOCTYPE look-and-feel PUBLIC "-//Liferay//DTD Look and Feel 7.0.0//EN" "http://www.liferay.com/dtd/liferay-look-and-feel_7_0_0.dtd">
<look-and-feel>
  <compatibility>
    <version>7.0.0+</version>
  </compatibility>
  ...
  <theme id="classic" name="Classic">
    ...
    <portlet-decorator id="barebone" name="Barebone">
      <portlet-decorator-css-class>portlet-barebone</portlet-decorator-css-class>
    </portlet-decorator>
    <portlet-decorator id="borderless" name="Borderless">
      <portlet-decorator-css-class>portlet-borderless</portlet-decorator-css-class>
    </portlet-decorator>
    <portlet-decorator id="decorate" name="Decorate">
      <default-portlet-decorator>true</default-portlet-decorator>
      <portlet-decorator-css-class>portlet-decorate</portlet-decorator-css-class>
    </portlet-decorator>
  </theme>
</look-and-feel>

Атрибуты id и name тега portlet-decorator, а также тег portlet-decorator-css-class являются обязательными. Name используется в интерфейсе как отображаемое имя декоратора, а с помощью id на декоратор можно сослаться из темплейта страницы. Тег portlet-decorator-css-class задаёт имя CSS-класса, который будет добавлен к тегу-обёртке.

Рис. 3. Разметка портлета с декоратором barebone в Liferay 7

Можно объявить любое количество декораторов в рамках одной темы и менять их в настройках портлета, а также назначить дефолтный декоратор для темы.

Рис.4 Интерфейс настроек портлета Liferay 7

Стили для каждого декоратора задаются в CSS-файлах темы.

_portlet_decorator.scss

.portlet-decorate .portlet-content {
  background:#fff;
  border-color:#e7e7e7;
  border-style:solid;
  border-width:1px 1px 1px 1px;
  word-wrap:break-word
}
.portlet-barebone .portlet-content {
  padding:0
}

_custom.scss

@import "portlet_decorator"

В шаблонах страниц можно определить декоратор для конкретного портлета или изменять вёрстку в зависимости от выбранного декоратора (ниже примеры из официальной документации).

navigation.ftl

<#assign VOID = freeMarkerPortletPreferences.setValue("portletSetupPortletDecoratorId", "barebone")>

<div aria-expanded="false" class="collapse navbar-collapse" id="navigationCollapse">
    <#if has_navigation && is_setup_complete>
        <nav class="${nav_css_class} site-navigation" id="navigation" role="navigation">
           <div class="navbar-form navbar-right" role="search">
             <@liferay.search default_preferences="${freeMarkerPortletPreferences}" />
           </div>

           <div class="navbar-right">
             <@liferay.navigation_menu default_preferences="${freeMarkerPortletPreferences}" />
           </div>
        </nav>
    </#if>
</div>

<#assign VOID = freeMarkerPortletPreferences.reset()>

portlet.ftl

<#if portlet_display.getPortletDecoratorId() != "barebone">
        <h2 class="portlet-title-text">${portlet_title}</h2>
</#if>

 

Полезные ссылки

From Liferay Portal 6 to 7
Portlet Decorators
Adding Portlet Decorators to a Theme
Upgrading Your Theme from Liferay Portal 6.2 to 7.0