6 октября 2011 г.

Создание портлетов для Liferay

Необходимые инструменты

Для разработки портлетов под Liferay необходимы следующие инструменты:
  1. Сам Liferay, лучше всего с Tomcat (или другим сервером). Скачать можно тут: http://www.liferay.com/downloads/liferay-portal/available-releases
  2. Liferay Plugins SDK – скачиваем там же.
  3. Eclipse IDE for Java EE Developers – скачиваем тут: http://www.eclipse.org/downloads/
  4. Apache Ant – скачиваем тут: http://ant.apache.org/bindownload.cgi
  5. Необходимо, чтобы был установлен JDK – можно взять отсюда: http://www.oracle.com/technetwork/java/javase/downloads/index.html

Настройка среды и запуск портала

Предположим, что имеем следующие пути:
  1. JDK – D:\Liferay\jdk1.6.0_24\
  2. Ant – D:\Liferay\apache-ant-1.8.2\
  3. Liferay Portal – D:\Liferay\liferay-portal-6.0.6\
  4. Liferay Plugins SDK – D:\Liferay\liferay-plugins-sdk-6.0.6-20110225\

Установка переменных окружения

Для Windows 7 нажимаем кнопку Пуск, правой кнопкой мыши по пункту Компьютер. Выбираем Свойства. В появившемся окне слева выбираем Дополнительные параметры системы. В появившемся окне на вкладке Дополнительно внизу нажимаем на кнопку Переменные среды. Создаем переменные:
  1. Имя – JAVA_HOME, значение D:\Liferay\jdk1.6.0_24\
  2. Имя – ANT_HOME, значение D:\Liferay\apache-ant-1.8.2\
Находим переменную PATH и добавляем в конце %JAVA_HOME%\bin;%ANT_HOME%\bin. Пути разделять ';'.

Настройка Eclipse

Запускаем Eclipse. Выбираем в меню Help -> Install New Software… В поле Work With указываем http://releases.liferay.com/tools/ide/eclipse/helios/stable/ и нажимаем Enter. Устанавливаем плагин Liferay IDE, перезапускаем Eclipse. В панели появятся новые кнопки. На правой кнопке из меню выбираем New Liferay SDK. В диалоге указываем путь к Liferay SDK – D:\Liferay\liferay-plugins-sdk-6.0.6-20110225. На этой же кнопке выбираем меню New Liferay Server. Внизу возле Server Runtime Environment справа жмем Add. Указываем путь к корню Tomcat, который находится в каталоге Liferay Portal – D:\Liferay\liferay-portal-6.0.6 \tomcat-6.0.29. Для удобства можно переключиться на Perspective Liferay. На данном этапе можно запускать сервер. После запуска портал доступен по адресу http://localhost:8080.

Создание портлета

Создавать портлеты (хуки, темы и другие плагины) можно 2 способами. Непосредственно из Eclipse или напрямую в SDK и затем импортировать проект в Eclipse.

Создание портлета из Eclipse

В одном проекте-плагине может содержаться несколько портлетов (например, один для отображения пользователям, другой для панели управления), хуков. Необходимо вначале создать проект. Для этого выбираем File -> New -> Liferay Project (или аналогичная команда из панели Liferay). Затем добавляем портлет: File -> New -> Liferay Portlet. В окне создания нового портлета нужно указать, в каком проекте он будет создан. Так же указывается пакет и класс для портлета. Далее указываем параметры для портлета – название, отображаемое имя, режимы отображения (как стандартные для портлетов, так и специфические для портлетов Liferay). Можно указать еще и дополнительные параметры, например, категория Liferay, в которой будет отображаться портлет в списке.

Есть небольшой нюанс. У меня при создании портлета таким образом Service Builder срабатывал без ошибок, но не создавал никаких классов по описанию таблиц в service.xml.

Создание портлета в Plugins SDK

Plugins SDK позволяет создавать базовую структуру проекта с помощью Ant. В каталоге Plugins SDK есть подкаталоги – portlets, hooks, themes и т.д. В каждом из них лежит файл скрипта для создания соответствующего проекта. Для создания портлета необходимо перейти в каталог D:\Liferay\liferay-plugins-sdk-6.0.6-20110225\portlets. В командной консоли выполнить
create <имя_портлета> <Отображаемое Имя> 
Например:
create example-sdk "Example SDK Portlet" 
После этого появится каталог проекта портлета portlets\example-sdk-portlet.

Импорт проекта в Eclipse

Запускаем Eclipse, выбираем File -> Import -> Liferay -> Liferay Plugins SDK Project.

Использование Service Builder

Service Builder – средство для автоматической генерации CRUD операций и сервисов.
  1. Создает Hibernate Mappings.
  2. Создает Hints (файлы содержащие информацию и упрощающие генерацию UI).
  3. Создает Persistance Service (DAO).
  4. Создает Local & Remote сервисы.
  5. Автоматически создает базовые CRUD операции.
Для использования Service Builder необходимо в каталоге docroot/WEB-INF создать файл service.xml.

Вот пример содержания этого файла:

<service-builder package-path="com.citeck.example ">
     <author>Hanna Eismant</author>
     <namespace>EXT</namespace>
     <entity name="Product" local-service="true" 
                remote-service="false">
         <!-- PK Fields -->
         <column name="productId" type="long" primary="true" />
         <!-- Other Fields -->
         <column name="productName" type="String" />
         <!-- Foreign Keys -->
         <column name="categoryId" type="long" />
         <!-- Order -->
         <order by="asc">
             <order-column name="productName" />
         </order>
         <finder name="CategotyId" return-type="Category">
             <finder-column name="categoryId" />
         </finder>
     </entity>
     <entity name="Category" local-service="true" 
                remote-service="false">
         <!-- PK Fields -->
         <column name="categoryId" type="long" primary="true" />
         <!-- Other Fields -->
         <column name="categoryName" type="String" />
         <!-- Relationships -->
         <column name="products" type="Collection" entity="EXTProduct" mapping-key="productId" />
         <!-- Order -->
         <order by="asc">
             <order-column name="categoryName" />
         </order>
     </entity>
 </service-builder>
При таком описании портлет будет обращаться к таблицам EXT_Product и EXT_Category. Service Builder создаст интерфейсы и классы для реализации этих интерфейсов. Для этого service.xml вносить изменения нужно в com.citeck.example.servise.impl.EXTProductLocalServiceImpl и com.citeck.example.servise.impl.EXTCategoryLocalServiceImpl. После добавления в эти классы методов необходимо снова запустить Service Builder, он добавит эти методы в интерфейсы.

Настройка портлетов

Для описания и настройки портлетов используется несколько файлов:
  1. portlet.xml – общее описание портлетов
  2. liferay-portlet.xml – описание, специфическое для Liferay
  3. liferay-display.xml – привязывает портлеты к категориям в списке портлетов
Пример portlet.xml:


 <portlet>
     <portlet-name>example-portlet</portlet-name>
     <display-name>Example Portlet</display-name>
     <portlet-class>com.citeck.example.ExamplePortlet</portlet-class>
     <init-param>
         <name>view-jsp</name>
         <value>/view.jsp</value>
     </init-param>
     <expiration-cache>0</expiration-cache>
     <supports>
         <mime-type>text/html</mime-type>
     </supports>
     <portlet-info>
         <title>Example Portlet</title>
         <short-title>Example Portlet</short-title>
         <keywords>Example Portlet</keywords>
     </portlet-info>
     <security-role-ref>
         <role-name>administrator</role-name>
     </security-role-ref>
     <security-role-ref>
         <role-name>guest</role-name>
     </security-role-ref>
     <security-role-ref>
         <role-name>power-user</role-name>
     </security-role-ref>
     <security-role-ref>
         <role-name>user</role-name>
     </security-role-ref>
 </portlet>
В liferay-portlet.xml описываются параметры для портлетов, которые являются специфическими для Liferay. Например, в этом файле можно настроить, чтобы в панели управления было меню для портлета.

Пример такой настройки:

<portlet>
    <portlet-name>admin-example-portlet</portlet-name>
    <icon>/icon.png</icon>
    <control-panel-entry-category>
        content
    </control-panel-entry-category>
</portlet>
Всего есть 4 категории:
  1. Personal – используется для пунктов меню, которые доступны для зарегистрированных пользователей
  2. Content – используется для администрирования любого контента на портале
  3. Portal – содержит средства администрирования, которые влияют на весь портал
  4. Server – содержит средства администрирования, которые влияют на сервер
Файл liferay-display.xml позволяет настраивать, в какой категории портлет будет отображаться в списке портлетов для добавления на страницу. Значение category.hidden скрывает портлет из списка.

Файл service.xml необходимо перекинуть из docroot/WEB-INF в каталог src.

Далее необходимо привязать actions к портлету и классам. Для этого в src нужно создать файл portlet.properties со следующим содержимым:


resource.actions.configs=resource-actions/default.xml


Нужно создать каталог src/resource-actions, в нем файл default.xml.

Пример такого файла:

<resource-action-mapping>
     <portlet-resource>
         <portlet-name>example-portlet</portlet-name>
         <supports>
             <action-key>ADD_PRODUCT</action-key>
             <action-key>VIEW</action-key>
         </supports>
         <community-defaults>
             <action-key>VIEW</action-key>
         </community-defaults>
         <guest-defaults>
             <action-key>VIEW</action-key>
         </guest-defaults>
         <guest-unsupported>
             <action-key>ADD_PRODUCT</action-key>
         </guest-unsupported>
     </portlet-resource>
     <model-resource>
         <model-name>com.citeck.example.model.Product</model-name>
         <portlet-ref>
             <portlet-name>admin-portlet</portlet-name>
         </portlet-ref>
         <supports>
             <action-key>DELETE</action-key>
             <action-key>PERMISSIONS</action-key>
             <action-key>UPDATE</action-key>
             <action-key>VIEW</action-key>
         </supports>
         <community-defaults>
             <action-key>VIEW</action-key>
         </community-defaults>
         <guest-defaults>
             <action-key>VIEW</action-key>
         </guest-defaults>
         <guest-unsupported>
             <action-key>UPDATE</action-key>
         </guest-unsupported>
     </model-resource>
 </resource-action-mapping>

Как получить пользователя

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

ThemeDisplay themeDisplay = 
    (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
User user = themeDisplay.getUser();
Также с помощью объекта themeDisplay можно получить companyId и groupId.

5 комментариев:

  1. Забыли указать, что плагин эклипса для 6-го лайфрея есть только для версии гелиос (3.6) и индиго (3.7). Лайфрей мало документирован, практически никак, у Вашего блога есть все шансы стать популярным.

    ОтветитьУдалить
  2. Аня, большое спасибо! Твоя статья помогла сделать первый шаг в покорении эти бесноватых портлетов.))))
    Пиши чего-нить еще)))

    ОтветитьУдалить
  3. По поводу плагина - да, для 6 версии (вроде 6.0.6, если быть точнее) есть под гелиос - сама пользуюсь. А вот под индиго я не встречала. В свое время из-за этого пришлось возвращаться на гелиос. Хотя может уже есть, не уточняла.

    Спасибо. Приятно что писала не напрасно.

    ОтветитьУдалить
  4. Спасибо большое за статью! =)

    Очень выручили в свое время, спасши не один час личной жизни. =)

    С официальной документацией как-то грустновато, увы...

    ОтветитьУдалить
  5. Очень рада, что статейку почитываете, и с пользой даже )))
    Хотя я сейчас больше не занимаюсь Liferay, так что давно уже не писала ничего на эту тематику, и в ближайшее время не предвидится...

    ОтветитьУдалить