Автор: Пользователь скрыл имя, 17 Сентября 2012 в 23:48, практическая работа
Как объяснялось в предыдущей главе, страницы портала как правило, включает заголовок с логотипом, навигация по меню (горизонтальное и/или вертикальной вкладок навигации), площадь окна портала содержание и колонтитул. Есть два уровня абстракции, чтобы создать страницу портала в Liferay.
WebKeys.THEME_DISPLAY: Все настройки, связанные с объектом themeDisplay
Вы можете настроить дослужебной события, предоставляя собственную реализацию таких как com.your.own.impl.ServicePreAc
servlet.service.events.pre = com.your.own.impl.
4. Код темы инфраструктуры будет вызывать com.liferay.taglib.util.ThemeU
5. При использовании скорости основе темы, запрос будет проходить через com.liferay.portal.velocity.Ve
6. / /html/common/themes/portal.jsp является "верхним уровнем" отображения страницы. Он выбирает portal_normal.jsp или portal_pop_up.jsp на основе текущего состояния отображения темы, и включает его, используя <liferay-theme:include> пользовательских тегов, осуществляемый com.liferay.taglib.theme.Inclu
7. MainServlet.callParentService(
8. Struts вызывается для обработки запроса на обслуживание. Liferay использует пользовательский запрос Struts процессор com.liferay.portal.struts.Port
9. Как указано ниже, в ${PORTAL_ROOT_HOME}/WEB-INF/st
<action path="/portal/layout" type="com.liferay.portal.
<forward name="portal.layout" path="portal.layout" />
</action>
10. Следующая конфигурация в ${PORTAL_ROOT_HOME}/WEB-INF/
<definition name="portal.layout" extends="portal">
<put name="content" value="/portal/layout.jsp" />
<put name="selectable" value="true" />
</definition>
11. В LayoutAction.execute метод, используется следующий код, чтобы получить themeDisplay и верстка:
ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute (WebKeys.THEME_DISPLAY);
Макета = themeDisplay.getLayout ();
12. LayoutAction.processLayout звонки includeLayoutContent метод, как показано ниже:
includeLayoutContent (запрос, ответ, themeDisplay, верстка);
13. LayoutAction.includeLayoutCont
String path = StrutsUtil.TEXT_HTML_DIR;
/* path = "/html" */
path += PortalUtil.getLayoutViewPage(
/* path = "/html/portal/layout/view/
RequestDispatcher rd = ctx.getRequestDispatcher(path)
rd.include(req, stringServletRes);
14. LayoutAction.processLayout метод оказывает /html/portal/layout.jsp как часть страницы портала. Это достигается, как показано ниже:
return mapping.findForward("portal.
Как вы можете видеть в шагах 13 и 14, выше portlet.jsp и layout.jsp являются двумя ключевыми файлами в портал рендеринга страницы. Портал включает в себя оказание расположение содержимого до загрузки страницы, потому портлетов на странице можно задать заголовок страницы и подзаголовок.
Теперь давайте более подробно рассмотрим / HTML / портал / макет / просмотр / portlet.jsp файл. Следующую строку занимает velocityTemplateContent качестве входного атрибута.
RuntimePortletUtil.
pageContext, velocityTemplateId, velocityTemplateContent)
При выводе этой velocityTemplateContent в консоли, и вы должны быть в состоянии видеть выход, как показано на следующем, когда вы используете пользовательский шаблон 1_3_columns шаблон, который мы создали ранее в этой главе.
<div class="columns-3" id="main-content" role="main">
<table class="portlet-layout">
<tr>
<td class="portlet-column portlet-column-only" id="column-1" colspan="3">
$processor.processColumn("
</td>
</tr>
<tr>
<td class="aui-w33 portlet-column portlet-column-first" id="column-2">
$processor.processColumn("
</td>
<td class="aui-w33 portlet-column" id="column-3">
$processor.processColumn("
</td>
<td class="aui-w33 portlet-column portlet-column-last" id="column-4">
$processor.processColumn("
</td>
</tr>
</table>
</div>
Означает ли это выглядеть знакомо? Этот выход точно такие же, как в 1_3_columns.tpl который мы создали в шаблон макета 1_3_columns. Видите ли, мы создали пользовательский шаблон, применил его к странице портала, и этот файл шаблона макета назначается именно так, как это должно velocityTemplateContent атрибут.
Теперь давайте вернемся к RuntimePortletUtil.
<div class="columns-3" id="main-content" role="main">
<table class="portlet-layout">
<tr>
<td class="portlet-column portlet-column-only" id="column-1" colspan="3">
[$TEMPLATE_COLUMN_column-1$]
</td>
</tr>
<tr>
<td class="aui-w33 portlet-column portlet-column-first" id="column-2">
[$TEMPLATE_COLUMN_column-2$]
</td>
<td class="aui-w33 portlet-column" id="column-3">
[$TEMPLATE_COLUMN_column-3$]
</td>
<td class="aui-w33 portlet-column portlet-column-last" id="column-4">
[$TEMPLATE_COLUMN_column-4$]
</td>
</tr>
</table>
</div>
Затем он генерирует следующий код, если у нас есть четыре портлетов, B, C, D и на этой странице и они загружены в колонках 1, 2, 3 и 4, соответственно.
<div class="columns-3" id="main-content" role="main">
<table class="portlet-layout">
<tr>
<td class="portlet-column portlet-column-only" id="column-1" colspan="3">
[$TEMPLATE_PORTLET_A$]
</td>
</tr>
<tr>
<td class="aui-w33 portlet-column portlet-column-first" id="column-2">
[$TEMPLATE_PORTLET_B$]
</td>
<td class="aui-w33 portlet-column" id="column-3">
[$TEMPLATE_PORTLET_C$]
</td>
<td class="aui-w33 portlet-column portlet-column-last" id="column-4">
[$TEMPLATE_PORTLET_D$]
</td>
</tr>
</table>
</div>
Это достигается путем следующий код в метод RuntimePortletUtil.processTemp
Map<String, String> columnsMap = processor.getColumnsMap();
Iterator<Map.Entry<String, String>> columnsMapItr =
columnsMap.entrySet().
while (columnsMapItr.hasNext()) {
Map.Entry<String, String> entry = columnsMapItr.next();
String key = entry.getKey();
String value = entry.getValue();
output = StringUtil.replace(output, key, value);
}
Для каждого столбца в макете страницы, класс PortletColumnLogic процессов каждого портлета использованием processContent() метод. В этом методе, HTML, которая окружает каждого окна портала не генерируется. Дальнейшая обработка затем делегированы метод RuntimePortletUtil.processPort
В конце концов, для каждого окна портала, методом com.liferay.portal.util.Portal
Наконец, следующая строка в конце RuntimePortletUtil.processTemp
return StringUtil.replace(output, "[$TEMPLATE_PORTLET_", "$]?", contentsMap);
Теперь тема, окон портала и шаблон макета на странице все обработке и подготовке. ProcessServicePost (запрос, ответ) метод Главная Servlet вызывается в конце концов блок внутри службы сервлета (запрос, ответ) метод.
Процесс метод класса com.liferay.portal.events.Even
servlet.service.events.post=
Как и в дослужебной событий, вы можете настроить пост-служба событий, предоставляя собственную реализацию таких как com.your.own.impl.ServicePostA
servlet.service.events.post=
Этот процесс над излагаются некоторые из основных шагов для отображения страницы портала с темой, шаблон макета, а также один или несколько окон портала. Это довольно сложная цепь действий. Для простоты, некоторые другие вызовы API в этом процессе, не перечисленные здесь.
По умолчанию конфигурации для верстки шаблона
Liferay Portal набора сотни конфигурации по умолчанию в portal.properties файл, который упакован в ${PORTAL_ROOT_HOME}/WEB-INF/li
Настройка шаблона макета по умолчанию ID
По умолчанию, Liferay использует 2_columns_ii шаблон макета по умолчанию макета. Если вы хотите, вы можете изменить это значение по умолчанию на свой собственный шаблон дизайна, такие как 1_3_columns шаблон макета, который мы создали в начале этой главы. Это можно сделать, добавив следующую строку portal-ext.properties файл установки Liferay. Обратите внимание, что вы можете найти ID шаблон макета в liferay-layout-templates.xml файл макета шаблона.
default.layout.template.id=1_
Остальные настройки по умолчанию, такие как по умолчанию Гость общественного макеты, по умолчанию Пользователь общественного макеты, пользователя по умолчанию Частные макеты и т.д. также может быть настроен на портале ext.properties-файл. Вы можете найти более подробную информацию о первоначальным настройкам по умолчанию в portal.properties.
Резюме
В этой главе вы узнали основные понятия Liferay макет портала, и как тема, макет и портлеты работают вместе, чтобы создать страницу портала, как создать свой собственный шаблон макета и отрисовки страниц кода потока, и так далее .
В следующей главе, мы будем смотреть на стиль страницы портала.