Необходимые инструменты
Для разработки портлетов под Liferay необходимы следующие инструменты:- Сам Liferay, лучше всего с Tomcat (или другим сервером). Скачать можно тут: http://www.liferay.com/downloads/liferay-portal/available-releases
- Liferay Plugins SDK – скачиваем там же.
- Eclipse IDE for Java EE Developers – скачиваем тут: http://www.eclipse.org/downloads/
- Apache Ant – скачиваем тут: http://ant.apache.org/bindownload.cgi
- Необходимо, чтобы был установлен JDK – можно взять отсюда: http://www.oracle.com/technetwork/java/javase/downloads/index.html
Настройка среды и запуск портала
Предположим, что имеем следующие пути:- JDK – D:\Liferay\jdk1.6.0_24\
- Ant – D:\Liferay\apache-ant-1.8.2\
- Liferay Portal – D:\Liferay\liferay-portal-6.0.6\
- Liferay Plugins SDK – D:\Liferay\liferay-plugins-sdk-6.0.6-20110225\
Установка переменных окружения
Для Windows 7 нажимаем кнопку Пуск, правой кнопкой мыши по пункту Компьютер. Выбираем Свойства. В появившемся окне слева выбираем Дополнительные параметры системы. В появившемся окне на вкладке Дополнительно внизу нажимаем на кнопку Переменные среды. Создаем переменные:- Имя – JAVA_HOME, значение D:\Liferay\jdk1.6.0_24\
- Имя – ANT_HOME, значение D:\Liferay\apache-ant-1.8.2\
Настройка 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 операций и сервисов.- Создает Hibernate Mappings.
- Создает Hints (файлы содержащие информацию и упрощающие генерацию UI).
- Создает Persistance Service (DAO).
- Создает Local & Remote сервисы.
- Автоматически создает базовые CRUD операции.
Вот пример содержания этого файла:
<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, он добавит эти методы в интерфейсы. Настройка портлетов
Для описания и настройки портлетов используется несколько файлов:- portlet.xml – общее описание портлетов
- liferay-portlet.xml – описание, специфическое для Liferay
- liferay-display.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 категории:- Personal – используется для пунктов меню, которые доступны для зарегистрированных пользователей
- Content – используется для администрирования любого контента на портале
- Portal – содержит средства администрирования, которые влияют на весь портал
- Server – содержит средства администрирования, которые влияют на сервер
Файл 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.
Забыли указать, что плагин эклипса для 6-го лайфрея есть только для версии гелиос (3.6) и индиго (3.7). Лайфрей мало документирован, практически никак, у Вашего блога есть все шансы стать популярным.
ОтветитьУдалитьАня, большое спасибо! Твоя статья помогла сделать первый шаг в покорении эти бесноватых портлетов.))))
ОтветитьУдалитьПиши чего-нить еще)))
По поводу плагина - да, для 6 версии (вроде 6.0.6, если быть точнее) есть под гелиос - сама пользуюсь. А вот под индиго я не встречала. В свое время из-за этого пришлось возвращаться на гелиос. Хотя может уже есть, не уточняла.
ОтветитьУдалитьСпасибо. Приятно что писала не напрасно.
Спасибо большое за статью! =)
ОтветитьУдалитьОчень выручили в свое время, спасши не один час личной жизни. =)
С официальной документацией как-то грустновато, увы...
Очень рада, что статейку почитываете, и с пользой даже )))
ОтветитьУдалитьХотя я сейчас больше не занимаюсь Liferay, так что давно уже не писала ничего на эту тематику, и в ближайшее время не предвидится...