banner

THÔNG TIN DU LỊCH

Asset Publisher

An error occurred while processing the template.
The following has evaluated to null or missing:
==> view_url  [in template "37610#37640#128010" at line 211, column 24]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${view_url}  [in template "37610#37640#128010" at line 211, column 22]
----
1<style> 
2    .slideshow-container-ttdl-slider { 
3        display: flex; 
4        width: 100%; 
5        height: 410px; 
6
7    .text-content-ttdl-slider { 
8        width: 40% ; 
9        order: 1;  
10        padding: 20px 20px 0 0; 
11        background: white; 
12        display: flex; 
13        flex-direction: column; 
14        justify-content: space-between; 
15        box-sizing: border-box; 
16
17    .text-content-ttdl-slider h2 { 
18        font-size: clamp(24px, 3vw, 16px); 
19        color: #035FB5; 
20
21 
22    .text-content-ttdl-slider p { 
23        font-size: clamp(16px, 2vw, 12px); 
24        color: #2E2E2E;            ; 
25
26    .slider-container-ttdl-slider { 
27        display: flex; 
28        width: 60%; 
29        order: 2; 
30        height: 410px; 
31        align-items: center; 
32        justify-content: left; 
33        position: relative; 
34        overflow: hidden; 
35
36    .slides-ttdl-slider { 
37        display: flex; 
38        align-items: center; 
39        position: absolute; 
40        transition: transform 0.5s ease, opacity 0.5s ease; 
41        opacity: 0; 
42
43    .slide-ttdl-slider.active { 
44        width: 545px; 
45        height: 410px; 
46        z-index: 3; 
47        opacity: 1; 
48        transform: translateX(0); 
49
50    .slide-ttdl-slider.next { 
51        width: 453px; 
52        height: 340px; 
53        z-index: 2; 
54        opacity: 1; 
55        transform: translateX(300px); 
56
57     
58    .slide-ttdl-slider.next-next { 
59        width: 355px; 
60        height: 265px; 
61        z-index: 1; 
62        opacity: 1; 
63        transform: translateX(550px); 
64
65 
66    .text-content-ttdl-slider .highlight-ttdl-slider { 
67            font-weight: bold; 
68
69    .navigation-ttdl-slider { 
70        display: flex; 
71        justify-content: space-between; 
72        align-items: center; 
73        margin-top: 10px; 
74
75    .progress-container-ttdl-slider { 
76        display: flex; 
77        justify-content: center; 
78        align-items: center; 
79        gap: 10px; 
80
81    .progress-dot-ttdl-slider { 
82        width: 30px; 
83        height: 10px; 
84        background-color: #EBEBEB; 
85        border-radius: 10px; 
86        border: 1px solid #ACB0B3; 
87        cursor: pointer; 
88
89    .progress-dot-ttdl-slider.active { 
90        width: 12px; 
91        height: 12px; 
92        background-color: #DE6F18; 
93
94 
95    .prev-ttdl-slider, .next-ttdl-slider { 
96        cursor: pointer; 
97        padding: 10px; 
98        font-size: 18px; 
99        background-color: #E3E5E6; 
100        border: none; 
101
102 
103    .prev-ttdl-slider, .next-ttdl-slider { 
104        background-color: #E3E5E6; 
105        border: 3px solid #ACB0B3; 
106        color: #ACB0B3; 
107
108    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
109        background-color: #F4CFB2; 
110        border: 3px solid #DE6F18; 
111        color: #DE6F18; 
112
113    .text-wrapper-ttdl-slider { 
114        padding-right: 5px; 
115
116 
117 
118 
119 @media (max-width: 768px) { 
120    .slideshow-container-ttdl-slider { 
121        flex-direction: column; 
122        align-items: center; 
123        height: auto; 
124
125 
126    .slider-container-ttdl-slider { 
127        width: 100%; 
128        height: auto; 
129        position: unset; 
130        order: -1; /* Đưa hình ảnh lên trên */ 
131        display: flex; 
132        justify-content: center; 
133        align-items: center; 
134
135 
136    .slide-ttdl-slider { 
137        width: 90%;  
138        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
139        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
140        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
141        display: block; 
142        margin: 0 auto; /* Canh giữa hình ảnh */ 
143        position: static; 
144
145 
146    .text-content-ttdl-slider { 
147        width: 100%; 
148        padding: 15px; 
149        text-align: center; 
150
151
152    @media (max-width: 480px) { 
153    .slider-container-ttdl-slider { 
154        height: auto; 
155         
156
157 
158    .slide-ttdl-slider { 
159        width: 90%;  
160        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
161        max-height: 300px; 
162        object-fit: cover; 
163        display: block; 
164        margin: 0 auto; 
165        position: unset; 
166
167 
168    .text-content-ttdl-slider { 
169        padding: 10px; 
170
171
172</style> 
173 
174<div class="slideshow-container-ttdl-slider"> 
175    <#if entries?has_content> 
176        <!-- Phần hiển thị các slide --> 
177        <div class="slider-container-ttdl-slider"> 
178            <#list entries as cur_entry> 
179                <#assign renderer = cur_entry.getAssetRenderer() /> 
180                <#assign class_name = renderer.getClassName() /> 
181                <#if class_name == "com.liferay.journal.model.JournalArticle" && cur_entry.getAvailableLanguageIds()?seq_contains(locale)> 
182                    <#assign  
183                        title = cur_entry.getTitle(locale)  
184                        article = renderer.getArticle() 
185                        description = article.getDescription(locale)  
186                        ddm_template_key = article.getDDMTemplateKey() 
187                        view_url = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"  
188                    /> 
189                    <#if cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)??> 
190                        <#assign smallImageUrlSide = cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)> 
191                    <#else> 
192                        <#assign smallImageUrlSide = "/documents/37638/39612/kinhte-xahoi-bg.jpg"> 
193                    </#if> 
194                             
195                        <#--  <a href="${view_url}" class="w-100 h-100">   --> 
196                            <img src="${smallImageUrlSide}"  
197                                class="slide-ttdl-slider <#if cur_entry?index == 0>active</#if>"  
198                                data-index="${cur_entry?index}"  
199                                data-title="${title}"  
200                                data-description="${description}" 
201                                data-url="${view_url}" 
202
203                        <#--  </a>  --> 
204                             
205                </#if> 
206            </#list> 
207        </div> 
208 
209        <!-- Block content --> 
210        <div class="text-content-ttdl-slider"> 
211            <a href="${view_url}"> 
212                <div class="text-wrapper-ttdl-slider"> 
213                    <h2 id="title-ttdl-slider">${title}</h2> 
214                    <p id="description-ttdl-slider">${description}</p> 
215                </div> 
216            </a> 
217            <div class="navigation-ttdl-slider"> 
218                <div style="display: flex; align-items: center;"> 
219                    <button class="prev-ttdl-slider" style="width: 30px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(-1)">❮</button> 
220                    <button class="next-ttdl-slider" style="width: 30px; margin-left: 10px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(1)">❯</button> 
221                </div> 
222                <div class="progress-container-ttdl-slider"> 
223                    <#if entries?size gt 0> 
224                        <#list entries as entry> 
225                            <span class="progress-dot-ttdl-slider" onclick="currentSlideTtdl(${entry?index})"></span> 
226                        </#list> 
227                    </#if> 
228                </div> 
229            </div> 
230        </div> 
231    </#if> 
232</div> 
233 
234<script> 
235    let slideIndexTtdl = 1; // Bắt đầu từ slide đầu tiên 
236 
237    function changeSlideTtdl(n) { 
238        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
239        if (slidesTtdl.length === 0) return; 
240 
241        // Cập nhật slideIndexTtdl và đảm bảo nó quay vòng ngay lập tức 
242        slideIndexTtdl = (slideIndexTtdl + n) % slidesTtdl.length; 
243        if (slideIndexTtdl < 0) slideIndexTtdl += slidesTtdl.length; 
244 
245        updateSlidesTtdlSlider(); 
246
247 
248    function currentSlideTtdl(n) { 
249        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
250        if (slidesTtdl.length === 0) return; 
251        slideIndexTtdl = n % slidesTtdl.length; 
252        updateSlidesTtdlSlider(); 
253
254 
255     
256 
257    function updateSlidesTtdlSlider() { 
258        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
259        let dotsTtdl = document.querySelectorAll(".progress-dot-ttdl-slider"); 
260        let titleElement = document.getElementById("title-ttdl-slider"); 
261        let descriptionElement = document.getElementById("description-ttdl-slider"); 
262 
263        if (slidesTtdl.length === 0) return; 
264 
265        slidesTtdl.forEach((slide) => { 
266            slide.classList.remove("active", "next", "next-next"); 
267        }); 
268 
269        let current = slideIndexTtdl; 
270        let next = (slideIndexTtdl + 1) % slidesTtdl.length; 
271        let nextNext = (slideIndexTtdl + 2) % slidesTtdl.length; 
272 
273        slidesTtdl[current].classList.add("active"); 
274 
275        if (slidesTtdl.length > 1) slidesTtdl[next].classList.add("next"); 
276        if (slidesTtdl.length > 2) slidesTtdl[nextNext].classList.add("next-next"); 
277 
278        if (titleElement && descriptionElement) { 
279            let activeSlide = slidesTtdl[slideIndexTtdl]; 
280            titleElement.textContent = activeSlide.getAttribute("data-title"); 
281            descriptionElement.innerHTML = activeSlide.getAttribute("data-description") || ""; 
282
283 
284        dotsTtdl.forEach((dot, index) => { 
285            dot.classList.toggle("active", index === slideIndexTtdl); 
286        }); 
287
288 
289 
290    // Khởi tạo slider khi trang được tải 
291    document.addEventListener("DOMContentLoaded", function () { 
292        if (document.querySelectorAll(".slide-ttdl-slider").length > 0) { 
293            updateSlidesTtdlSlider(); 
294
295    }); 
296 
297 
298    document.addEventListener("DOMContentLoaded", function () { 
299    let titleElement = document.getElementById("title-ttdl-slider"); 
300    let descriptionElement = document.getElementById("description-ttdl-slider"); 
301    let sliderContainer = document.querySelector(".slider-container-ttdl-slider"); // Thêm sự kiện cho ảnh 
302 
303    function navigateToActiveArticle() { 
304        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
305        let activeSlide = slidesTtdl[slideIndexTtdl]; 
306        let url = activeSlide.getAttribute("data-url"); 
307        if (url) { 
308            window.location.href = url; 
309
310
311 
312    titleElement.addEventListener("click", navigateToActiveArticle); 
313    descriptionElement.addEventListener("click", navigateToActiveArticle); 
314    sliderContainer.addEventListener("click", navigateToActiveArticle); // Bắt sự kiện click vào ảnh 
315}); 
316 
317</script> 
318<style> 
319 
320    .slide-ttdl-slider: hover { 
321        cursor: pointer; 
322
323    .slideshow-container-ttdl-slider { 
324        display: flex; 
325        width: 100%; 
326        height: 410px; 
327
328    .text-content-ttdl-slider { 
329        width: 40% ; 
330        padding: 20px 20px 0 0; 
331        background: white; 
332        display: flex; 
333        flex-direction: column; 
334        justify-content: space-between; 
335        box-sizing: border-box; 
336
337    .text-content-ttdl-slider h2 { 
338        font-size: clamp(24px, 3vw, 16px); 
339        color: #035FB5; 
340
341 
342    .text-content-ttdl-slider p { 
343        font-size: clamp(16px, 2vw, 12px); 
344        color: #2E2E2E;            ; 
345
346    .slider-container-ttdl-slider { 
347        display: flex; 
348        width: 60%; 
349        height: 410px; 
350        align-items: center; 
351        justify-content: left; 
352        position: relative; 
353        overflow: hidden; 
354
355    .slides-ttdl-slider { 
356        position: relative; 
357        display: flex; 
358        align-items: center; 
359
360    .slide-ttdl-slider { 
361        position: absolute; 
362        transition: transform 0.5s ease, opacity 0.5s ease; 
363        opacity: 0; 
364
365    .slide-ttdl-slider.active { 
366        width: 545px; 
367        height: 410px; 
368        z-index: 3; 
369        opacity: 1; 
370        transform: translateX(0); 
371
372    .slide-ttdl-slider.next { 
373        width: 453px; 
374        height: 340px; 
375        z-index: 2; 
376        opacity: 1; 
377        transform: translateX(300px); 
378
379    .text-content-ttdl-slider .highlight-ttdl-slider { 
380            font-weight: bold; 
381
382    .slide-ttdl-slider.next-next { 
383        width: 355px; 
384        height: 265px; 
385        z-index: 1; 
386        opacity: 1; 
387        transform: translateX(550px); 
388
389    .navigation-ttdl-slider { 
390        display: flex; 
391        justify-content: space-between; 
392        align-items: center; 
393        margin-top: 10px; 
394
395    .progress-container { 
396        display: flex; 
397        justify-content: center; 
398        align-items: center; 
399        gap: 10px; 
400
401    .progress-dot { 
402        width: 30px; 
403        height: 10px; 
404        background-color: #EBEBEB; 
405        border-radius: 10px; 
406        border: 1px solid #ACB0B3; 
407        cursor: pointer; 
408
409    .progress-dot.active { 
410        width: 12px; 
411        height: 12px; 
412        background-color: #DE6F18; 
413
414 
415    .prev-ttdl-slider, .next-ttdl-slider { 
416        cursor: pointer; 
417        padding: 10px; 
418        font-size: 18px; 
419        background-color: #E3E5E6; 
420        /* color: white; */ 
421        border: none; 
422
423 
424    .prev-ttdl-slider, .next-ttdl-slider { 
425        background-color: #E3E5E6; 
426        border: 3px solid #ACB0B3; 
427        color: #ACB0B3; 
428
429    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
430        background-color: #F4CFB2; 
431        border: 3px solid #DE6F18; 
432        color: #DE6F18; 
433
434    .text-wrapper-ttdl-slider { 
435        padding-right: 5px; 
436
437 
438     
439     
440    /* css responsive  */ 
441    @media (max-width: 768px) { 
442    .slideshow-container-ttdl-slider { 
443        flex-direction: column; 
444        align-items: center; 
445        height: auto; 
446
447 
448    .slider-container-ttdl-slider { 
449        width: 100%; 
450        height: auto; 
451        position: unset; 
452        order: -1; /* Đưa hình ảnh lên trên */ 
453        display: flex; 
454        justify-content: center; 
455        align-items: center; 
456
457 
458    .slide-ttdl-slider { 
459        width: 90%;  
460        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
461        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
462        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
463        display: block; 
464        margin: 0 auto; /* Canh giữa hình ảnh */ 
465        position: static; 
466
467 
468    .text-content-ttdl-slider { 
469        width: 100%; 
470        padding: 15px; 
471        text-align: center; 
472
473
474 
475@media (max-width: 480px) { 
476    .slider-container-ttdl-slider { 
477        height: auto; 
478         
479
480 
481    .slide-ttdl-slider { 
482        width: 90%;  
483        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
484        max-height: 300px; 
485        object-fit: cover; 
486        display: block; 
487        margin: 0 auto; 
488        position: unset; 
489
490 
491    .text-content-ttdl-slider { 
492        padding: 10px; 
493
494
495 
496 
497</style> 

Asset Publisher

An error occurred while processing the template.
The following has evaluated to null or missing:
==> view_url  [in template "37610#37640#128010" at line 211, column 24]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${view_url}  [in template "37610#37640#128010" at line 211, column 22]
----
1<style> 
2    .slideshow-container-ttdl-slider { 
3        display: flex; 
4        width: 100%; 
5        height: 410px; 
6
7    .text-content-ttdl-slider { 
8        width: 40% ; 
9        order: 1;  
10        padding: 20px 20px 0 0; 
11        background: white; 
12        display: flex; 
13        flex-direction: column; 
14        justify-content: space-between; 
15        box-sizing: border-box; 
16
17    .text-content-ttdl-slider h2 { 
18        font-size: clamp(24px, 3vw, 16px); 
19        color: #035FB5; 
20
21 
22    .text-content-ttdl-slider p { 
23        font-size: clamp(16px, 2vw, 12px); 
24        color: #2E2E2E;            ; 
25
26    .slider-container-ttdl-slider { 
27        display: flex; 
28        width: 60%; 
29        order: 2; 
30        height: 410px; 
31        align-items: center; 
32        justify-content: left; 
33        position: relative; 
34        overflow: hidden; 
35
36    .slides-ttdl-slider { 
37        display: flex; 
38        align-items: center; 
39        position: absolute; 
40        transition: transform 0.5s ease, opacity 0.5s ease; 
41        opacity: 0; 
42
43    .slide-ttdl-slider.active { 
44        width: 545px; 
45        height: 410px; 
46        z-index: 3; 
47        opacity: 1; 
48        transform: translateX(0); 
49
50    .slide-ttdl-slider.next { 
51        width: 453px; 
52        height: 340px; 
53        z-index: 2; 
54        opacity: 1; 
55        transform: translateX(300px); 
56
57     
58    .slide-ttdl-slider.next-next { 
59        width: 355px; 
60        height: 265px; 
61        z-index: 1; 
62        opacity: 1; 
63        transform: translateX(550px); 
64
65 
66    .text-content-ttdl-slider .highlight-ttdl-slider { 
67            font-weight: bold; 
68
69    .navigation-ttdl-slider { 
70        display: flex; 
71        justify-content: space-between; 
72        align-items: center; 
73        margin-top: 10px; 
74
75    .progress-container-ttdl-slider { 
76        display: flex; 
77        justify-content: center; 
78        align-items: center; 
79        gap: 10px; 
80
81    .progress-dot-ttdl-slider { 
82        width: 30px; 
83        height: 10px; 
84        background-color: #EBEBEB; 
85        border-radius: 10px; 
86        border: 1px solid #ACB0B3; 
87        cursor: pointer; 
88
89    .progress-dot-ttdl-slider.active { 
90        width: 12px; 
91        height: 12px; 
92        background-color: #DE6F18; 
93
94 
95    .prev-ttdl-slider, .next-ttdl-slider { 
96        cursor: pointer; 
97        padding: 10px; 
98        font-size: 18px; 
99        background-color: #E3E5E6; 
100        border: none; 
101
102 
103    .prev-ttdl-slider, .next-ttdl-slider { 
104        background-color: #E3E5E6; 
105        border: 3px solid #ACB0B3; 
106        color: #ACB0B3; 
107
108    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
109        background-color: #F4CFB2; 
110        border: 3px solid #DE6F18; 
111        color: #DE6F18; 
112
113    .text-wrapper-ttdl-slider { 
114        padding-right: 5px; 
115
116 
117 
118 
119 @media (max-width: 768px) { 
120    .slideshow-container-ttdl-slider { 
121        flex-direction: column; 
122        align-items: center; 
123        height: auto; 
124
125 
126    .slider-container-ttdl-slider { 
127        width: 100%; 
128        height: auto; 
129        position: unset; 
130        order: -1; /* Đưa hình ảnh lên trên */ 
131        display: flex; 
132        justify-content: center; 
133        align-items: center; 
134
135 
136    .slide-ttdl-slider { 
137        width: 90%;  
138        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
139        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
140        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
141        display: block; 
142        margin: 0 auto; /* Canh giữa hình ảnh */ 
143        position: static; 
144
145 
146    .text-content-ttdl-slider { 
147        width: 100%; 
148        padding: 15px; 
149        text-align: center; 
150
151
152    @media (max-width: 480px) { 
153    .slider-container-ttdl-slider { 
154        height: auto; 
155         
156
157 
158    .slide-ttdl-slider { 
159        width: 90%;  
160        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
161        max-height: 300px; 
162        object-fit: cover; 
163        display: block; 
164        margin: 0 auto; 
165        position: unset; 
166
167 
168    .text-content-ttdl-slider { 
169        padding: 10px; 
170
171
172</style> 
173 
174<div class="slideshow-container-ttdl-slider"> 
175    <#if entries?has_content> 
176        <!-- Phần hiển thị các slide --> 
177        <div class="slider-container-ttdl-slider"> 
178            <#list entries as cur_entry> 
179                <#assign renderer = cur_entry.getAssetRenderer() /> 
180                <#assign class_name = renderer.getClassName() /> 
181                <#if class_name == "com.liferay.journal.model.JournalArticle" && cur_entry.getAvailableLanguageIds()?seq_contains(locale)> 
182                    <#assign  
183                        title = cur_entry.getTitle(locale)  
184                        article = renderer.getArticle() 
185                        description = article.getDescription(locale)  
186                        ddm_template_key = article.getDDMTemplateKey() 
187                        view_url = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"  
188                    /> 
189                    <#if cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)??> 
190                        <#assign smallImageUrlSide = cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)> 
191                    <#else> 
192                        <#assign smallImageUrlSide = "/documents/37638/39612/kinhte-xahoi-bg.jpg"> 
193                    </#if> 
194                             
195                        <#--  <a href="${view_url}" class="w-100 h-100">   --> 
196                            <img src="${smallImageUrlSide}"  
197                                class="slide-ttdl-slider <#if cur_entry?index == 0>active</#if>"  
198                                data-index="${cur_entry?index}"  
199                                data-title="${title}"  
200                                data-description="${description}" 
201                                data-url="${view_url}" 
202
203                        <#--  </a>  --> 
204                             
205                </#if> 
206            </#list> 
207        </div> 
208 
209        <!-- Block content --> 
210        <div class="text-content-ttdl-slider"> 
211            <a href="${view_url}"> 
212                <div class="text-wrapper-ttdl-slider"> 
213                    <h2 id="title-ttdl-slider">${title}</h2> 
214                    <p id="description-ttdl-slider">${description}</p> 
215                </div> 
216            </a> 
217            <div class="navigation-ttdl-slider"> 
218                <div style="display: flex; align-items: center;"> 
219                    <button class="prev-ttdl-slider" style="width: 30px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(-1)">❮</button> 
220                    <button class="next-ttdl-slider" style="width: 30px; margin-left: 10px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(1)">❯</button> 
221                </div> 
222                <div class="progress-container-ttdl-slider"> 
223                    <#if entries?size gt 0> 
224                        <#list entries as entry> 
225                            <span class="progress-dot-ttdl-slider" onclick="currentSlideTtdl(${entry?index})"></span> 
226                        </#list> 
227                    </#if> 
228                </div> 
229            </div> 
230        </div> 
231    </#if> 
232</div> 
233 
234<script> 
235    let slideIndexTtdl = 1; // Bắt đầu từ slide đầu tiên 
236 
237    function changeSlideTtdl(n) { 
238        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
239        if (slidesTtdl.length === 0) return; 
240 
241        // Cập nhật slideIndexTtdl và đảm bảo nó quay vòng ngay lập tức 
242        slideIndexTtdl = (slideIndexTtdl + n) % slidesTtdl.length; 
243        if (slideIndexTtdl < 0) slideIndexTtdl += slidesTtdl.length; 
244 
245        updateSlidesTtdlSlider(); 
246
247 
248    function currentSlideTtdl(n) { 
249        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
250        if (slidesTtdl.length === 0) return; 
251        slideIndexTtdl = n % slidesTtdl.length; 
252        updateSlidesTtdlSlider(); 
253
254 
255     
256 
257    function updateSlidesTtdlSlider() { 
258        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
259        let dotsTtdl = document.querySelectorAll(".progress-dot-ttdl-slider"); 
260        let titleElement = document.getElementById("title-ttdl-slider"); 
261        let descriptionElement = document.getElementById("description-ttdl-slider"); 
262 
263        if (slidesTtdl.length === 0) return; 
264 
265        slidesTtdl.forEach((slide) => { 
266            slide.classList.remove("active", "next", "next-next"); 
267        }); 
268 
269        let current = slideIndexTtdl; 
270        let next = (slideIndexTtdl + 1) % slidesTtdl.length; 
271        let nextNext = (slideIndexTtdl + 2) % slidesTtdl.length; 
272 
273        slidesTtdl[current].classList.add("active"); 
274 
275        if (slidesTtdl.length > 1) slidesTtdl[next].classList.add("next"); 
276        if (slidesTtdl.length > 2) slidesTtdl[nextNext].classList.add("next-next"); 
277 
278        if (titleElement && descriptionElement) { 
279            let activeSlide = slidesTtdl[slideIndexTtdl]; 
280            titleElement.textContent = activeSlide.getAttribute("data-title"); 
281            descriptionElement.innerHTML = activeSlide.getAttribute("data-description") || ""; 
282
283 
284        dotsTtdl.forEach((dot, index) => { 
285            dot.classList.toggle("active", index === slideIndexTtdl); 
286        }); 
287
288 
289 
290    // Khởi tạo slider khi trang được tải 
291    document.addEventListener("DOMContentLoaded", function () { 
292        if (document.querySelectorAll(".slide-ttdl-slider").length > 0) { 
293            updateSlidesTtdlSlider(); 
294
295    }); 
296 
297 
298    document.addEventListener("DOMContentLoaded", function () { 
299    let titleElement = document.getElementById("title-ttdl-slider"); 
300    let descriptionElement = document.getElementById("description-ttdl-slider"); 
301    let sliderContainer = document.querySelector(".slider-container-ttdl-slider"); // Thêm sự kiện cho ảnh 
302 
303    function navigateToActiveArticle() { 
304        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
305        let activeSlide = slidesTtdl[slideIndexTtdl]; 
306        let url = activeSlide.getAttribute("data-url"); 
307        if (url) { 
308            window.location.href = url; 
309
310
311 
312    titleElement.addEventListener("click", navigateToActiveArticle); 
313    descriptionElement.addEventListener("click", navigateToActiveArticle); 
314    sliderContainer.addEventListener("click", navigateToActiveArticle); // Bắt sự kiện click vào ảnh 
315}); 
316 
317</script> 
318<style> 
319 
320    .slide-ttdl-slider: hover { 
321        cursor: pointer; 
322
323    .slideshow-container-ttdl-slider { 
324        display: flex; 
325        width: 100%; 
326        height: 410px; 
327
328    .text-content-ttdl-slider { 
329        width: 40% ; 
330        padding: 20px 20px 0 0; 
331        background: white; 
332        display: flex; 
333        flex-direction: column; 
334        justify-content: space-between; 
335        box-sizing: border-box; 
336
337    .text-content-ttdl-slider h2 { 
338        font-size: clamp(24px, 3vw, 16px); 
339        color: #035FB5; 
340
341 
342    .text-content-ttdl-slider p { 
343        font-size: clamp(16px, 2vw, 12px); 
344        color: #2E2E2E;            ; 
345
346    .slider-container-ttdl-slider { 
347        display: flex; 
348        width: 60%; 
349        height: 410px; 
350        align-items: center; 
351        justify-content: left; 
352        position: relative; 
353        overflow: hidden; 
354
355    .slides-ttdl-slider { 
356        position: relative; 
357        display: flex; 
358        align-items: center; 
359
360    .slide-ttdl-slider { 
361        position: absolute; 
362        transition: transform 0.5s ease, opacity 0.5s ease; 
363        opacity: 0; 
364
365    .slide-ttdl-slider.active { 
366        width: 545px; 
367        height: 410px; 
368        z-index: 3; 
369        opacity: 1; 
370        transform: translateX(0); 
371
372    .slide-ttdl-slider.next { 
373        width: 453px; 
374        height: 340px; 
375        z-index: 2; 
376        opacity: 1; 
377        transform: translateX(300px); 
378
379    .text-content-ttdl-slider .highlight-ttdl-slider { 
380            font-weight: bold; 
381
382    .slide-ttdl-slider.next-next { 
383        width: 355px; 
384        height: 265px; 
385        z-index: 1; 
386        opacity: 1; 
387        transform: translateX(550px); 
388
389    .navigation-ttdl-slider { 
390        display: flex; 
391        justify-content: space-between; 
392        align-items: center; 
393        margin-top: 10px; 
394
395    .progress-container { 
396        display: flex; 
397        justify-content: center; 
398        align-items: center; 
399        gap: 10px; 
400
401    .progress-dot { 
402        width: 30px; 
403        height: 10px; 
404        background-color: #EBEBEB; 
405        border-radius: 10px; 
406        border: 1px solid #ACB0B3; 
407        cursor: pointer; 
408
409    .progress-dot.active { 
410        width: 12px; 
411        height: 12px; 
412        background-color: #DE6F18; 
413
414 
415    .prev-ttdl-slider, .next-ttdl-slider { 
416        cursor: pointer; 
417        padding: 10px; 
418        font-size: 18px; 
419        background-color: #E3E5E6; 
420        /* color: white; */ 
421        border: none; 
422
423 
424    .prev-ttdl-slider, .next-ttdl-slider { 
425        background-color: #E3E5E6; 
426        border: 3px solid #ACB0B3; 
427        color: #ACB0B3; 
428
429    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
430        background-color: #F4CFB2; 
431        border: 3px solid #DE6F18; 
432        color: #DE6F18; 
433
434    .text-wrapper-ttdl-slider { 
435        padding-right: 5px; 
436
437 
438     
439     
440    /* css responsive  */ 
441    @media (max-width: 768px) { 
442    .slideshow-container-ttdl-slider { 
443        flex-direction: column; 
444        align-items: center; 
445        height: auto; 
446
447 
448    .slider-container-ttdl-slider { 
449        width: 100%; 
450        height: auto; 
451        position: unset; 
452        order: -1; /* Đưa hình ảnh lên trên */ 
453        display: flex; 
454        justify-content: center; 
455        align-items: center; 
456
457 
458    .slide-ttdl-slider { 
459        width: 90%;  
460        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
461        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
462        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
463        display: block; 
464        margin: 0 auto; /* Canh giữa hình ảnh */ 
465        position: static; 
466
467 
468    .text-content-ttdl-slider { 
469        width: 100%; 
470        padding: 15px; 
471        text-align: center; 
472
473
474 
475@media (max-width: 480px) { 
476    .slider-container-ttdl-slider { 
477        height: auto; 
478         
479
480 
481    .slide-ttdl-slider { 
482        width: 90%;  
483        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
484        max-height: 300px; 
485        object-fit: cover; 
486        display: block; 
487        margin: 0 auto; 
488        position: unset; 
489
490 
491    .text-content-ttdl-slider { 
492        padding: 10px; 
493
494
495 
496 
497</style> 

Asset Publisher

An error occurred while processing the template.
The following has evaluated to null or missing:
==> view_url  [in template "37610#37640#128010" at line 211, column 24]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${view_url}  [in template "37610#37640#128010" at line 211, column 22]
----
1<style> 
2    .slideshow-container-ttdl-slider { 
3        display: flex; 
4        width: 100%; 
5        height: 410px; 
6
7    .text-content-ttdl-slider { 
8        width: 40% ; 
9        order: 1;  
10        padding: 20px 20px 0 0; 
11        background: white; 
12        display: flex; 
13        flex-direction: column; 
14        justify-content: space-between; 
15        box-sizing: border-box; 
16
17    .text-content-ttdl-slider h2 { 
18        font-size: clamp(24px, 3vw, 16px); 
19        color: #035FB5; 
20
21 
22    .text-content-ttdl-slider p { 
23        font-size: clamp(16px, 2vw, 12px); 
24        color: #2E2E2E;            ; 
25
26    .slider-container-ttdl-slider { 
27        display: flex; 
28        width: 60%; 
29        order: 2; 
30        height: 410px; 
31        align-items: center; 
32        justify-content: left; 
33        position: relative; 
34        overflow: hidden; 
35
36    .slides-ttdl-slider { 
37        display: flex; 
38        align-items: center; 
39        position: absolute; 
40        transition: transform 0.5s ease, opacity 0.5s ease; 
41        opacity: 0; 
42
43    .slide-ttdl-slider.active { 
44        width: 545px; 
45        height: 410px; 
46        z-index: 3; 
47        opacity: 1; 
48        transform: translateX(0); 
49
50    .slide-ttdl-slider.next { 
51        width: 453px; 
52        height: 340px; 
53        z-index: 2; 
54        opacity: 1; 
55        transform: translateX(300px); 
56
57     
58    .slide-ttdl-slider.next-next { 
59        width: 355px; 
60        height: 265px; 
61        z-index: 1; 
62        opacity: 1; 
63        transform: translateX(550px); 
64
65 
66    .text-content-ttdl-slider .highlight-ttdl-slider { 
67            font-weight: bold; 
68
69    .navigation-ttdl-slider { 
70        display: flex; 
71        justify-content: space-between; 
72        align-items: center; 
73        margin-top: 10px; 
74
75    .progress-container-ttdl-slider { 
76        display: flex; 
77        justify-content: center; 
78        align-items: center; 
79        gap: 10px; 
80
81    .progress-dot-ttdl-slider { 
82        width: 30px; 
83        height: 10px; 
84        background-color: #EBEBEB; 
85        border-radius: 10px; 
86        border: 1px solid #ACB0B3; 
87        cursor: pointer; 
88
89    .progress-dot-ttdl-slider.active { 
90        width: 12px; 
91        height: 12px; 
92        background-color: #DE6F18; 
93
94 
95    .prev-ttdl-slider, .next-ttdl-slider { 
96        cursor: pointer; 
97        padding: 10px; 
98        font-size: 18px; 
99        background-color: #E3E5E6; 
100        border: none; 
101
102 
103    .prev-ttdl-slider, .next-ttdl-slider { 
104        background-color: #E3E5E6; 
105        border: 3px solid #ACB0B3; 
106        color: #ACB0B3; 
107
108    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
109        background-color: #F4CFB2; 
110        border: 3px solid #DE6F18; 
111        color: #DE6F18; 
112
113    .text-wrapper-ttdl-slider { 
114        padding-right: 5px; 
115
116 
117 
118 
119 @media (max-width: 768px) { 
120    .slideshow-container-ttdl-slider { 
121        flex-direction: column; 
122        align-items: center; 
123        height: auto; 
124
125 
126    .slider-container-ttdl-slider { 
127        width: 100%; 
128        height: auto; 
129        position: unset; 
130        order: -1; /* Đưa hình ảnh lên trên */ 
131        display: flex; 
132        justify-content: center; 
133        align-items: center; 
134
135 
136    .slide-ttdl-slider { 
137        width: 90%;  
138        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
139        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
140        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
141        display: block; 
142        margin: 0 auto; /* Canh giữa hình ảnh */ 
143        position: static; 
144
145 
146    .text-content-ttdl-slider { 
147        width: 100%; 
148        padding: 15px; 
149        text-align: center; 
150
151
152    @media (max-width: 480px) { 
153    .slider-container-ttdl-slider { 
154        height: auto; 
155         
156
157 
158    .slide-ttdl-slider { 
159        width: 90%;  
160        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
161        max-height: 300px; 
162        object-fit: cover; 
163        display: block; 
164        margin: 0 auto; 
165        position: unset; 
166
167 
168    .text-content-ttdl-slider { 
169        padding: 10px; 
170
171
172</style> 
173 
174<div class="slideshow-container-ttdl-slider"> 
175    <#if entries?has_content> 
176        <!-- Phần hiển thị các slide --> 
177        <div class="slider-container-ttdl-slider"> 
178            <#list entries as cur_entry> 
179                <#assign renderer = cur_entry.getAssetRenderer() /> 
180                <#assign class_name = renderer.getClassName() /> 
181                <#if class_name == "com.liferay.journal.model.JournalArticle" && cur_entry.getAvailableLanguageIds()?seq_contains(locale)> 
182                    <#assign  
183                        title = cur_entry.getTitle(locale)  
184                        article = renderer.getArticle() 
185                        description = article.getDescription(locale)  
186                        ddm_template_key = article.getDDMTemplateKey() 
187                        view_url = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"  
188                    /> 
189                    <#if cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)??> 
190                        <#assign smallImageUrlSide = cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)> 
191                    <#else> 
192                        <#assign smallImageUrlSide = "/documents/37638/39612/kinhte-xahoi-bg.jpg"> 
193                    </#if> 
194                             
195                        <#--  <a href="${view_url}" class="w-100 h-100">   --> 
196                            <img src="${smallImageUrlSide}"  
197                                class="slide-ttdl-slider <#if cur_entry?index == 0>active</#if>"  
198                                data-index="${cur_entry?index}"  
199                                data-title="${title}"  
200                                data-description="${description}" 
201                                data-url="${view_url}" 
202
203                        <#--  </a>  --> 
204                             
205                </#if> 
206            </#list> 
207        </div> 
208 
209        <!-- Block content --> 
210        <div class="text-content-ttdl-slider"> 
211            <a href="${view_url}"> 
212                <div class="text-wrapper-ttdl-slider"> 
213                    <h2 id="title-ttdl-slider">${title}</h2> 
214                    <p id="description-ttdl-slider">${description}</p> 
215                </div> 
216            </a> 
217            <div class="navigation-ttdl-slider"> 
218                <div style="display: flex; align-items: center;"> 
219                    <button class="prev-ttdl-slider" style="width: 30px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(-1)">❮</button> 
220                    <button class="next-ttdl-slider" style="width: 30px; margin-left: 10px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(1)">❯</button> 
221                </div> 
222                <div class="progress-container-ttdl-slider"> 
223                    <#if entries?size gt 0> 
224                        <#list entries as entry> 
225                            <span class="progress-dot-ttdl-slider" onclick="currentSlideTtdl(${entry?index})"></span> 
226                        </#list> 
227                    </#if> 
228                </div> 
229            </div> 
230        </div> 
231    </#if> 
232</div> 
233 
234<script> 
235    let slideIndexTtdl = 1; // Bắt đầu từ slide đầu tiên 
236 
237    function changeSlideTtdl(n) { 
238        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
239        if (slidesTtdl.length === 0) return; 
240 
241        // Cập nhật slideIndexTtdl và đảm bảo nó quay vòng ngay lập tức 
242        slideIndexTtdl = (slideIndexTtdl + n) % slidesTtdl.length; 
243        if (slideIndexTtdl < 0) slideIndexTtdl += slidesTtdl.length; 
244 
245        updateSlidesTtdlSlider(); 
246
247 
248    function currentSlideTtdl(n) { 
249        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
250        if (slidesTtdl.length === 0) return; 
251        slideIndexTtdl = n % slidesTtdl.length; 
252        updateSlidesTtdlSlider(); 
253
254 
255     
256 
257    function updateSlidesTtdlSlider() { 
258        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
259        let dotsTtdl = document.querySelectorAll(".progress-dot-ttdl-slider"); 
260        let titleElement = document.getElementById("title-ttdl-slider"); 
261        let descriptionElement = document.getElementById("description-ttdl-slider"); 
262 
263        if (slidesTtdl.length === 0) return; 
264 
265        slidesTtdl.forEach((slide) => { 
266            slide.classList.remove("active", "next", "next-next"); 
267        }); 
268 
269        let current = slideIndexTtdl; 
270        let next = (slideIndexTtdl + 1) % slidesTtdl.length; 
271        let nextNext = (slideIndexTtdl + 2) % slidesTtdl.length; 
272 
273        slidesTtdl[current].classList.add("active"); 
274 
275        if (slidesTtdl.length > 1) slidesTtdl[next].classList.add("next"); 
276        if (slidesTtdl.length > 2) slidesTtdl[nextNext].classList.add("next-next"); 
277 
278        if (titleElement && descriptionElement) { 
279            let activeSlide = slidesTtdl[slideIndexTtdl]; 
280            titleElement.textContent = activeSlide.getAttribute("data-title"); 
281            descriptionElement.innerHTML = activeSlide.getAttribute("data-description") || ""; 
282
283 
284        dotsTtdl.forEach((dot, index) => { 
285            dot.classList.toggle("active", index === slideIndexTtdl); 
286        }); 
287
288 
289 
290    // Khởi tạo slider khi trang được tải 
291    document.addEventListener("DOMContentLoaded", function () { 
292        if (document.querySelectorAll(".slide-ttdl-slider").length > 0) { 
293            updateSlidesTtdlSlider(); 
294
295    }); 
296 
297 
298    document.addEventListener("DOMContentLoaded", function () { 
299    let titleElement = document.getElementById("title-ttdl-slider"); 
300    let descriptionElement = document.getElementById("description-ttdl-slider"); 
301    let sliderContainer = document.querySelector(".slider-container-ttdl-slider"); // Thêm sự kiện cho ảnh 
302 
303    function navigateToActiveArticle() { 
304        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
305        let activeSlide = slidesTtdl[slideIndexTtdl]; 
306        let url = activeSlide.getAttribute("data-url"); 
307        if (url) { 
308            window.location.href = url; 
309
310
311 
312    titleElement.addEventListener("click", navigateToActiveArticle); 
313    descriptionElement.addEventListener("click", navigateToActiveArticle); 
314    sliderContainer.addEventListener("click", navigateToActiveArticle); // Bắt sự kiện click vào ảnh 
315}); 
316 
317</script> 
318<style> 
319 
320    .slide-ttdl-slider: hover { 
321        cursor: pointer; 
322
323    .slideshow-container-ttdl-slider { 
324        display: flex; 
325        width: 100%; 
326        height: 410px; 
327
328    .text-content-ttdl-slider { 
329        width: 40% ; 
330        padding: 20px 20px 0 0; 
331        background: white; 
332        display: flex; 
333        flex-direction: column; 
334        justify-content: space-between; 
335        box-sizing: border-box; 
336
337    .text-content-ttdl-slider h2 { 
338        font-size: clamp(24px, 3vw, 16px); 
339        color: #035FB5; 
340
341 
342    .text-content-ttdl-slider p { 
343        font-size: clamp(16px, 2vw, 12px); 
344        color: #2E2E2E;            ; 
345
346    .slider-container-ttdl-slider { 
347        display: flex; 
348        width: 60%; 
349        height: 410px; 
350        align-items: center; 
351        justify-content: left; 
352        position: relative; 
353        overflow: hidden; 
354
355    .slides-ttdl-slider { 
356        position: relative; 
357        display: flex; 
358        align-items: center; 
359
360    .slide-ttdl-slider { 
361        position: absolute; 
362        transition: transform 0.5s ease, opacity 0.5s ease; 
363        opacity: 0; 
364
365    .slide-ttdl-slider.active { 
366        width: 545px; 
367        height: 410px; 
368        z-index: 3; 
369        opacity: 1; 
370        transform: translateX(0); 
371
372    .slide-ttdl-slider.next { 
373        width: 453px; 
374        height: 340px; 
375        z-index: 2; 
376        opacity: 1; 
377        transform: translateX(300px); 
378
379    .text-content-ttdl-slider .highlight-ttdl-slider { 
380            font-weight: bold; 
381
382    .slide-ttdl-slider.next-next { 
383        width: 355px; 
384        height: 265px; 
385        z-index: 1; 
386        opacity: 1; 
387        transform: translateX(550px); 
388
389    .navigation-ttdl-slider { 
390        display: flex; 
391        justify-content: space-between; 
392        align-items: center; 
393        margin-top: 10px; 
394
395    .progress-container { 
396        display: flex; 
397        justify-content: center; 
398        align-items: center; 
399        gap: 10px; 
400
401    .progress-dot { 
402        width: 30px; 
403        height: 10px; 
404        background-color: #EBEBEB; 
405        border-radius: 10px; 
406        border: 1px solid #ACB0B3; 
407        cursor: pointer; 
408
409    .progress-dot.active { 
410        width: 12px; 
411        height: 12px; 
412        background-color: #DE6F18; 
413
414 
415    .prev-ttdl-slider, .next-ttdl-slider { 
416        cursor: pointer; 
417        padding: 10px; 
418        font-size: 18px; 
419        background-color: #E3E5E6; 
420        /* color: white; */ 
421        border: none; 
422
423 
424    .prev-ttdl-slider, .next-ttdl-slider { 
425        background-color: #E3E5E6; 
426        border: 3px solid #ACB0B3; 
427        color: #ACB0B3; 
428
429    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
430        background-color: #F4CFB2; 
431        border: 3px solid #DE6F18; 
432        color: #DE6F18; 
433
434    .text-wrapper-ttdl-slider { 
435        padding-right: 5px; 
436
437 
438     
439     
440    /* css responsive  */ 
441    @media (max-width: 768px) { 
442    .slideshow-container-ttdl-slider { 
443        flex-direction: column; 
444        align-items: center; 
445        height: auto; 
446
447 
448    .slider-container-ttdl-slider { 
449        width: 100%; 
450        height: auto; 
451        position: unset; 
452        order: -1; /* Đưa hình ảnh lên trên */ 
453        display: flex; 
454        justify-content: center; 
455        align-items: center; 
456
457 
458    .slide-ttdl-slider { 
459        width: 90%;  
460        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
461        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
462        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
463        display: block; 
464        margin: 0 auto; /* Canh giữa hình ảnh */ 
465        position: static; 
466
467 
468    .text-content-ttdl-slider { 
469        width: 100%; 
470        padding: 15px; 
471        text-align: center; 
472
473
474 
475@media (max-width: 480px) { 
476    .slider-container-ttdl-slider { 
477        height: auto; 
478         
479
480 
481    .slide-ttdl-slider { 
482        width: 90%;  
483        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
484        max-height: 300px; 
485        object-fit: cover; 
486        display: block; 
487        margin: 0 auto; 
488        position: unset; 
489
490 
491    .text-content-ttdl-slider { 
492        padding: 10px; 
493
494
495 
496 
497</style> 

Asset Publisher

An error occurred while processing the template.
The following has evaluated to null or missing:
==> view_url  [in template "37610#37640#128010" at line 211, column 24]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: ${view_url}  [in template "37610#37640#128010" at line 211, column 22]
----
1<style> 
2    .slideshow-container-ttdl-slider { 
3        display: flex; 
4        width: 100%; 
5        height: 410px; 
6
7    .text-content-ttdl-slider { 
8        width: 40% ; 
9        order: 1;  
10        padding: 20px 20px 0 0; 
11        background: white; 
12        display: flex; 
13        flex-direction: column; 
14        justify-content: space-between; 
15        box-sizing: border-box; 
16
17    .text-content-ttdl-slider h2 { 
18        font-size: clamp(24px, 3vw, 16px); 
19        color: #035FB5; 
20
21 
22    .text-content-ttdl-slider p { 
23        font-size: clamp(16px, 2vw, 12px); 
24        color: #2E2E2E;            ; 
25
26    .slider-container-ttdl-slider { 
27        display: flex; 
28        width: 60%; 
29        order: 2; 
30        height: 410px; 
31        align-items: center; 
32        justify-content: left; 
33        position: relative; 
34        overflow: hidden; 
35
36    .slides-ttdl-slider { 
37        display: flex; 
38        align-items: center; 
39        position: absolute; 
40        transition: transform 0.5s ease, opacity 0.5s ease; 
41        opacity: 0; 
42
43    .slide-ttdl-slider.active { 
44        width: 545px; 
45        height: 410px; 
46        z-index: 3; 
47        opacity: 1; 
48        transform: translateX(0); 
49
50    .slide-ttdl-slider.next { 
51        width: 453px; 
52        height: 340px; 
53        z-index: 2; 
54        opacity: 1; 
55        transform: translateX(300px); 
56
57     
58    .slide-ttdl-slider.next-next { 
59        width: 355px; 
60        height: 265px; 
61        z-index: 1; 
62        opacity: 1; 
63        transform: translateX(550px); 
64
65 
66    .text-content-ttdl-slider .highlight-ttdl-slider { 
67            font-weight: bold; 
68
69    .navigation-ttdl-slider { 
70        display: flex; 
71        justify-content: space-between; 
72        align-items: center; 
73        margin-top: 10px; 
74
75    .progress-container-ttdl-slider { 
76        display: flex; 
77        justify-content: center; 
78        align-items: center; 
79        gap: 10px; 
80
81    .progress-dot-ttdl-slider { 
82        width: 30px; 
83        height: 10px; 
84        background-color: #EBEBEB; 
85        border-radius: 10px; 
86        border: 1px solid #ACB0B3; 
87        cursor: pointer; 
88
89    .progress-dot-ttdl-slider.active { 
90        width: 12px; 
91        height: 12px; 
92        background-color: #DE6F18; 
93
94 
95    .prev-ttdl-slider, .next-ttdl-slider { 
96        cursor: pointer; 
97        padding: 10px; 
98        font-size: 18px; 
99        background-color: #E3E5E6; 
100        border: none; 
101
102 
103    .prev-ttdl-slider, .next-ttdl-slider { 
104        background-color: #E3E5E6; 
105        border: 3px solid #ACB0B3; 
106        color: #ACB0B3; 
107
108    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
109        background-color: #F4CFB2; 
110        border: 3px solid #DE6F18; 
111        color: #DE6F18; 
112
113    .text-wrapper-ttdl-slider { 
114        padding-right: 5px; 
115
116 
117 
118 
119 @media (max-width: 768px) { 
120    .slideshow-container-ttdl-slider { 
121        flex-direction: column; 
122        align-items: center; 
123        height: auto; 
124
125 
126    .slider-container-ttdl-slider { 
127        width: 100%; 
128        height: auto; 
129        position: unset; 
130        order: -1; /* Đưa hình ảnh lên trên */ 
131        display: flex; 
132        justify-content: center; 
133        align-items: center; 
134
135 
136    .slide-ttdl-slider { 
137        width: 90%;  
138        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
139        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
140        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
141        display: block; 
142        margin: 0 auto; /* Canh giữa hình ảnh */ 
143        position: static; 
144
145 
146    .text-content-ttdl-slider { 
147        width: 100%; 
148        padding: 15px; 
149        text-align: center; 
150
151
152    @media (max-width: 480px) { 
153    .slider-container-ttdl-slider { 
154        height: auto; 
155         
156
157 
158    .slide-ttdl-slider { 
159        width: 90%;  
160        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
161        max-height: 300px; 
162        object-fit: cover; 
163        display: block; 
164        margin: 0 auto; 
165        position: unset; 
166
167 
168    .text-content-ttdl-slider { 
169        padding: 10px; 
170
171
172</style> 
173 
174<div class="slideshow-container-ttdl-slider"> 
175    <#if entries?has_content> 
176        <!-- Phần hiển thị các slide --> 
177        <div class="slider-container-ttdl-slider"> 
178            <#list entries as cur_entry> 
179                <#assign renderer = cur_entry.getAssetRenderer() /> 
180                <#assign class_name = renderer.getClassName() /> 
181                <#if class_name == "com.liferay.journal.model.JournalArticle" && cur_entry.getAvailableLanguageIds()?seq_contains(locale)> 
182                    <#assign  
183                        title = cur_entry.getTitle(locale)  
184                        article = renderer.getArticle() 
185                        description = article.getDescription(locale)  
186                        ddm_template_key = article.getDDMTemplateKey() 
187                        view_url = "${themeDisplay.getPathFriendlyURLPublic()}${themeDisplay.getSiteGroup().getFriendlyURL()}/-/${renderer.getUrlTitle()}"  
188                    /> 
189                    <#if cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)??> 
190                        <#assign smallImageUrlSide = cur_entry.getAssetRenderer().getThumbnailPath(renderRequest)> 
191                    <#else> 
192                        <#assign smallImageUrlSide = "/documents/37638/39612/kinhte-xahoi-bg.jpg"> 
193                    </#if> 
194                             
195                        <#--  <a href="${view_url}" class="w-100 h-100">   --> 
196                            <img src="${smallImageUrlSide}"  
197                                class="slide-ttdl-slider <#if cur_entry?index == 0>active</#if>"  
198                                data-index="${cur_entry?index}"  
199                                data-title="${title}"  
200                                data-description="${description}" 
201                                data-url="${view_url}" 
202
203                        <#--  </a>  --> 
204                             
205                </#if> 
206            </#list> 
207        </div> 
208 
209        <!-- Block content --> 
210        <div class="text-content-ttdl-slider"> 
211            <a href="${view_url}"> 
212                <div class="text-wrapper-ttdl-slider"> 
213                    <h2 id="title-ttdl-slider">${title}</h2> 
214                    <p id="description-ttdl-slider">${description}</p> 
215                </div> 
216            </a> 
217            <div class="navigation-ttdl-slider"> 
218                <div style="display: flex; align-items: center;"> 
219                    <button class="prev-ttdl-slider" style="width: 30px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(-1)">❮</button> 
220                    <button class="next-ttdl-slider" style="width: 30px; margin-left: 10px; height: 30px; border-radius: 100%; display: flex; justify-content: center; align-items: center;" onclick="changeSlideTtdl(1)">❯</button> 
221                </div> 
222                <div class="progress-container-ttdl-slider"> 
223                    <#if entries?size gt 0> 
224                        <#list entries as entry> 
225                            <span class="progress-dot-ttdl-slider" onclick="currentSlideTtdl(${entry?index})"></span> 
226                        </#list> 
227                    </#if> 
228                </div> 
229            </div> 
230        </div> 
231    </#if> 
232</div> 
233 
234<script> 
235    let slideIndexTtdl = 1; // Bắt đầu từ slide đầu tiên 
236 
237    function changeSlideTtdl(n) { 
238        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
239        if (slidesTtdl.length === 0) return; 
240 
241        // Cập nhật slideIndexTtdl và đảm bảo nó quay vòng ngay lập tức 
242        slideIndexTtdl = (slideIndexTtdl + n) % slidesTtdl.length; 
243        if (slideIndexTtdl < 0) slideIndexTtdl += slidesTtdl.length; 
244 
245        updateSlidesTtdlSlider(); 
246
247 
248    function currentSlideTtdl(n) { 
249        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
250        if (slidesTtdl.length === 0) return; 
251        slideIndexTtdl = n % slidesTtdl.length; 
252        updateSlidesTtdlSlider(); 
253
254 
255     
256 
257    function updateSlidesTtdlSlider() { 
258        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
259        let dotsTtdl = document.querySelectorAll(".progress-dot-ttdl-slider"); 
260        let titleElement = document.getElementById("title-ttdl-slider"); 
261        let descriptionElement = document.getElementById("description-ttdl-slider"); 
262 
263        if (slidesTtdl.length === 0) return; 
264 
265        slidesTtdl.forEach((slide) => { 
266            slide.classList.remove("active", "next", "next-next"); 
267        }); 
268 
269        let current = slideIndexTtdl; 
270        let next = (slideIndexTtdl + 1) % slidesTtdl.length; 
271        let nextNext = (slideIndexTtdl + 2) % slidesTtdl.length; 
272 
273        slidesTtdl[current].classList.add("active"); 
274 
275        if (slidesTtdl.length > 1) slidesTtdl[next].classList.add("next"); 
276        if (slidesTtdl.length > 2) slidesTtdl[nextNext].classList.add("next-next"); 
277 
278        if (titleElement && descriptionElement) { 
279            let activeSlide = slidesTtdl[slideIndexTtdl]; 
280            titleElement.textContent = activeSlide.getAttribute("data-title"); 
281            descriptionElement.innerHTML = activeSlide.getAttribute("data-description") || ""; 
282
283 
284        dotsTtdl.forEach((dot, index) => { 
285            dot.classList.toggle("active", index === slideIndexTtdl); 
286        }); 
287
288 
289 
290    // Khởi tạo slider khi trang được tải 
291    document.addEventListener("DOMContentLoaded", function () { 
292        if (document.querySelectorAll(".slide-ttdl-slider").length > 0) { 
293            updateSlidesTtdlSlider(); 
294
295    }); 
296 
297 
298    document.addEventListener("DOMContentLoaded", function () { 
299    let titleElement = document.getElementById("title-ttdl-slider"); 
300    let descriptionElement = document.getElementById("description-ttdl-slider"); 
301    let sliderContainer = document.querySelector(".slider-container-ttdl-slider"); // Thêm sự kiện cho ảnh 
302 
303    function navigateToActiveArticle() { 
304        let slidesTtdl = document.querySelectorAll(".slide-ttdl-slider"); 
305        let activeSlide = slidesTtdl[slideIndexTtdl]; 
306        let url = activeSlide.getAttribute("data-url"); 
307        if (url) { 
308            window.location.href = url; 
309
310
311 
312    titleElement.addEventListener("click", navigateToActiveArticle); 
313    descriptionElement.addEventListener("click", navigateToActiveArticle); 
314    sliderContainer.addEventListener("click", navigateToActiveArticle); // Bắt sự kiện click vào ảnh 
315}); 
316 
317</script> 
318<style> 
319 
320    .slide-ttdl-slider: hover { 
321        cursor: pointer; 
322
323    .slideshow-container-ttdl-slider { 
324        display: flex; 
325        width: 100%; 
326        height: 410px; 
327
328    .text-content-ttdl-slider { 
329        width: 40% ; 
330        padding: 20px 20px 0 0; 
331        background: white; 
332        display: flex; 
333        flex-direction: column; 
334        justify-content: space-between; 
335        box-sizing: border-box; 
336
337    .text-content-ttdl-slider h2 { 
338        font-size: clamp(24px, 3vw, 16px); 
339        color: #035FB5; 
340
341 
342    .text-content-ttdl-slider p { 
343        font-size: clamp(16px, 2vw, 12px); 
344        color: #2E2E2E;            ; 
345
346    .slider-container-ttdl-slider { 
347        display: flex; 
348        width: 60%; 
349        height: 410px; 
350        align-items: center; 
351        justify-content: left; 
352        position: relative; 
353        overflow: hidden; 
354
355    .slides-ttdl-slider { 
356        position: relative; 
357        display: flex; 
358        align-items: center; 
359
360    .slide-ttdl-slider { 
361        position: absolute; 
362        transition: transform 0.5s ease, opacity 0.5s ease; 
363        opacity: 0; 
364
365    .slide-ttdl-slider.active { 
366        width: 545px; 
367        height: 410px; 
368        z-index: 3; 
369        opacity: 1; 
370        transform: translateX(0); 
371
372    .slide-ttdl-slider.next { 
373        width: 453px; 
374        height: 340px; 
375        z-index: 2; 
376        opacity: 1; 
377        transform: translateX(300px); 
378
379    .text-content-ttdl-slider .highlight-ttdl-slider { 
380            font-weight: bold; 
381
382    .slide-ttdl-slider.next-next { 
383        width: 355px; 
384        height: 265px; 
385        z-index: 1; 
386        opacity: 1; 
387        transform: translateX(550px); 
388
389    .navigation-ttdl-slider { 
390        display: flex; 
391        justify-content: space-between; 
392        align-items: center; 
393        margin-top: 10px; 
394
395    .progress-container { 
396        display: flex; 
397        justify-content: center; 
398        align-items: center; 
399        gap: 10px; 
400
401    .progress-dot { 
402        width: 30px; 
403        height: 10px; 
404        background-color: #EBEBEB; 
405        border-radius: 10px; 
406        border: 1px solid #ACB0B3; 
407        cursor: pointer; 
408
409    .progress-dot.active { 
410        width: 12px; 
411        height: 12px; 
412        background-color: #DE6F18; 
413
414 
415    .prev-ttdl-slider, .next-ttdl-slider { 
416        cursor: pointer; 
417        padding: 10px; 
418        font-size: 18px; 
419        background-color: #E3E5E6; 
420        /* color: white; */ 
421        border: none; 
422
423 
424    .prev-ttdl-slider, .next-ttdl-slider { 
425        background-color: #E3E5E6; 
426        border: 3px solid #ACB0B3; 
427        color: #ACB0B3; 
428
429    .prev-ttdl-slider:hover, .next-ttdl-slider:hover { 
430        background-color: #F4CFB2; 
431        border: 3px solid #DE6F18; 
432        color: #DE6F18; 
433
434    .text-wrapper-ttdl-slider { 
435        padding-right: 5px; 
436
437 
438     
439     
440    /* css responsive  */ 
441    @media (max-width: 768px) { 
442    .slideshow-container-ttdl-slider { 
443        flex-direction: column; 
444        align-items: center; 
445        height: auto; 
446
447 
448    .slider-container-ttdl-slider { 
449        width: 100%; 
450        height: auto; 
451        position: unset; 
452        order: -1; /* Đưa hình ảnh lên trên */ 
453        display: flex; 
454        justify-content: center; 
455        align-items: center; 
456
457 
458    .slide-ttdl-slider { 
459        width: 90%;  
460        height: auto; /* Đảm bảo tỷ lệ hình ảnh */ 
461        max-height: 300px; /* Giới hạn chiều cao để tránh quá lớn */ 
462        object-fit: cover; /* Giữ nguyên tỷ lệ hình ảnh */ 
463        display: block; 
464        margin: 0 auto; /* Canh giữa hình ảnh */ 
465        position: static; 
466
467 
468    .text-content-ttdl-slider { 
469        width: 100%; 
470        padding: 15px; 
471        text-align: center; 
472
473
474 
475@media (max-width: 480px) { 
476    .slider-container-ttdl-slider { 
477        height: auto; 
478         
479
480 
481    .slide-ttdl-slider { 
482        width: 90%;  
483        height: 250px; /* Hoặc có thể đặt một giá trị phù hợp */ 
484        max-height: 300px; 
485        object-fit: cover; 
486        display: block; 
487        margin: 0 auto; 
488        position: unset; 
489
490 
491    .text-content-ttdl-slider { 
492        padding: 10px; 
493
494
495 
496 
497</style> 

ĂN UỐNG

Asset Publisher

Asset Publisher

Asset Publisher

Asset Publisher