Chi tiết du lịch
Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
Java method "com.sun.proxy.$Proxy173.getCategory(long)" threw an exception when invoked on com.sun.proxy.$Proxy173 object "com.swt.portal.servicewrappers.AssetCategoryServiceOverride@687720c2"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: category = AssetCategoryService.getCa... [in template "20115#20151#306336" at line 229, column 17] - Reached through: #assign-container [in template "20115#20151#306336" at line 227, column 9] ----
1<style scope>
2 .taglib-categorization-filter{
3 display:none
4 }
5
6 .article-container{
7 height: 350px;
8 }
9 .article-container img{
10 height: 150px;
11 width: 100%;
12 object-fit: cover;
13 }
14
15 .article-title{
16 color: #0b5090;
17 text-decoration: none !important;
18 font-weight: bold;
19 padding: 0;
20 font-weight: bold;
21 font-size: 16px;
22 margin: 10px 0;
23 }
24
25 .article-description{
26 text-align: justify;
27 }
28 .article-description b{
29 margin-right: 5px;
30 }
31 .article-container{
32 padding: 0;
33 margin-bottom: 15px;
34 }
35 .article-title a{
36 color: #0b5090;
37 }
38 .category-cover img{
39 width: 100%;
40 max-height: 500px;
41 object-fit: cover;
42 }
43 .list-container{
44 font-size: 14px;
45 }
46 .publish-date{
47 font-weight: bold;
48 color: grey;
49 }
50 .cms-title-category a{
51 color: #d70000;
52 font-weight: bold;
53 }
54 .title-category-container{
55 padding: 12px 0px 10px 12px;
56 border-bottom: 1px dotted #CBCBCB;
57 margin-bottom: 10px;
58 background: linear-gradient(#e9e9e9, #fbfbfb);
59 }
60 .search-date{
61 padding: 0;
62 float: left;
63 margin: 0 0 8px -10px;
64 display: flex;
65 }
66 .search-lable{
67 text-align: right;
68 padding: 8px;
69 font-weight: bold;
70 }
71 .search-input{
72 padding: 4px 1px 5px 5px;
73 }
74 #dateSearch {
75 height: 24px;
76 border: 1px solid #C8C9CA;
77 border-radius: 4px;
78 background: #fff;
79 width: 133px;
80 }
81 .btn-primary {
82 background-color: #337ab7;
83 height: 24px;
84 position: relative;
85 top: 4px;
86 width: 56px;
87 left: 43px;
88 border: 1px solid;
89 border-color: #C8C9CA #9E9E9E #9E9E9E #C8C9CA;
90 background: linear-gradient(#ffffff, #f2f2f2, #dedede, #d9d9d9);
91 Font-size: 12px;
92 font-weight: bold;
93 color: #2c6c97;
94 padding: 3px;
95 }
96 .taglib-page-iterator {
97 padding: 0 15px;
98 }
99 .lfr-icon-menu-text, .search-results, .lfr-pagination-buttons{
100 font-size: 12px;
101 }
102 .btn:hover {
103 border: 1px solid #204d74;
104 }
105 .btn-primary:active:hover{
106 color: #2c6c97;
107 border: 1px solid;
108 border-color: #C8C9CA #9E9E9E #9E9E9E #C8C9CA;
109 }
110 .taglib-page-iterator{
111 padding: 0 15px;
112 }
113 .taglib-page-iterator .search-results, .lfr-pagination-buttons, .lfr-icon-menu-text{
114 font-size: 12px;
115 }
116
117 .search-results, .lfr-pagination-delta-selector{
118 display: none !important;
119 }
120
121 .clearfix{
122 display: flex;
123 }
124
125 .lfr-pagination-buttons{
126 margin: 10px 0 0 auto !important;
127 }
128
129 .portlet-title{
130 width: 100%;
131 font-size: 20px;
132 margin: 10px 0px;
133 padding: 10px 0px;
134 border-bottom: 1px solid #333D71;
135 text-transform: uppercase;
136 font-weight: bold;
137 color: #CA1A1A;
138 }
139 .portlet-title-category{
140 width: 100%;
141 text-align: center;
142 font-size: 20px;
143 margin: 10px 0px;
144 padding: 10px 0px;
145 text-transform: uppercase;
146 font-weight: bold;
147 color: #000;
148 border-bottom: 1px solid #d00;
149 }
150
151 @media only screen and (max-width: 767px){
152 .list-container {
153 padding: 6px;
154 }
155 .article-container {
156 margin-top: 0;
157 border-bottom: 1px dashed #cbcbcb;
158 }
159 .search-button{
160 padding: 0;
161 }
162 .search-button .btn-primary{
163 left: 0;
164 }
165 .search-lable {
166 text-align: left;
167 padding: 8px 0 0 6px;
168 }
169 .search-date{
170 margin: 0;
171 }
172 .taglib-page-iterator{
173 padding: 0 6px;
174 }
175 .taglib-page-iterator .lfr-pagination-buttons{
176 display: flex;
177 }
178 .taglib-page-iterator .lfr-pagination-buttons>li>a{
179 width: 99%;
180 border-radius: 4px;
181 }
182 .taglib-page-iterator .lfr-pagination-config .current-page-menu .btn{
183 margin: 0 0 5px 0;
184 }
185 .search-results{
186 display: none !important;
187 line-height: 35px !important;
188 color: #9e9e9e;
189 }
190
191 .clearfix{
192 display: unset;
193 }
194 }
195 .form-control:focus {
196 box-shadow: inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px rgb(255, 255, 255);
197
198}
199</style>
200
201<#assign enableButtonEditArticle = "false" />
202<#list portletPreferences?keys as preference>
203 <#-- Check if button edit is enabled. -->
204 <#if preference == "enableButtonEdit" >
205 <#list portletPreferences[preference] as value>
206 <#assign enableButtonEditArticle = value />
207 <#break>
208 </#list>
209 </#if>
210</#list>
211
212<#--firstCategoryId là gia trị được truyền từ template Danh sách tin tuc , và nó dùng làm chuyên mục chính-->
213
214<#assign firstCategoryId = paramUtil.getString(renderRequest, "categoryId") />
215<#assign httpRequest = portalUtil.getOriginalServletRequest(portalUtil.getHttpServletRequest(renderRequest))>
216<#assign AssetCategoryService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryService")>
217<#assign AssetCategoryPropertyLocalServiceUtil = staticUtil["com.liferay.asset.kernel.service.AssetCategoryPropertyLocalServiceUtil"]/>
218<#assign DLFileEntryLocalServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLFileEntryLocalService")/>
219
220<#assign dateSearch = getterUtil.getString(httpRequest.getParameter("p_r_p_date"))
221 idCategory = ""
222 nameCategory = "Điểm đến du lịch"
223 url = ""
224/>
225
226<#if (firstCategoryId != "")>
227 <#assign
228 idCategory = firstCategoryId
229 category = AssetCategoryService.getCategory(idCategory?number)
230 nameCategory = category.getName()
231 />
232 <#assign categoryPropertyList = AssetCategoryPropertyLocalServiceUtil.getCategoryProperties(idCategory?number)/>
233
234 <#if categoryPropertyList?has_content>
235 <#list categoryPropertyList as categoryProperty>
236 <#if (categoryProperty.getKey() == "icon")>
237 <#assign idDLEntry = categoryProperty.getValue()/>
238 <#if (idDLEntry?number > 0)>
239 <#assign fileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(idDLEntry?number) />
240 <#assign fileNameUrl = fileEntry.getTitle()/>
241 <#assign folderId = fileEntry.getFolderId()/>
242 <#assign url = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + themeDisplay.getScopeGroupId() + "/" + folderId + "/" + fileNameUrl />
243
244 </#if>
245 </#if>
246 </#list>
247 </#if>
248<#else>
249 <#assign idCategory = getterUtil.getString(httpRequest.getParameter("p_r_p_categoryId"))>
250 <#if (idCategory?length > 0) >
251 <#assign
252 category = AssetCategoryService.getCategory(idCategory?number)
253 nameCategory = category.getName()
254 />
255 <#assign categoryPropertyList = AssetCategoryPropertyLocalServiceUtil.getCategoryProperties(idCategory?number)/>
256
257 <#if categoryPropertyList?has_content>
258 <#list categoryPropertyList as categoryProperty>
259 <#if (categoryProperty.getKey() == "icon")>
260 <#assign idDLEntry = categoryProperty.getValue()/>
261 <#if (idDLEntry?number > 0)>
262 <#assign fileEntry = DLFileEntryLocalServiceUtil.getDLFileEntry(idDLEntry?number) />
263 <#assign fileNameUrl = fileEntry.getTitle()/>
264 <#assign folderId = fileEntry.getFolderId()/>
265 <#assign url = themeDisplay.getPortalURL() + themeDisplay.getPathContext() + "/documents/" + themeDisplay.getScopeGroupId() + "/" + folderId + "/" + fileNameUrl />
266
267 </#if>
268 </#if>
269 </#list>
270 </#if>
271
272 </#if>
273</#if>
274<div class="list-header">
275<#if (url?length>0) >
276<div class="category-cover">
277 <img src="${url}" />
278</div>
279<h2 class="portlet-title-category">${nameCategory}</h2>
280<#else>
281<h2 class="portlet-title ${url}">${nameCategory}</h2>
282</#if>
283</div>
284
285<div class="row list-container">
286 <#if entries?has_content>
287 <#if validator.isNull(dateSearch)>
288 <#assign listToShow = entries >
289 <#else>
290 <#assign dateSearch = htmlUtil.escape(dateSearch) />
291 <#assign listToShow = [] >
292 <#list entries?chunk(1) as i>
293 <#assign dateSearch_DateObj = dateUtil.parseDate("dd/MM/yyyy", dateSearch, locale) />
294 <#assign curEntryDate = i?first.getPublishDate() />
295 <#if dateSearch_DateObj?date?string.short?contains(curEntryDate?date?string.short) >
296 <#assign listToShow = listToShow + i>
297 </#if>
298 </#list>
299 </#if>
300 <#list listToShow as curEntry>
301 <#assign
302 curEntry = curEntry
303
304 renderer = curEntry.getAssetRenderer()
305 article = renderer.getArticle() >
306
307 <#assign firstImgUrl = "" />
308
309 <#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
310 <#assign journalArticle = journalArticleLocalService.fetchLatestArticle(curEntry.getClassPK()) />
311 <#assign entryTitle = htmlUtil.escape(renderer.getTitle(locale)) />
312
313 <#if validator.isNotNull(journalArticle)>
314 <#assign content = journalArticle.getContent() />
315 <#if content?contains("<img")>
316 <#assign firstIndexImg = content?index_of("<img") />
317 <#assign newContent = content?substring(firstIndexImg)/>
318 <#assign lastIndexImg = newContent?index_of(">") />
319 <#assign newContent = newContent?substring(0, lastIndexImg)/>
320
321 <#assign strLenght= "src=\"" />
322 <#assign indexSrc = newContent?index_of(strLenght) + strLenght?length />
323 <#assign firstImgUrl = newContent?substring(indexSrc) />
324 <#assign lastIndexSrc = firstImgUrl?index_of("\"") />
325 <#assign firstImgUrl = firstImgUrl?substring(0,lastIndexSrc) />
326 </#if>
327 </#if>
328 <#assign touristPhone = ""/>
329 <#assign timeActive = ""/>
330 <#assign address = ""/>
331 <#assign website = ""/>
332 <#assign document = saxReaderUtil.read(content) />
333 <#assign root = document.getRootElement() />
334 <#list root.elements() as element>
335 <#if element.attributeValue("name") == "phone" >
336 <#assign touristPhone = getterUtil.getString(element.element("dynamic-content").getText())>
337 </#if>
338 <#if element.attributeValue("name") == "address" >
339 <#assign address = getterUtil.getString(element.element("dynamic-content").getText())>
340 </#if>
341 <#if element.attributeValue("name") == "timeActive" >
342 <#assign timeActive = getterUtil.getString(element.element("dynamic-content").getText())>
343 </#if>
344 <#if element.attributeValue("name") == "website" >
345 <#assign website = getterUtil.getString(element.element("dynamic-content").getText())>
346 </#if>
347 <#if element.attributeValue("name") == "timeActive" >
348 <#assign timeActive = getterUtil.getString(element.element("dynamic-content").getText())>
349 </#if>
350 </#list>
351
352
353 <#if article.getSmallImage()>
354 <#assign imgThumbnailURL = renderer.getThumbnailPath(renderRequest)>
355 <#elseif (firstImgUrl?length > 0)>
356 <#assign imgThumbnailURL = firstImgUrl>
357 <#else>
358 <#assign imgThumbnailURL = "/o/hcm-default-theme/images/cms/no-image.jpg" >
359 </#if>
360
361 <#assign publishDate = curEntry.getCreateDate() />
362 <#if (curEntry.getPublishDate()??) >
363 <#assign publishDate = curEntry.getPublishDate() />
364 </#if>
365
366 <#assign publishDate_txt = "(" + publishDate?date?string["dd/MM/yyyy"] + ")" />
367 <#assign urlArticle = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, renderer, curEntry, !stringUtil.equals(assetLinkBehavior, "showFullContent")) />
368
369 <div class="col-xs-12 col-sm-12 col-md-4 col-lg-4 article-wrapper">
370 <div class="article-container">
371 <a href="${urlArticle}">
372 <img src="${imgThumbnailURL}" width=100%/>
373 </a>
374 <div class="article-title">
375 <a href="${urlArticle}">
376 ${article.getTitle()?replace('<[^>]+>','','r')}
377 </a>
378 <#if enableButtonEditArticle == "true">
379 <@getEditIcon />
380 </#if>
381 </div>
382 <div class="article-description">
383 <div>
384 <b>Website:</b>${website}
385 </div>
386 <div>
387 <b>Địa chỉ:</b>${address}
388 </div>
389 <div>
390 <b>Số điện thoại:</b>${touristPhone}
391 </div>
392 <div>
393 <b>Thời gian hoạt động:</b>${timeActive}
394 </div>
395 </div>
396 </div>
397
398 </div>
399 </#list>
400 </#if>
401</div>
402<#macro getEditIcon>
403 <#if renderer.hasEditPermission(themeDisplay.getPermissionChecker())>
404 <#assign redirectURL = renderResponse.createRenderURL() />
405 ${redirectURL.setParameter("mvcPath", "/add_asset_redirect.jsp")}
406 ${redirectURL.setWindowState("pop_up")}
407 <#assign editPortletURL = renderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("pop_up"), redirectURL)!"" />
408 <!--Set embedded =true để giao diện hiển thị theo hook -->
409 ${editPortletURL.setParameter("embedded", "true")}
410 <#if validator.isNotNull(editPortletURL)>
411 <@liferay_ui["icon"]
412 cssClass="pull-right"
413 image="edit"
414 url="javascript:Liferay.Util.openWindow({id:'" + renderResponse.getNamespace() + "editAsset', title: '" + entryTitle + "', uri:'" + htmlUtil.escapeURL(editPortletURL.toString()) + "'});"
415 />
416 </#if>
417 </#if>
418</#macro>
419<script>
420YUI().use(
421 'aui-datepicker',
422 function(Y) {
423 new Y.DatePicker(
424 {
425 trigger: 'input',
426
427 mask: '%d/%m/%Y',
428 popover: {
429 zIndex: 1
430 },
431 panes: 1
432 }
433 );
434 }
435);
436</script>
—