Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
Denied access to method or field getParameter of class org.apache.catalina.core.ApplicationHttpRequest ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign tuNgayParam = request.getPara... [in template "29795641980326#20120#512621" at line 6, column 1] ----
1<#import "${templatesPath}/33140" as apme />
2<#global defaultThumbnailImageUrl = "/documents/20117/32827/logo-nhnnvn-3.png" />
3<#if currentURL?has_content>
4 ${currentURL}
5</#if>
6<#assign tuNgayParam = request.getParameter("tuNgay")!"" >
7<#assign denNgayParam = request.getParameter("denNgay")!"" >
8
9<#assign tuNgayDate = "">
10<#assign denNgayDate = "">
11
12
13<#if tuNgayParam?has_content>
14 <#attempt>
15 <#assign tuNgayDate = dateUtil.parseDate("yyyy-MM-dd", tuNgayParam, locale)>
16 <#recover>
17 <p style="color:red;">Ngày bắt đầu không đúng định dạng: ${tuNgayParam}</p>
18 </#recover>
19</#if>
20
21<#if denNgayParam?has_content>
22 <#attempt>
23 <#assign denNgayDate = dateUtil.parseDate("yyyy-MM-dd", denNgayParam, locale)>
24 <#recover>
25 <p style="color:red;">Ngày kết thúc không đúng định dạng: ${denNgayParam}</p>
26 </#recover>
27</#if>
28
29<#-- Kiểm tra xem có tham số ngày hợp lệ nào không -->
30<#assign hasDateFilter = (tuNgayDate?has_content) || (denNgayDate?has_content)>
31
32<#if hasDateFilter>
33 <#assign filteredEntries = []>
34 <#list entries as entry>
35 <#assign publishDate = entry.getPublishDate()>
36 <#if publishDate?? && (
37 (!tuNgayDate?has_content || publishDate?long >= tuNgayDate?long) &&
38 (!denNgayDate?has_content || publishDate?long <= denNgayDate?long)
39 )>
40 <#assign filteredEntries = entries>
41 </#if>
42 </#list>
43<#else>
44 <#assign filteredEntries = entries>
45</#if>
46
47<#if !filteredEntries?has_content>
48 <#if !themeDisplay.isSignedIn()>
49 ${renderRequest.setAttribute("PORTLET_CONFIGURATOR_VISIBILITY", true)}
50 </#if>
51
52 <div class="alert alert-info">
53 <@liferay_ui["message"] key="there-are-no-results" />
54 </div>
55</#if>
56<div class="news-list-container danh-sach-tin-tuc-v41">
57 <div class="news-grid">
58 <#list filteredEntries as entry>
59 <#global
60 assetRenderer = entry.getAssetRenderer()
61 entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale))
62 viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, assetRenderer, entry, !stringUtil.equals(assetLinkBehavior, "showFullContent"))
63 />
64 <#if entry?index lt 6>
65 <div class="news-card">
66 <div class="news-card-title">
67 <a href="${viewURL}" class="news-title">${entryTitle}</a>
68 </div>
69 <div class="news-card-content">
70 <#assign ddm = assetRenderer.getDDMFormValuesReader()
71 .getDDMFormValues()
72 .getDDMFormFieldValuesMap() />
73 <#if ddm["AnhNoiBat"]?? && ddm["AnhNoiBat"][0].getValue().getString(locale)?has_content>
74 <#assign thumbnailPreview = jsonFactoryUtil.createJSONObject(ddm["AnhNoiBat"][0].getValue().getString(locale)).getString('url') />
75 <#assign thumbnailPreview2 = jsonFactoryUtil.createJSONObject(ddm["AnhNoiBat"][0].getValue().getString(locale)) />
76 <a href="${viewURL}">
77 <img src="${thumbnailPreview2}" />
78 </a>
79 </#if>
80 <#if assetRenderer.getThumbnailPath(renderRequest)?? >
81 <@apme.getThumbnailPreview/>
82 <#else>
83
84 <#assign thumbnailPreview ="" />
85 <#if ddm["AnhNoiBat_Url"]?? && ddm["AnhNoiBat_Url"]?has_content && ddm["AnhNoiBat_Url"][0].getValue().getString(locale)?has_content>
86 <#assign thumbnailPreview = ddm["AnhNoiBat_Url"][0].getValue().getString(locale)?string />
87 <a href="${viewURL}">
88 <img src="${thumbnailPreview}" />
89 </a>
90 <#else>
91 <#assign thumbnailPreview = ddm["AnhNoiBat"][0].getValue().getString(locale)?string />
92 <a href="${viewURL}">
93 <img src="${thumbnailPreview}" />
94 </a>
95 </#if>
96 </#if>
97 <@apme.getSummary />
98 </div>
99 <div class="news-date">
100 <#if entry.getPublishDate()?has_content>
101 (${dateUtil.getDate(entry.getPublishDate(), "dd/MM/yyyy", locale)})
102 </#if>
103 </div>
104 </div>
105 </#if>
106 </#list>
107 </div>
108 <div class="fragment_2735">
109 <div class="title-wrapper">
110 <img src="https://state-bank.vercel.app/images/credit-org-icon.svg" alt="Icon" class="service-icon">
111 <span class="service-title">CÁC TIN KHÁC</span>
112 </div>
113</div>
114 <div class="news-grid2">
115 <#list filteredEntries as entry>
116 <#global
117 assetRenderer = entry.getAssetRenderer()
118 entryTitle = htmlUtil.escape(assetRenderer.getTitle(locale))
119 viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, assetRenderer, entry, !stringUtil.equals(assetLinkBehavior, "showFullContent"))
120 />
121 <#if entry?index gte 6>
122 <div class="col-md-12">
123 <@apme.getEntryTitleAndDate />
124 </div>
125 </#if>
126 </#list>
127 </div>
128 <div class="news-search">
129 <button id="toggle-search">Xem bài theo ngày tháng >></button>
130 </div>
131 <div class="search-form-wrapper" style="display: none; padding: 10px;background: #f0eceb;">
132 <div class="search-form-row">
133 <label for="tuNgay"><strong>Từ ngày</strong></label>
134 <div class="input-with-icon">
135 <input type="date" id="tuNgay" />
136 <img src="https://cdn-icons-png.flaticon.com/512/747/747310.png" class="calendar-icon" onclick="document.getElementById('tuNgay').showPicker()" />
137 </div>
138 <label for="denNgay"><strong>Đến ngày</strong></label>
139 <div class="input-with-icon">
140 <input type="date" id="denNgay" />
141 <img src="https://cdn-icons-png.flaticon.com/512/747/747310.png" class="calendar-icon" onclick="document.getElementById('denNgay').showPicker()" />
142 </div>
143 <button type="submit" class="search-btn">Tìm kiếm</button>
144 </div>
145 </div>
146</div>
147
148<style>
149.danh-sach-tin-tuc-v41 {
150 background: #ffffff;
151 border: 1px solid #ddd;
152 }
153.news-grid {
154 display: grid;
155 grid-template-columns: repeat(2, 1fr);
156}
157.news-card {
158 background: #ffffff;
159 border: 1px solid #ddd;
160 padding: 15px;
161 height: 100%;
162 display: flex;
163 flex-direction: column;
164 justify-content: top;
165}
166.news-title {
167 color: #CD7B2C;
168 text-decoration: none;
169 display: block;
170 margin-bottom: 10px;
171 text-align: justify;
172 font-weight: bold;
173 font-size: 16px;
174 text-decoration: none;
175 line-height: 17px;
176
177}
178.news-divider {
179 height: 1px;
180 background-color: #ccc;
181 margin: 10px 0;
182}
183.news-summary {
184 font-size: 16px;
185 color: #333;
186 text-align: justify;
187 flex-grow: 1;
188}
189.news-date {
190 color: #9b1b42;
191 text-align: right;
192 margin-top: 10px;
193 font-size: 16px;
194 font-weight: normal;
195}
196.top-news-detail{
197 color: #5e5d5f;
198 font-size: 16px;
199 text-align: justify;
200 padding-top: 0%;
201 }
202 .news-card-content img {
203 float: left;
204 margin-bottom: 0px;
205 width: 120px;
206 margin-right: 10px;
207 padding-top: 7px;
208 }
209.aspect-ratio-43{
210 padding-top: 0%;
211 float: left;
212 margin-bottom: 0px;
213 width: 120px;
214 margin-right: 10px;
215 }
216 .aspect-ratio-43 img, video{
217 padding-top: 7px;
218 }
219 .fragment_2735 {
220 background: #f0eceb;
221 padding: 8px 12px;
222 margin: 30px 5px 0px 5px;
223}
224.title-wrapper {
225 display: flex;
226 align-items: center;
227 gap: 10px;
228}
229 .top-news-detail, .title-news {
230 display: inline;
231 -webkit-line-clamp: 4;
232 -webkit-box-orient: vertical;
233 overflow: hidden;
234 min-height: 20px;
235 text-align: justify;
236}
237.danh-sach-tin-tuc-v41 .service-icon {
238 width: 25px;
239 height: 20px;
240 color: #CD7B2C;
241}
242.danh-sach-tin-tuc-v41 .service-title {
243 font-size: 16px;
244 font-weight: bold;
245 color: #CD7B2C;
246 text-transform: uppercase;
247 font-family: Arial;
248 margin: 0;
249 padding: 0;
250}
251.danh-sach-tin-tuc-v41 .news-grid2 {
252 padding: 8px 12px;
253 }
254.span.date-about {
255 color: #971f43;
256}
257.news-grid2 .title-news h6 {
258 font-weight: lighter!important;
259 line-height: 1.9;
260 }
261.news-grid2 .title-news h6:before{
262 content: "■"; color: var(--brand-color-2); left: 13px; top: -2px; padding-right: 15px;
263 }
264 .date-about {
265 color: #971f43;
266 }
267 .date-about i{
268 font-style: normal !important;
269 }
270// css tìm kiếm
271.search-form-wrapper {
272 padding: 10px;
273 background: #f0eceb;
274 font-family: Arial, sans-serif;
275}
276
277.search-form-row {
278 display: flex;
279 align-items: center;
280 gap: 10px;
281 flex-wrap: wrap;
282}
283
284.search-form-wrapper label {
285 margin-bottom: 0;
286 font-weight: normal;
287 font-size: 14px;
288}
289
290.input-with-icon {
291 position: relative;
292}
293
294.input-with-icon input[type="date"] {
295 padding: 5px 30px 5px 5px;
296 width: 140px;
297 height: 30px;
298 font-size: 14px;
299}
300
301.calendar-icon {
302 position: absolute;
303 right: 6px;
304 top: 50%;
305 transform: translateY(-50%);
306 width: 16px;
307 height: 16px;
308 cursor: pointer;
309 opacity: 0.8;
310}
311
312.search-btn {
313 background-color: #9b1b42;
314 color: white;
315 font-weight: bold;
316 padding: 5px 15px;
317 border: none;
318 border-radius: 3px;
319 height: 30px;
320 font-size: 14px;
321 cursor: pointer;
322}
323
324.search-btn:hover {
325 background-color: #86133a;
326}
327@media (max-width: 768px) {
328 /* Chuyển layout sang 1 cột */
329 .news-grid {
330 grid-template-columns: 1fr;
331 }
332
333 /* Sắp xếp lại thứ tự và bố cục của news card */
334 .news-card {
335 display: flex;
336 flex-direction: column;
337 width: 100%;
338 }
339
340 .news-card-title {
341 order: 1;
342 width: 100%;
343 margin-bottom: 10px;
344 }
345
346 .news-card-content {
347 order: 2;
348 display: flex;
349 flex-direction: column;
350 width: 100%;
351 }
352
353 .news-card-content img {
354 width: 100%;
355 height: auto;
356 float: none;
357 margin: 0 0 10px 0;
358 }
359
360 .news-date {
361 order: 3;
362 width: 100%;
363 text-align: left;
364 margin-top: 10px;
365 }
366}
367
368
369
370
371</style>
372 <script data-senna-track="temporary">
373 document.addEventListener("DOMContentLoaded", function () {
374 debugger
375 const nutTimKiem = document.getElementById("toggle-search");
376 const form = document.querySelector(".search-form-wrapper");
377 const nutSubmit = document.querySelector(".search-btn");
378
379 nutTimKiem.addEventListener("click", function () {
380 form.style.display = (form.style.display === "none" || form.style.display === "") ? "block" : "none";
381 });
382
383 nutSubmit.addEventListener("click", function () {
384 const tuNgay = document.getElementById("tuNgay").value;
385 const denNgay = document.getElementById("denNgay").value;
386
387if (tuNgay || denNgay) {
388 document.querySelectorAll('a[href*="_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_"]').forEach(link => {
389 const url = new URL(link.href);
390
391 // Lấy redirect gốc
392 const originalRedirect = url.searchParams.get('_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_jaxi_redirect');
393 if (originalRedirect) {
394 const decodedRedirect = decodeURIComponent(originalRedirect);
395 const redirectURL = new URL(decodedRedirect, window.location.origin);
396
397 if (tuNgay) redirectURL.searchParams.set("tuNgay", tuNgay);
398 if (denNgay) redirectURL.searchParams.set("denNgay", denNgay);
399
400 // Gán lại redirect sau khi thêm params
401 url.searchParams.set('_com_liferay_asset_publisher_web_portlet_AssetPublisherPortlet_INSTANCE_jaxi_redirect', redirectURL.pathname + '?' + redirectURL.searchParams.toString());
402
403 // Gán lại href
404 link.href = url.toString();
405 }
406 });
407 }
408 // Lấy URL hiện tại
409 const url = new URL(window.location.href);
410 const params = url.searchParams;
411
412 // Cập nhật tham số tuNgay và denNgay trên URL
413 if (tuNgay) {
414 params.set('tuNgay', tuNgay);
415 } else {
416 params.delete('tuNgay');
417 }
418
419 if (denNgay) {
420 params.set('denNgay', denNgay);
421 } else {
422 params.delete('denNgay');
423 }
424
425 // Cập nhật URL search params
426 url.search = params.toString();
427
428 // Chuyển hướng đến URL mới với tham số lọc
429 window.location.href = url.toString();
430 });
431
432 // Khôi phục giá trị từ URL khi tải trang
433 const urlParams = new URLSearchParams(window.location.search);
434 const tuNgayParam = urlParams.get('tuNgay');
435 const denNgayParam = urlParams.get('denNgay');
436
437 if (tuNgayParam) {
438 document.getElementById('tuNgay').value = tuNgayParam;
439 }
440 if (denNgayParam) {
441 document.getElementById('denNgay').value = denNgayParam;
442 }
443});
444
445
446</script>