TIN MỚI
Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
Java method "com.liferay.portlet.asset.model.impl.AssetEntryImpl.getViewCount()" threw an exception when invoked on com.liferay.portlet.asset.model.impl.AssetEntryImpl object "{mvccVersion=10, ctCollectionId=0, entryId=11382822, groupId=39403, companyId=20097, userId=6950961, userName=Nguyễn Lý Phương Chi, createDate=Thu Aug 27 11:42:16 ICT 2026, modifiedDate=Thu Aug 27 15:11:28 ICT 2026, classNameId=20132, classPK=11382817, classUuid=5704a29c-c2c1-350a-acf4-07c34de8c82a, classTypeId=39502, listable=true, visible=true, startDate=null, endDate=null, publishDate=Thu Aug 27 11:33:00 ICT 2026, expirationDate=null, mimeType=text/html, title=<?xml version='1.0' encoding='UTF-8'?><root available-locales=\"vi_VN\" default-locale=\"vi_VN\"><Title language-id=\"vi_VN\">HĐND TP.Hồ Chí Minh thông qua nhiều Nghị quyết quan trọng về hạ tầng đô thị, an sinh xã hội</Title></root>, description=<?xml version='1.0' encoding='UTF-8'?><root available-locales=\"vi_VN\" default-locale=\"vi_VN\"><Description language-id=\"vi_VN\"><p>(Hochiminhcity.gov.vn) - Sáng 27/8, tại Kỳ họp thứ tư (kỳ họp chuyên đề) HĐND TP.Hồ Chí Minh khóa XI, nhiệm kỳ 2026-2031, HĐND Thành phố đã xem xét, thông qua nhiều Nghị quyết quan trọng liên quan đến thể chế, ngân sách, đầu tư, đất đai, hạ tầng đô thị, tổ chức chính quyền, an sinh xã hội, môi trường, khoa học - công nghệ, đổi mới sáng tạo và chuyển đổi số.</p></Description></root>, summary=<?xml version='1.0' encoding='UTF-8'?><root available-locales=\"vi_VN\" default-locale=\"vi_VN\"><Description language-id=\"vi_VN\"><p>(Hochiminhcity.gov.vn) - Sáng 27/8, tại Kỳ họp thứ tư (kỳ họp chuyên đề) HĐND TP.Hồ Chí Minh khóa XI, nhiệm kỳ 2026-2031, HĐND Thành phố đã xem xét, thông qua nhiều Nghị quyết quan trọng liên quan đến thể chế, ngân sách, đầu tư, đất đai, hạ tầng đô thị, tổ chức chính quyền, an sinh xã hội, môi trường, khoa học - công nghệ, đổi mới sáng tạo và chuyển đổi số.</p></Description></root>, url=, layoutUuid=, height=0, width=0, priority=0.0}"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: viewCount = curEntry.getViewCount() +... [in template "20097#20123#1211535" at line 103, column 29]
----
1<div class="category-news-container">
2 <div>
3 <div class="category-menu">
4 <!-- Menu chính -->
5
6 <!-- Thanh công cụ -->
7 <div
8 class="tool-container d-flex justify-content-between align-items-center gap-3 flex-wrap my-4"
9 >
10 <!-- Phần bên trái -->
11 <div class="d-flex align-items-center gap-3">
12 <select class="custom-select" id="yearSelect" disabled>
13 <option value="2024">2024</option>
14 <option value="2023">2023</option>
15 <option value="2022">2022</option>
16 <option value="2021">2021</option>
17 <option value="2020">2020</option>
18 </select>
19 <select class="custom-select" id="monthSelect" disabled>
20 <option value="1">1</option>
21 <option value="2">2</option>
22 <option value="3">3</option>
23 <option value="4">4</option>
24 <option value="5">5</option>
25 <option value="6">6</option>
26 <option value="7">7</option>
27 <option value="8">8</option>
28 <option value="9">9</option>
29 <option value="10">10</option>
30 <option value="11">11</option>
31 <option value="12">12</option>
32 </select>
33 <button class="btn text-white px-4 btn-view">Xem</button>
34 </div>
35
36 <!-- Phần search bên phải -->
37 <div class="search-container d-flex align-items-center gap-2">
38 <input
39 type="text"
40 class="form-control"
41 placeholder="Nhập nội dung tìm kiếm"
42 />
43 <button class="search-button">
44 <i class="fa fa-search"></i>
45 </button>
46 </div>
47 </div>
48 </div>
49 <div class="slideshow-news-container position-relative">
50 <!-- Thêm nút điều hướng tùy chỉnh -->
51 <button class="custom-prev-btn" id="ct-prev-btn" onclick="handleSlideNav('prev')">
52 <i class="icon-prev-ttsk fa fa-chevron-left" ></i>
53 </button>
54 <button class="custom-next-btn" id="ct-next-btn" onclick="handleSlideNav('next')">
55 <i class="icon-next-ttsk fa fa-chevron-right" ></i>
56 </button>
57
58 <!-- Định nghĩa mapping cho icons -->
59 <#assign categoryIcons = {
60 "CHINH_TRI": "/documents/39403/331149/CH%C3%8DNH+TR%E1%BB%8A.png/aff1039f-cafc-1121-e49f-210645a54730?t=1732155564962"
61 } />
62
63 <!-- Định nghĩa mảng các category -->
64 <#assign categories = ["CHINH_TRI"] />
65 <#assign dateFormatDay = "dd" />
66 <#assign monthFormatDay = "MM" />
67 <#assign yearFormatDay = "yyyy" />
68 <#assign dateFormatTime = "HH:mm" />
69 <#assign indexLocal = 0/>
70 <swiper-container
71 class="chinhtri-newsSwiper position-relative"
72 pagination="true"
73 pagination-clickable="true"
74 space-between="20"
75 slides-per-view="4"
76 loop="true"
77 initial-slide="0"
78 navigation="false"
79 pagination-dynamic-bullets="true"
80 pagination-dynamic-main-bullets="3"
81 >
82 <#if entries?has_content>
83
84 <#list entries as curEntry>
85 <#assign
86 renderer = curEntry.getAssetRenderer()
87 className = renderer.getClassName()
88 category = "CHINH_TRI"
89 iconUrl = categoryIcons[category]!""
90 />
91 <#if className == "com.liferay.journal.model.JournalArticle" && curEntry.getAvailableLanguageIds()?seq_contains(locale) >
92 <#assign
93 title = curEntry.getTitle(locale)
94 article = renderer.getArticle()
95 description = article.getDescription(locale)
96 ddmTemplateKey = article.getDDMTemplateKey()
97displayDate = article.getDisplayDate()?datetime
98 createTime = dateUtil.getDate(displayDate, dateFormatTime, locale)
99 createDay = dateUtil.getDate(displayDate, dateFormatDay, locale)
100 createMonth = dateUtil.getDate(displayDate, monthFormatDay, locale)
101 createYear = dateUtil.getDate(displayDate, yearFormatDay, locale)
102 curEntry = curEntry
103 viewCount = curEntry.getViewCount() + 301
104 viewURL = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"
105 indexLocal = indexLocal + 1 />
106 <#if curEntry.getAssetRenderer().getThumbnailPath(renderRequest)??>
107 <#assign smallImageUrl = curEntry.getAssetRenderer().getThumbnailPath(renderRequest) >
108 <#else>
109 <#assign smallImageUrl = "/documents/20123/41696/cover-emty-img.jpg" />
110 </#if>
111 <swiper-slide
112 ><div class="card position-relative mb-5">
113 <!-- Phần hình ảnh -->
114 <div class="card-img-wrapper">
115 <img src="${smallImageUrl}"
116 class="card-img-top"
117 alt="Tin tức" />
118 </div>
119 <div class="bage-slide position-absolute top-0 start-0">
120 <img
121 src="${iconUrl}"
122 alt=""
123 />
124 </div>
125
126 <!-- Phần nội dung -->
127 <div class="card-content-container">
128 <div class="card-body py-4 px-3">
129 <h5 class="card-title-news text-truncate-3" title="${title}">
130 ${title}
131 </h5>
132
133 <div class="d-flex align-items-center justify-content-between">
134 <span class="me-3 text-muted">${createTime} | ${createDay}/${createMonth}/${createYear}</span>
135 <div
136 class="d-flex align-items-center gap-1 view-count-container"
137 >
138 <i class="fa fa-eye"></i>
139 <span class="views-tindang">${viewCount}</span>
140 </div>
141 </div>
142 </div>
143
144 <!-- Nút xem chi tiết -->
145 <div class="border-0 pb-3 ms-3">
146 <a href="${viewURL}" >
147 <button class="btn btn-detail rounded">
148 Xem chi tiết
149 </button>
150 </a>
151 </div>
152 </div>
153 </div></swiper-slide
154 >
155
156 </#if>
157 </#list>
158 </#if>
159
160 </swiper-container>
161 <div class="pagination-container position-absolute">
162 <a href="/tin-tuc-chinh-tri">
163 <button class="btn text-white text-nowrap btn-orange">
164 Xem thêm
165 </button>
166 </a>
167 </div>
168 </div>
169 </div>
170</div>
171
172<script>
173 function initializeNewsSwiper() {
174 // Kiểm tra jQuery đã được load chưa
175 if (typeof jQuery === 'undefined') {
176 setTimeout(initializeNewsSwiper, 100);
177 return;
178 }
179
180 $(document).ready(function () {
181 // Đổi tên biến để tránh xung đột
182 const newsSwiper = $(".chinhtri-newsSwiper")[0];
183 if (newsSwiper && newsSwiper.swiper) {
184 const swiperNewsWrapper = newsSwiper.swiper;
185
186 // Xử lý nút Previous
187 $("#ct-prev-btn").off('click').on("click", () => {
188 if (swiperNewsWrapper) swiperNewsWrapper.slidePrev();
189 });
190
191 // Xử lý nút Next
192 $("#ct-next-btn").off('click').on("click", () => {
193 if (swiperNewsWrapper) swiperNewsWrapper.slideNext();
194 });
195
196
197
198 // Thêm xử lý cho nút Xem (lọc theo tháng/năm)
199 $(".tool-container .btn-view").off('click').on("click", function () {
200 const selectedYear = $("#yearSelect").val();
201 const selectedMonth = $("#monthSelect").val().padStart(2, "0");
202
203 // Reset tất cả slide về trạng thái ẩn
204 if (swiperNewsWrapper && swiperNewsWrapper.slides) {
205 swiperNewsWrapper.slides.forEach((slide) => {
206 slide.style.display = "none";
207 });
208
209 // Đếm số slide được hiển thị
210 let visibleSlides = 0;
211
212 // Lọc và hiển thị các slide phù hợp
213 swiperNewsWrapper.slides.forEach((slide) => {
214 const dateText = $(slide).find(".text-muted").text().trim();
215 // Kiểm tra xem có tìm thấy phần tử có class text-muted không
216 if (dateText) {
217 // Tách chuỗi ngày tháng và xử lý
218 const [time, date] = dateText.split("|").map((item) => item.trim());
219 if (date) {
220 const [day, month, year] = date.split("/");
221 // So sánh tháng và năm
222 if (month === selectedMonth && year === selectedYear) {
223 slide.style.display = "block";
224 visibleSlides++;
225 }
226 }
227 }
228 });
229
230 // Kiểm tra và xử lý hiển thị nút điều hướng
231 const navigationButtons = $("#ct-prev-btn, #ct-next-btn");
232 if (visibleSlides <= 4) {
233 navigationButtons.hide();
234 } else {
235 navigationButtons.show();
236 }
237
238 // Xử lý thông báo không có kết quả
239 if (visibleSlides === 0) {
240 if (!$(".no-results-message").length) {
241 const noResultsMessage =
242 '<div class="no-results-message text-center py-5">' +
243 '<div class="mb-3">' +
244 '<i class="bi bi-search" style="font-size: 3rem; color: #ccc;"></i>' +
245 '</div>' +
246 '<h5 class="text-muted">Không tìm thấy bài viết nào</h5>' +
247 '<p class="text-muted">Không có bài viết nào trong tháng ' + selectedMonth + '/' + selectedYear + '</p>' +
248 '</div>';
249 $(".chinhtri-newsSwiper").after(noResultsMessage);
250 $(".btn-orange").hide();
251 }
252 } else {
253 // Xóa thông báo không có kết quả
254 $(".no-results-message").remove();
255 $(".btn-orange").show();
256 }
257
258 // Update swiper
259 swiperNewsWrapper.update();
260 swiperNewsWrapper.slideTo(0);
261 }
262 });
263
264
265
266 // Thêm cấu hình breakpoints cho newsSwiper
267 Object.assign(newsSwiper, {
268 breakpoints: {
269 320: {
270 slidesPerView: 1,
271 spaceBetween: 10,
272 },
273 480: {
274 slidesPerView: 2,
275 spaceBetween: 20,
276 },
277 768: {
278 slidesPerView: 2,
279 spaceBetween: 20,
280 },
281 1024: {
282 slidesPerView: 3,
283 spaceBetween: 20,
284 },
285 1440: {
286 slidesPerView: 4,
287 spaceBetween: 20,
288 },
289 },
290 });
291 }
292 });
293 }
294
295 // Khởi tạo khi document ready
296 $(document).ready(initializeNewsSwiper);
297
298 // Khởi tạo khi SPA navigation kết thúc
299 if (Liferay && Liferay.on) {
300 Liferay.on('endNavigate', initializeNewsSwiper);
301 }
302
303 // Khởi tạo khi window load
304 $(window).on('load', initializeNewsSwiper);
305</script>