Có lỗi xảy ra trong quá trình xử lý biểu mẫu.
The following has evaluated to null or missing:
==> cur_FileDinhKem.dtvb_filename1 [in template "29795641980326#20120#BASIC-WEB-CONTENT" at line 817, column 23]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
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: #assign fileName = cur_FileDinhKem.dt... [in template "29795641980326#20120#BASIC-WEB-CONTENT" at line 817, column 3]
----
1<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
2<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
3<#assign journalArticle = JournalArticleLocalService.getArticle(getterUtil.getLong(groupId),.vars['reserved-article-id'].data) />
4<#assign categories = AssetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", journalArticle.getResourcePrimKey()) />
5<div class="content-tags">
6<ul class="tags-wrap">
7
8
9 <#if categories?has_content>
10 <#list categories as category>
11 <#assign categoryURL = renderResponse.createRenderURL()
12 categoryId = category.getCategoryId()?string
13 />
14 ${categoryURL.setParameter("resetCur", "true")}
15 ${categoryURL.setParameter("categoryId", category.getCategoryId()?string)}
16 <li>
17 <a title="${category.getName()}" href="/w/${.vars["reserved-article-url-title"].data}/-/categories/${category.getCategoryId()}">${category.getName()}</a> ${category?has_next?then(' ', '')}
18 </li>
19 </#list>
20</#if>
21
22</ul>
23</div>
24
25<#setting locale="vi_VN">
26<#if .vars["reserved-article-display-date"]??>
27 <#assign date = .vars["reserved-article-display-date"].data?date("EEE, dd MMM yyyy hh:mm:ss zzz")?string("dd/MM/yyyy HH:mm:ss")>
28<#else>
29 <#assign date = "">
30</#if>
31
32
33<div id="print-content">
34<style>
35#print-content img {
36 margin: 0 auto;
37}
38a {
39 color: #292d32;
40}
41.side-bar-height {
42 max-height: 3159.5px;
43}
44
45.singular-sidebar {
46 position: absolute;
47 margin-top: 100px;
48 left: -60px;
49}
50
51.btn-font {
52 padding: 8px;
53 background: #fff;
54 border: 1px solid #dfe0e3;
55 box-sizing: border-box;
56 border-radius: 100px;
57 display: block;
58 text-align: center;
59}
60
61.btn-font span {
62 display: flex;
63}
64.btn-font .font {
65 margin: 10px 0;
66 align-items: center;
67 justify-content: center;
68}
69
70.singular-footer .social-pin {
71 display: flex;
72 flex-direction: row-reverse;
73 align-items: flex-end;
74 width: 100%;
75 margin-top: 22px;
76 margin-bottom: 22px;
77 position: static;
78}
79
80.singular-footer .social-pin li {
81 flex: 2;
82}
83
84.singular-footer .social-pin li:first-child {
85 flex: 1;
86}
87
88.singular-footer .social-pin li:nth-child(6) {
89 flex: 14;
90}
91
92.singular-footer .social-pin li.line::before {
93 content: none;
94}
95
96.singular-footer .social-pin .link .tooltiptext {
97 left: 0;
98 margin-left: -78px;
99 height: 34px;
100 top: 2px;
101 display: flex;
102 justify-content: center;
103 align-items: center;
104}
105
106.singular-footer .social-pin .link .tooltiptext:after {
107 left: 63px;
108 transform: rotate(48deg);
109}
110
111.cpanel-action {
112 margin: 0 auto;
113 padding: 0;
114 list-style: none;
115 position: fixed;
116 top: 250px;
117}
118
119.cpanel-action li:not(:first-of-type) {
120 margin: 8px 0 0;
121}
122
123.cpanel-action li.line::before {
124 content: "";
125 display: block;
126 width: 32px;
127 margin: 0 auto;
128 padding-top: 8px;
129 border-top: 1px solid #e3e6e8;
130}
131
132.cpanel-action li.save {
133 width: 40px;
134 height: 40px;
135 margin-top: 18px;
136}
137
138.cpanel-action li.save.comment-empty_saved {
139 margin-top: 8px;
140}
141
142.cpanel-action li.save.comment-empty_saved span {
143 margin: 0;
144}
145
146.cpanel-item {
147 width: 40px;
148 height: 40px;
149 display: flex;
150 align-items: center;
151 justify-content: center;
152 border: 0;
153 padding: 0;
154 border-radius: 50%;
155 cursor: pointer;
156 position: relative;
157 color: #fff;
158 font-size: 28px;
159 transition: all 0.3s;
160}
161
162.cpanel-item:active {
163 transform: translateY(4px);
164}
165
166.cpanel-item:active svg {
167 background: #eee none;
168}
169
170.cpanel-item:active:hover {
171 box-shadow: none;
172}
173
174.cpanel-item.save {
175 margin-top: 18px;
176}
177
178.cpanel-item svg {
179 background: #fff none;
180 border: 1px solid #e4e4e4;
181 border-radius: 100px;
182}
183
184.cpanel-item:hover {
185 box-shadow: 0 0 8px 8px rgba(0, 0, 0, 0.05);
186}
187
188.cpanel-item.link {
189 position: relative;
190}
191
192.cpanel-item.link .tooltiptext {
193 width: 70px;
194 background: #fff none;
195 color: #000;
196 text-align: center;
197 border-radius: 6px;
198 padding: 5px 0;
199 position: absolute;
200 z-index: 1;
201 top: 0;
202 left: 105px;
203 margin-left: -60px;
204 font-size: 14px;
205 border: 2px solid #ccc;
206 font-weight: 400;
207}
208
209.cpanel-item.link .tooltiptext:after {
210 content: "";
211 display: block;
212 position: absolute;
213 border-style: solid;
214 border-color: #ccc;
215 border-width: 2px 2px 0 0;
216 width: 10px;
217 height: 10px;
218 top: 10px;
219 left: -6px;
220 transform: rotate(-137deg);
221}
222
223.cpanel-item.comment {
224 background-color: transparent;
225 color: #999;
226 font-size: 35px;
227}
228
229.cpanel-item.comment span {
230 height: 16px;
231 padding: 1px 4px;
232 background: #e7f0eb;
233 border-radius: 4px;
234 color: #0f6c32;
235 display: flex;
236 align-items: center;
237 justify-content: center;
238 position: absolute;
239 bottom: -10px;
240 text-indent: 0;
241 font-size: 11px;
242 font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
243 "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji",
244 "Segoe UI Symbol", sans-serif;
245 line-height: 140%;
246 font-weight: 600;
247 z-index: 1;
248}
249
250.cpanel-item.bookmark {
251 background-color: transparent;
252 color: #999;
253 font-size: 35px;
254}
255
256.cpanel-item.donate {
257 font-size: 28px;
258}
259
260.cpanel-item.donate:hover {
261 background: #1a7900 none;
262}
263.woK3sep4ykUXzIebVRTv {
264 background-image: url(https://cdnweb.dantri.com.vn/dist/654561c72dd30d1107f3.svg);
265 background-repeat: no-repeat;
266 background-size: cover;
267 display: flex;
268 justify-content: center;
269 align-items: center;
270 width: 18px;
271 height: 18px;
272 flex-shrink: 0;
273 border: none;
274}
275.MXHPvY_upC4YgT_Z3MLn {
276 background: #fff none;
277 border: 1px solid #e4e4e4;
278 border-radius: 100px;
279 width: 40px;
280 height: 40px;
281 display: flex;
282 align-items: center;
283 justify-content: center;
284 padding: 0;
285 cursor: pointer;
286 position: relative;
287 color: #fff;
288 font-size: 28px;
289 transition: all 0.3s;
290}
291.title-page {
292 font-size: 36px;
293 line-height: 50px;
294 font-weight: 600;
295 color: #222;
296 font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
297 "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji",
298 "Segoe UI Symbol", sans-serif;
299}
300.flex-author-collection {
301 margin-top: 12px;
302 display: flex;
303 justify-content: space-between;
304 align-items: center;
305}
306
307.flex-author-collection .author-wrap {
308 margin: 0;
309}
310
311.flex-author-collection .collections-item__tag {
312 display: inline-block;
313 height: 32px;
314}
315
316.flex-author-collection .collections-item__tag img {
317 height: 100%;
318 -o-object-fit: contain;
319 object-fit: contain;
320}
321.author-wrap {
322 margin: 12px 0 0;
323 display: flex;
324 align-items: center;
325}
326
327.author-avatar {
328 margin: 0 5px 0 0;
329 display: flex;
330 align-items: center;
331}
332
333.author-avatar__picture {
334 display: block;
335 width: 32px;
336 height: 32px;
337 position: relative;
338 overflow: hidden;
339 border-radius: 50%;
340 order: 3;
341}
342
343.author-avatar__picture img {
344 position: absolute;
345 top: 50%;
346 left: 50%;
347 transform: translate(-50%, -50%);
348 max-height: 100%;
349}
350
351.author-avatar__picture:not(:last-child) {
352 margin-left: -12px;
353}
354
355.author-avatar__picture:nth-child(2) {
356 order: 2;
357}
358
359.author-avatar__picture:nth-child(3) {
360 order: 1;
361}
362
363.author-meta {
364 display: flex;
365 align-items: center;
366}
367
368.author-name {
369 font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
370 "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji",
371 "Segoe UI Symbol", sans-serif;
372 font-weight: 500;
373 font-size: 14px;
374 line-height: 20px;
375}
376
377.author-name b {
378 font-weight: 600;
379}
380
381.author-name a {
382 color: #222;
383}
384
385.author-name.multi {
386 position: relative;
387}
388
389.author-name.multi > b {
390 display: flex;
391 align-items: center;
392 cursor: pointer;
393}
394
395.author-name.multi > b svg {
396 position: relative;
397 top: 1px;
398}
399
400.author-name.multi:hover .author-list {
401 visibility: visible;
402 opacity: 1;
403 top: 35px;
404}
405
406.author-position {
407 margin: 6px 0 0;
408 color: gray;
409}
410
411.author-time {
412 margin: 0 0 0 0px;
413 display: flex;
414 align-items: center;
415 font-size: 14px;
416 line-height: 20px;
417 color: #a0a4a8;
418}
419.tags-wrap {
420 padding: 0;
421 list-style: none;
422}
423
424.tags-wrap.mt-30 {
425 margin-top: 20px;
426}
427
428.tags-wrap::after {
429 content: "";
430 display: block;
431 clear: both;
432}
433
434.tags-wrap li {
435 float: left;
436 font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI",
437 "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji",
438 "Segoe UI Symbol", sans-serif;
439 line-height: 18px;
440 margin: 10px 10px 0 0;
441}
442
443.tags-wrap li:last-of-type {
444 margin-right: 0;
445}
446
447.tags-wrap li.label {
448 color: #333;
449 line-height: 26px;
450 border: none;
451 font-size: 14px;
452}
453
454.tags-wrap li.label b {
455 font-weight: 600;
456}
457
458.tags-wrap li a {
459 display: block;
460 padding: 4px 12px;
461 color: #666;
462 background: #f1f5f9 none;
463 border-radius: 13px;
464 font-weight: 500;
465}
466
467.tags-wrap li a:hover {
468 background: var(--btn-link-hover-color) none;
469 color: #fff;
470}
471
472.audio-player .toggle-play {
473 width: 30px;
474 height: 30px;
475 display: flex;
476 justify-content: center;
477 align-items: center;
478 cursor: pointer;
479 font-size: 20px;
480 color: #957f3f;
481 transition: all 0.3s;
482 border-left: none;
483}
484
485.audio_player_wrap {
486 display: flex;
487 align-items: center;
488 justify-content: space-between;
489 flex-wrap: wrap;
490 margin: 6px 0 0 0px;
491}
492
493.audio_player_wrap .date {
494 width: 95px;
495 font-size: 11px;
496 color: #9e9e9e;
497}
498
499.audio_player_wrap .post-view {
500 width: auto;
501 margin: 0;
502 padding: 0;
503 display: flex;
504 list-style: none;
505}
506
507.audio_player_wrap .audio-player {
508 width: 100%;
509}
510
511.audio_player_wrap .post-view li {
512 padding-left: 10px;
513}
514
515.audio_player_wrap .post-view li * {
516 font-size: 12px;
517 color: #000;
518}
519
520.audio_player_wrap .audio-player .controls {
521 display: flex;
522 align-items: center;
523 justify-content: space-between;
524 padding: 4px 13px;
525 background: #e7e7e7;
526}
527
528.toggle-play {
529 border-left: 10px solid #0072bc;
530 border-top: 7px solid transparent;
531 border-bottom: 7px solid transparent;
532 cursor: pointer;
533}
534
535.audio-player .time {
536 width: 54px;
537 padding: 0 2px;
538 text-align: center;
539 display: flex;
540 align-items: center;
541 justify-content: center;
542 font-size: 10px;
543 color: #010100;
544 font-family: "Helvetica", sans-serif;
545}
546
547.audio-player .name {
548 width: 150px;
549 height: 18px;
550 background: #fff;
551 position: relative;
552 padding: 0 12px 0 6px;
553 display: flex;
554 align-items: center;
555}
556
557#type_voice_active {
558 font-size: 9px;
559 font-weight: 700;
560}
561
562.audio-player .name:after {
563 content: "";
564 border-top: 3px solid;
565 border-left: 3px solid transparent;
566 border-right: 3px solid transparent;
567 position: absolute;
568 right: 4px;
569 top: 7px;
570}
571
572#box_list_voice {
573 list-style: none;
574 margin: 0;
575 visibility: hidden;
576 opacity: 0;
577 position: absolute;
578 left: 0;
579 top: 105%;
580 padding: 7px;
581 width: max-content;
582 border-radius: 5px;
583 box-shadow: 0 5px 12px rgba(0, 0, 0, 0.3);
584 background: #fff;
585}
586
587.audio-player .name:hover #box_list_voice {
588 visibility: visible;
589 opacity: 1;
590}
591
592#box_list_voice a {
593 font-size: 11px;
594 color: #000;
595}
596
597.audio-player .audio-timeline {
598 width: 100%;
599 margin-right: 12px;
600 background-color: #fff;
601}
602
603.audio-player .audio-timeline .audio-progress {
604 height: 4px;
605 background-color: #957f3f;
606}
607
608.audio-player .toggle-play:hover {
609 background: #ddd;
610}
611
612.audio-player .toggle-play i {
613 transition: transform 0.3s;
614}
615
616.audio-player .toggle-play.playing i {
617 transform: scale(1.2); /* Phóng to biểu tượng khi đang phát */
618}
619
620.audio-timeline {
621 cursor: pointer;
622}
623
624.audio-timeline .audio-progress {
625 height: 100%;
626 background: #957f3f;
627 width: 0;
628 transition: width 0.2s ease;
629}
630.singular-sapo {
631 margin: 6px 0 18px 0;
632 font-size: 16px;
633 line-height: 30px;
634 color: #333;
635 font-style: italic;
636 font-family: "Arial", "Noto Serif", -apple-system, BlinkMacSystemFont,
637 "Segoe UI", "Helvetica Neue", "Arial", "Apple Color Emoji", "Segoe UI Emoji",
638 "Segoe UI Symbol", serif;
639 font-weight: 400;
640}
641.article-content {
642 text-align: justify;
643}
644
645.img-caption-formatted {
646 text-align: center !important;
647 margin-top: 10px !important;
648 font-style: italic;
649 display: block;
650}
651</style>
652<style>
653.faq-send-upload {
654 display: flex;
655 gap: 12px;
656 margin-top: 20px;
657}
658.article-content a#lnkAttachSOW {
659 display: inline-block;
660 padding: 8px 10px 7px 10px;
661 gap: 6px;
662 width: 100px;
663 height: auto;
664 text-align: center;
665 background: #957F3F;
666 border-radius: 4px;
667 color: #fff !important;
668}
669.article-content a#lnkAttachSOW {
670 display: flex;
671 font-size: 0;
672 width: 44px;
673 height: auto;
674 min-height: 44px;
675 align-items: center;
676 justify-content: center;
677 gap: 0;
678}
679.article-content a#lnkAttachSOW>i {
680 font-size: 20px;
681}
682.article-content a#lnkAttachSOW>i:before {
683 content: "\f0c6";
684}
685.article-content a#lnkAttachSOW~span {
686 font-size: 12px;
687 line-height: 14px;
688 color: var(--brand-color-1);
689}
690.faq-send-upload>span {
691 padding: 6px 12px;
692 width: 100%;
693 display: inline-block;
694 background: var(--brand-color-2);
695 border-radius: 4px;
696 position: relative;
697}
698.article-content .faq-send-upload>span::before {
699 content: 'File đính kèm';
700 width: 100%;
701 display: block;
702 height: 14px;
703 font-family: 'Roboto';
704 font-style: normal;
705 font-weight: 400;
706 font-size: 12px;
707 line-height: 14px;
708 color: #465B7E;
709 margin-bottom: 4px;
710}
711.faq-send-upload>span a {
712 font-family: 'Roboto';
713 font-style: normal;
714 font-weight: bold;
715 font-size: 12px;
716 line-height: 14px;
717 color: #394E79;
718}
719.faq-send-upload>span a:hover {
720 color: var(--brand-color-3);
721}
722.hienthixemtruoc {
723 padding: 5px;
724 text-align: center;
725 background-color: #684d2f;
726 color: #E9E5E4;
727 font-weight: bold;
728 }
729
730.hienthixemtruoc:hover {
731 cursor: pointer; }
732
733.noidungxemtruoc {
734 display: none; }
735</style>
736
737<h1 class="title-page detail">${.vars["reserved-article-title"].data}</h1>
738
739<div class="flex-author-collection">
740<div class="author-wrap">
741<#if date?? && date?has_content>
742<div class="author-avatar">
743<div class="author-avatar__picture">
744<span class="sticker sticker-user-icon sticker-null"><span class="sticker user-icon-color-8 sticker-circle"><span class="sticker-overlay"><svg class="lexicon-icon lexicon-icon-calendar" role="presentation"><use xlink:href="/o/admin-theme/images/clay/icons.svg#calendar"></use></svg></span></span></span>
745</div>
746</div>
747</#if>
748<div class="author-meta">
749<!--<div class="author-name">
750<b>${.vars["reserved-article-author-name"].data}</b>
751</div>-->
752<time class="author-time" datetime="${date}"> ${date} </time>
753</div>
754</div>
755</div>
756<div class="audio_player_wrap">
757 <div class="audio-player">
758 <div class="controls">
759 <div class="toggle-play"><i class="fas fa-play"></i></div>
760 <div class="time">
761 <div class="current">0:00</div>
762 <div class="divider">/</div>
763 <div class="length">0:00</div>
764 </div>
765 <div class="audio-timeline">
766 <div class="audio-progress"></div>
767 </div>
768 <div class="name">
769 <span id="type_voice_active">Giọng Nam</span>
770 <ul id="box_list_voice" class="box_list_voice">
771
772 <li>
773 <a href="#">Giọng Nam</a>
774 </li>
775 <li>
776 <a href="#">Giọng Nữ</a>
777 </li>
778
779 </ul>
780 </div>
781 </div>
782 </div>
783 </div>
784</br>
785<div class="article-content">
786<#if .vars["reserved-article-description"].data??>
787<h4 class="singular-sapo">${.vars["reserved-article-description"].data}</h4>
788</#if>
789<#if (AnhNoiBat.getData())?? && AnhNoiBat.getData() != "">
790 <img alt="${AnhNoiBat_Alt.getData()}" data-fileentryid="${AnhNoiBat.getAttribute("fileEntryId")}" src="${AnhNoiBat.getData()}" />
791 <p style="text-align: center;">
792 <em>${AnhNoiBat.getAttribute("alt")}</em>
793 </p>
794</br>
795<#elseif (AnhNoiBat_Url.getData())?? && (AnhNoiBat_Url.getData()) != "">
796 <img alt="${AnhNoiBat_Alt.getData()}" src="${AnhNoiBat_Url.getData()}" />
797 <p style="text-align: center;">
798 <em>${AnhNoiBat_Alt.getData()}</em>
799 </p>
800</br>
801</#if>
802${content.getData()}
803<#if (NguonTin.getData())??>
804</br>
805<strong>
806 ${NguonTin.getData()}
807</strong>
808</#if>
809<#assign fileList = FileDinhKem1.getSiblings()?filter(f -> f.getData()?has_content) />
810<#assign fileListUrl = FileDinhKem1.getSiblings()?filter(f -> f.dtvb_fileurl.getData()?has_content) />
811<#assign textif = "textif">
812<#assign textelse = "textelse">
813
814<#if fileListUrl?size gt 0 >
815<#list FileDinhKem1.getSiblings() as cur_FileDinhKem>
816 <#assign idx = cur_FileDinhKem?index>
817 <#assign fileName = cur_FileDinhKem.dtvb_filename1.getData()!"">
818 <#assign fileUrl = cur_FileDinhKem.dtvb_fileurl1.getData()!"">
819 ${fileName}
820 ${fileUrl}
821 <#-- CASE 1: filename là SBVxxx → lấy URL của item trước -->
822 <#-- <#if fileName?starts_with("SBV") && idx gt 0>
823 <#assign prev = siblings[idx - 1]>
824 <#if prev.dtvb_fileurl??
825 && prev.dtvb_fileurl.getData()?has_content>
826 <#assign fileUrl = prev.dtvb_fileurl.getData()>
827 </#if>
828 </#if> -->
829 <br>
830</#list>
831
832
833</#if>
834<#if fileList?size gt 0 >
835 ${textif}
836 <div class="cont">
837 <div class="faq-send-upload">
838 <a id="lnkAttachSOW"><i class="fa-solid fa-paperclip"></i> Đính kèm</a>
839 <span>
840 <#list FileDinhKem1.getSiblings() as cur_FileDinhKem>
841 <#if cur_FileDinhKem.dtvb_filelink1.getData()?has_content>
842 <a href="${cur_FileDinhKem.dtvb_filelink1.getData()}">
843 <#if (cur_FileDinhKem.dtvb_filename1.getData())??>
844 ${cur_FileDinhKem.dtvb_filename1.getData()}
845 </#if>
846 </a>
847 <#elseif cur_FileDinhKem.dtvb_fileurl1.getData()?has_content>
848 <a href="${cur_FileDinhKem.dtvb_fileurl1.getData()}">
849 <#if (cur_FileDinhKem.dtvb_filename1.getData())??>
850 ${cur_FileDinhKem.dtvb_filename1.getData()}
851 </#if>
852 </a>
853 </#if>
854 <br>
855 </#list>
856 </span>
857 </div>
858 </div>
859<br/>
860</#if>
861
862
863
864
865<#assign baseUrl = "https://sbv.tinhvan.com"> <!-- Thay bằng domain thực tế -->
866
867<#if fileList?size gt 0>
868 <#list FileDinhKem1.getSiblings() as cur_FileDinhKem>
869 <div class="hienthixemtruoc">Ẩn/Hiện nội dung file ${cur_FileDinhKem.dtvb_filename1.getData()} </div>
870 <#if cur_FileDinhKem.dtvb_filelink1?? && cur_FileDinhKem.dtvb_filelink1.getData()?has_content>
871 <div class="noidungxemtruoc">
872 <#assign fileUrl = cur_FileDinhKem.dtvb_filelink1.getData()?lower_case>
873 <#assign url = baseUrl + fileUrl>
874 <#if fileUrl?matches(".*\\.docx?(/|\\?).*")>
875 <iframe src="https://docs.google.com/gview?url=${url}&embedded=true"
876 width="100%" height="800px" frameborder="0"></iframe>
877 <#else>
878 <embed src="${cur_FileDinhKem.dtvb_filelink1.getData()}" height="800px" width="100%" type="application/pdf">
879 </#if>
880 </div>
881 <#elseif cur_FileDinhKem.dtvb_fileurl1.getData()?? && cur_FileDinhKem.dtvb_fileurl1.getData()?has_content>
882 <div class="noidungxemtruoc">
883 <#assign fileUrl = cur_FileDinhKem.dtvb_fileurl1.getData()?lower_case>
884 <#assign url = baseUrl + fileUrl>
885 <#if fileUrl?matches(".*\\.docx?(/|\\?).*")>
886 <iframe src="https://docs.google.com/gview?url=${url}&embedded=true"
887 width="100%" height="800px" frameborder="0"></iframe>
888 <#else>
889 <embed src="${cur_FileDinhKem.dtvb_fileurl1.getData()}" height="800px" width="100%" type="application/pdf">
890 </#if>
891 </div>
892 </#if>
893 </#list>
894</#if>
895
896</div>
897</div>
898
899
900<div class="singular-sidebar side-bar-height" data-module="social-pin">
901 <ul class="cpanel-action social-pin ">
902 <li>
903 <a href="javascript:;" title="Tăng cỡ chữ" class="btn-font">
904 <span class="plus">
905 <svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg">
906 <rect x="0.5" y="0.996155" width="21" height="21" rx="10.5" fill="white"></rect>
907 <path d="M13.9923 12.0339H11.5756V14.5518H10.4116V12.0339H8.00757V10.9458H10.4116V8.44054H11.5756V10.9458H13.9923V12.0339Z" fill="black"></path>
908 <rect x="0.5" y="0.996155" width="21" height="21" rx="10.5" stroke="#DFE0E3"></rect>
909 </svg>
910
911 </span>
912 <span class="font" "="">
913 aA
914 </span>
915 <span class="minus" "="">
916 <svg width="22" height="23" viewBox="0 0 22 23" fill="none" xmlns="http://www.w3.org/2000/svg">
917 <rect x="0.5" y="0.996124" width="21" height="21" rx="10.5" fill="white"></rect>
918 <path d="M12.9233 10.9141V12.0781H9.0769V10.9141H12.9233Z" fill="black"></path>
919 <rect x="0.5" y="0.996124" width="21" height="21" rx="10.5" stroke="#DFE0E3"></rect>
920 </svg>
921
922 </span>
923 </a>
924 </li>
925 <li>
926 <a class="cpanel-item facebook" target="_blank" href="https://www.facebook.com/sharer.php?u=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên facebook">
927 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
928 <path d="M21.125 16.3v2.9h2.925c.225 0 .337.2.337.4l-.45 1.9c0 .1-.225.2-.337.2h-2.475V29H17.75v-7.2h-1.912c-.225 0-.338-.1-.338-.3v-1.9c0-.2.113-.3.338-.3h1.912V16c0-1.7 1.462-3 3.375-3h3.038c.224 0 .337.1.337.3v2.4c0 .2-.113.3-.337.3h-2.7c-.226 0-.338.1-.338.3z" fill="#292D32"></path>
929 </svg>
930 </a>
931 </li>
932 <li>
933 <a class="cpanel-item twitter" href="https://twitter.com/intent/tweet?text=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" target="_blank" rel="nofollow" title="Chia sẻ bài viết lên twitter">
934 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
935 <path d="M29.5 15.5c-.675.3-1.35.4-2.137.5.787-.4 1.35-1 1.575-1.8-.675.4-1.463.6-2.363.8-.675-.6-1.688-1-2.7-1-1.913 0-3.6 1.5-3.6 3.3 0 .3 0 .5.113.7-3.038-.1-5.85-1.4-7.65-3.4-.338.5-.45 1-.45 1.7 0 1.1.675 2.1 1.687 2.7-.563 0-1.125-.2-1.688-.4 0 1.6 1.238 2.9 2.925 3.2-.337.1-.675.1-1.012.1-.225 0-.45 0-.675-.1.45 1.3 1.8 2.3 3.487 2.3-1.237.9-2.812 1.4-4.612 1.4h-.9c1.688.9 3.6 1.5 5.625 1.5 6.75 0 10.462-5 10.462-9.3v-.4c.788-.5 1.463-1.1 1.913-1.8z" fill="#292D32" stroke="#292D32" stroke-linejoin="round"></path>
936 </svg>
937 </a>
938 </li>
939 <li>
940 <a class="cpanel-item linkedin" target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=http://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên linkedin">
941 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
942 <g clip-path="url(#IconLinkedin_svg__prefix__clip0_752_6605)">
943 <path d="M27.8 12H13.2c-.4 0-.7.3-.7.7v14.7c0 .3.3.6.7.6h14.7c.4 0 .7-.3.7-.7V12.7c-.1-.4-.4-.7-.8-.7zM17.2 25.6h-2.3V18h2.4v7.6h-.1zM16.1 17c-.8 0-1.4-.7-1.4-1.4 0-.8.6-1.4 1.4-1.4.8 0 1.4.6 1.4 1.4-.1.7-.7 1.4-1.4 1.4zm10 8.6h-2.4v-3.7c0-.9 0-2-1.2-2s-1.4 1-1.4 2v3.8h-2.4V18H21v1c.3-.6 1.1-1.2 2.2-1.2 2.4 0 2.8 1.6 2.8 3.6v4.2h.1z" fill="#292D32"></path>
944 </g>
945 </svg>
946 </a>
947 </li>
948 <li class="zalo-share-button" data-href="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-oaid="408045471040429277" data-layout="3" data-color="blue" data-customize="true">
949 <button class="cpanel-item zalo" title="Chia sẻ bài viết lên zalo" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-zalo" data-content-target="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}">
950 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
951 <g clip-path="url(#IconZalo_svg__a)">
952 <path fill-rule="evenodd" clip-rule="evenodd" d="M20.68 17.52v-.456h1.368v6.418h-.782a.585.585 0 0 1-.585-.581 3.334 3.334 0 0 1-5.301-2.69 3.334 3.334 0 0 1 5.3-2.69zM15.026 15v.208c0 .388-.052.705-.305 1.077l-.03.035a7.62 7.62 0 0 0-.246.288l-4.39 5.51h4.97v.78a.585.585 0 0 1-.585.584H8v-.367c0-.45.112-.652.253-.861l4.68-5.792H8.194V15h6.83zm8.681 8.482a.488.488 0 0 1-.487-.487V15h1.463v8.482h-.976zm5.304-6.644a3.357 3.357 0 1 1 0 6.713 3.357 3.357 0 0 1 0-6.713zm-10.297 5.333a1.96 1.96 0 1 0 0-3.92 1.96 1.96 0 1 0 0 3.92zm10.297-.003a1.975 1.975 0 1 0-.001-3.95 1.975 1.975 0 0 0 0 3.95z" fill="#292D32"></path>
953 </g>
954 <defs>
955 <clipPath id="IconZalo_svg__a">
956 <path fill="#fff" transform="translate(8 15)" d="M0 0h25v9H0z"></path>
957 </clipPath>
958 </defs>
959 </svg>
960 </button>
961 </li>
962 <li>
963 <button type="button" class="cpanel-item link" onclick="copyLink('https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}')" title="Copy">
964 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
965 <g clip-path="url(#IconLinking_svg__prefix__clip0_608_611)" fill="#292D32">
966 <path d="M16.5 28c-1.2 0-2.3-.5-3.2-1.3-1.8-1.8-1.8-4.6 0-6.4l.7-.7 1.4 1.4-.7.7c-1 1-1 2.6 0 3.6s2.6 1 3.6 0l3-3c1-1 1-2.6 0-3.6l-.7-.7 1.4-1.4.7.7c1.8 1.8 1.8 4.6 0 6.4l-3 3c-.8.8-2 1.3-3.2 1.3z"></path>
967 <path d="m18 23.4-.7-.7c-1.8-1.8-1.8-4.6 0-6.4l3-3c.9-.9 2-1.3 3.2-1.3 1.2 0 2.3.5 3.2 1.3 1.8 1.8 1.8 4.6 0 6.4l-.7.7-1.4-1.4.7-.7c1-1 1-2.6 0-3.6s-2.6-1-3.6 0l-3 3c-1 1-1 2.6 0 3.6l.7.7-1.4 1.4z"></path>
968 </g>
969 </svg>
970 </button>
971 </li>
972 <li class="line">
973 <a type="button" href="#p_p_id_com_liferay_comment_page_comments_web_portlet_PageCommentsPortlet_" class="cpanel-item comment" title="Bình luận">
974 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
975 <path d="M17.583 25.833h-.416c-3.334 0-5-.833-5-5v-4.166c0-3.334 1.666-5 5-5h6.666c3.334 0 5 1.666 5 5v4.166c0 3.334-1.666 5-5 5h-.416a.845.845 0 0 0-.667.334l-1.25 1.666c-.55.734-1.45.734-2 0l-1.25-1.666c-.133-.184-.442-.334-.667-.334z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
976 <path d="M16.333 16.667h8.334m-8.334 4.166h5" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
977 </svg>
978 <span class="x-comments"></span>
979 </a>
980 </li>
981 <!-- <li class="save ">
982 <button class="saved-article-20230824031513522 vLPsOJ4TxOzrC0g8QrVd MXHPvY_upC4YgT_Z3MLn ">
983 <span class="woK3sep4ykUXzIebVRTv"></span>
984 </button>
985 </li> -->
986 <li>
987 <button id="ic_print" rel="nofollow" onclick="javascript:;" class="cpanel-item print" title="In">
988 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
989 <path d="M16.542 15.833h7.916v-1.666c0-1.667-.625-2.5-2.5-2.5h-2.916c-1.875 0-2.5.833-2.5 2.5v1.666z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
990 <path d="M28 18.333V22.5c0 1.667-.833 2.5-2.5 2.5v-2h-10v2c-1.667 0-2.5-.833-2.5-2.5v-4.167c0-1.666.833-2.5 2.5-2.5h10c1.667 0 2.5.834 2.5 2.5zM25.5 23h-10m.833-3.833h2.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
991 <path d="M25.5 23v2.857c0 1.429-1.25 2.143-3.75 2.143h-2.5c-2.5 0-3.75-.714-3.75-2.143V23h10z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
992 </svg>
993 </button>
994 </li>
995 <li>
996 <button onclick="history.back()" class="cpanel-item back">
997 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
998 <path d="M18.475 14.942 13.417 20l5.058 5.058M27.583 20H13.558" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
999 </svg>
1000 </button>
1001 </li>
1002 </ul>
1003</div>
1004
1005
1006<div class="singular-footer" data-module="social-pin">
1007 <ul class="cpanel-action social-pin hidden">
1008 <li>
1009 <a class="cpanel-item facebook" target="_blank" href="https://www.facebook.com/sharer.php?u=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-facebook" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên facebook">
1010 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1011 <path d="M21.125 16.3v2.9h2.925c.225 0 .337.2.337.4l-.45 1.9c0 .1-.225.2-.337.2h-2.475V29H17.75v-7.2h-1.912c-.225 0-.338-.1-.338-.3v-1.9c0-.2.113-.3.338-.3h1.912V16c0-1.7 1.462-3 3.375-3h3.038c.224 0 .337.1.337.3v2.4c0 .2-.113.3-.337.3h-2.7c-.226 0-.338.1-.338.3z" fill="#292D32"></path>
1012 </svg>
1013 </a>
1014 </li>
1015 <li>
1016 <a class="cpanel-item twitter" href="https://twitter.com/intent/tweet?text=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" target="_blank" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-twitter" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên twitter">
1017 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1018 <path d="M29.5 15.5c-.675.3-1.35.4-2.137.5.787-.4 1.35-1 1.575-1.8-.675.4-1.463.6-2.363.8-.675-.6-1.688-1-2.7-1-1.913 0-3.6 1.5-3.6 3.3 0 .3 0 .5.113.7-3.038-.1-5.85-1.4-7.65-3.4-.338.5-.45 1-.45 1.7 0 1.1.675 2.1 1.687 2.7-.563 0-1.125-.2-1.688-.4 0 1.6 1.238 2.9 2.925 3.2-.337.1-.675.1-1.012.1-.225 0-.45 0-.675-.1.45 1.3 1.8 2.3 3.487 2.3-1.237.9-2.812 1.4-4.612 1.4h-.9c1.688.9 3.6 1.5 5.625 1.5 6.75 0 10.462-5 10.462-9.3v-.4c.788-.5 1.463-1.1 1.913-1.8z" fill="#292D32" stroke="#292D32" stroke-linejoin="round"></path>
1019 </svg>
1020 </a>
1021 </li>
1022 <li>
1023 <a class="cpanel-item linkedin" target="_blank" href="https://www.linkedin.com/sharing/share-offsite/?url=https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-linkedin" data-content-target="/w/${.vars["reserved-article-url-title"].data}" rel="nofollow" title="Chia sẻ bài viết lên linkedin">
1024 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1025 <g clip-path="url(#IconLinkedin_svg__prefix__clip0_752_6605)">
1026 <path d="M27.8 12H13.2c-.4 0-.7.3-.7.7v14.7c0 .3.3.6.7.6h14.7c.4 0 .7-.3.7-.7V12.7c-.1-.4-.4-.7-.8-.7zM17.2 25.6h-2.3V18h2.4v7.6h-.1zM16.1 17c-.8 0-1.4-.7-1.4-1.4 0-.8.6-1.4 1.4-1.4.8 0 1.4.6 1.4 1.4-.1.7-.7 1.4-1.4 1.4zm10 8.6h-2.4v-3.7c0-.9 0-2-1.2-2s-1.4 1-1.4 2v3.8h-2.4V18H21v1c.3-.6 1.1-1.2 2.2-1.2 2.4 0 2.8 1.6 2.8 3.6v4.2h.1z" fill="#292D32"></path>
1027 </g>
1028 </svg>
1029 </a>
1030 </li>
1031 <li class="zalo-share-button" data-href="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}" data-oaid="408045471040429277" data-layout="3" data-color="blue" data-customize="true">
1032 <button class="cpanel-item zalo" title="Chia sẻ bài viết lên zalo" data-track-content="" data-content-name="article-actions" data-content-piece="article-actions-zalo" data-content-target="https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}">
1033 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1034 <g clip-path="url(#IconZalo_svg__a)">
1035 <path fill-rule="evenodd" clip-rule="evenodd" d="M20.68 17.52v-.456h1.368v6.418h-.782a.585.585 0 0 1-.585-.581 3.334 3.334 0 0 1-5.301-2.69 3.334 3.334 0 0 1 5.3-2.69zM15.026 15v.208c0 .388-.052.705-.305 1.077l-.03.035a7.62 7.62 0 0 0-.246.288l-4.39 5.51h4.97v.78a.585.585 0 0 1-.585.584H8v-.367c0-.45.112-.652.253-.861l4.68-5.792H8.194V15h6.83zm8.681 8.482a.488.488 0 0 1-.487-.487V15h1.463v8.482h-.976zm5.304-6.644a3.357 3.357 0 1 1 0 6.713 3.357 3.357 0 0 1 0-6.713zm-10.297 5.333a1.96 1.96 0 1 0 0-3.92 1.96 1.96 0 1 0 0 3.92zm10.297-.003a1.975 1.975 0 1 0-.001-3.95 1.975 1.975 0 0 0 0 3.95z" fill="#292D32"></path>
1036 </g>
1037 <defs>
1038 <clipPath id="IconZalo_svg__a">
1039 <path fill="#fff" transform="translate(8 15)" d="M0 0h25v9H0z"></path>
1040 </clipPath>
1041 </defs>
1042 </svg>
1043 </button>
1044 </li>
1045 <li>
1046 <button type="button" class="cpanel-item link" onclick="copyLink('https://sbv.tinhvan.com/w/${.vars["reserved-article-url-title"].data}')" title="Copy">
1047 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1048 <g clip-path="url(#IconLinking_svg__prefix__clip0_608_611)" fill="#292D32">
1049 <path d="M16.5 28c-1.2 0-2.3-.5-3.2-1.3-1.8-1.8-1.8-4.6 0-6.4l.7-.7 1.4 1.4-.7.7c-1 1-1 2.6 0 3.6s2.6 1 3.6 0l3-3c1-1 1-2.6 0-3.6l-.7-.7 1.4-1.4.7.7c1.8 1.8 1.8 4.6 0 6.4l-3 3c-.8.8-2 1.3-3.2 1.3z"></path>
1050 <path d="m18 23.4-.7-.7c-1.8-1.8-1.8-4.6 0-6.4l3-3c.9-.9 2-1.3 3.2-1.3 1.2 0 2.3.5 3.2 1.3 1.8 1.8 1.8 4.6 0 6.4l-.7.7-1.4-1.4.7-.7c1-1 1-2.6 0-3.6s-2.6-1-3.6 0l-3 3c-1 1-1 2.6 0 3.6l.7.7-1.4 1.4z"></path>
1051 </g>
1052 </svg>
1053 </button>
1054 </li>
1055 <li class="line">
1056 <a type="button" href="#p_p_id_com_liferay_comment_page_comments_web_portlet_PageCommentsPortlet_" class="cpanel-item comment" title="Bình luận">
1057 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1058 <path d="M17.583 25.833h-.416c-3.334 0-5-.833-5-5v-4.166c0-3.334 1.666-5 5-5h6.666c3.334 0 5 1.666 5 5v4.166c0 3.334-1.666 5-5 5h-.416a.845.845 0 0 0-.667.334l-1.25 1.666c-.55.734-1.45.734-2 0l-1.25-1.666c-.133-.184-.442-.334-.667-.334z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
1059 <path d="M16.333 16.667h8.334m-8.334 4.166h5" stroke="#292D32" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
1060 </svg>
1061 <span class="x-comments"></span>
1062 </a>
1063 </li>
1064 <li>
1065 <button id="ic_print2" rel="nofollow" onclick="javascript:;" class="cpanel-item print" title="In">
1066 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1067 <path d="M16.542 15.833h7.916v-1.666c0-1.667-.625-2.5-2.5-2.5h-2.916c-1.875 0-2.5.833-2.5 2.5v1.666z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
1068 <path d="M28 18.333V22.5c0 1.667-.833 2.5-2.5 2.5v-2h-10v2c-1.667 0-2.5-.833-2.5-2.5v-4.167c0-1.666.833-2.5 2.5-2.5h10c1.667 0 2.5.834 2.5 2.5zM25.5 23h-10m.833-3.833h2.5" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
1069 <path d="M25.5 23v2.857c0 1.429-1.25 2.143-3.75 2.143h-2.5c-2.5 0-3.75-.714-3.75-2.143V23h10z" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
1070 </svg>
1071 </button>
1072 </li>
1073 <li>
1074 <button onclick="history.back()" class="cpanel-item back">
1075 <svg width="40" height="40" fill="none" xmlns="http://www.w3.org/2000/svg">
1076 <path d="M18.475 14.942 13.417 20l5.058 5.058M27.583 20H13.558" stroke="#292D32" stroke-width="1.5" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"></path>
1077 </svg>
1078 </button>
1079 </li>
1080 </ul>
1081</div>
1082
1083<div class="content-tags">
1084<ul class="tags-wrap mt-30">
1085 <#if categories?has_content>
1086 <li class="label"><b><@liferay.language key="categories" />:</b></li>
1087 <#list categories as category>
1088 <#assign categoryURL = renderResponse.createRenderURL()
1089 categoryId = category.getCategoryId()?string
1090 />
1091 ${categoryURL.setParameter("resetCur", "true")}
1092 ${categoryURL.setParameter("categoryId", category.getCategoryId()?string)}
1093 <li>
1094 <a title="${category.getName()}" href="/w/${.vars["reserved-article-url-title"].data}/-/categories/${category.getCategoryId()}">${category.getName()}</a> ${category?has_next?then(' ', '')}
1095 </li>
1096 </#list>
1097</#if>
1098</ul>
1099</div>
1100
1101<#assign tags = stringUtil.split(.vars["reserved-article-asset-tag-names"].data,",")>
1102<#if tags?size gte 1>
1103<div class="content-tags">
1104<ul class="tags-wrap">
1105 <li class="label"><b><@liferay.language key="keywords" />:</b></li>
1106 <#list tags as tag>
1107 <li>
1108 <a
1109 title="${tag}"
1110 href="/w/${.vars["reserved-article-url-title"].data}/-/tag/${tag}"
1111 data-content-name="article-tags"
1112 data-content-piece="article-tags-position_1"
1113 data-content-target="/w/${.vars["reserved-article-url-title"].data}/-/tag/${tag}?assetEntryId=${.vars["reserved-article-id"].data}"
1114 data-track-content=""
1115 >
1116 ${tag}
1117 </a>
1118 </li>
1119 </#list>
1120</ul>
1121</div>
1122</#if>
1123<script>
1124 $(document).ready(function() {
1125 var xComments = [];
1126 var yourArray = [];
1127 $(".add-comment .show .panel-body .text-secondary.text-uppercase strong").each(function(){
1128 if($.trim($(this).text()).length > 0) {
1129 if($(this).text().substring(0, 1)!='T'){
1130 xComments.push($(this).text().substring(0, 1));
1131 }else{
1132 xComments.push('0');
1133 }
1134 }
1135 });
1136
1137 $(".x-comments").each(function(){
1138 $(this).text(xComments[0]);
1139 });
1140
1141 $(".x-comments").text(xComments[0]);
1142
1143 var images = $(".article-content picture");
1144
1145 if (images.length <= 0) {
1146 images = $(".article-content img, .article-content figure img, .article-content .document img");
1147 }
1148
1149 images.each(function(){
1150 var imageSource;
1151 var image= $(this);
1152 if (image.is('picture')) {
1153 var sources = image.find('source');
1154 sources.each(function() {
1155 var mediaQuery = $(this).attr('media');
1156 if (window.matchMedia(mediaQuery).matches) {
1157 imageSource = $(this).attr('srcset');
1158 return false;
1159 }
1160 });
1161 } else {
1162 imageSource = image.attr('src');
1163 }
1164
1165 if (!imageSource) {
1166 imageSource = image.find('img').attr('src');
1167 }
1168
1169 image.wrap(function() {
1170 var dataCaption = $(this).next().text();
1171 if (!dataCaption || dataCaption.length === 0) {
1172 dataCaption = $(this).parent().next().text().trim();
1173 }
1174 if (!dataCaption || dataCaption.length === 0) {
1175 dataCaption = $(this).parent().parent().next().text().trim();
1176 }
1177 return '<a data-fancybox="gallery" data-src="' + imageSource + '" data-caption="' + dataCaption + '"/>';
1178 });
1179});
1180
1181 Fancybox.bind('[data-fancybox="gallery"]', {
1182 //
1183 });
1184
1185 var baseFont = 14;
1186 function fontchange(n) {
1187 baseFont += n;
1188 $(".article-content p,.article-content span").css("font-size", baseFont + "px");
1189 savecookie("fontsize", baseFont)
1190 }
1191
1192 function fontdefault() {
1193 $(".article-content p,.article-content span").css("font-size", "14px");
1194 savecookie("fontsize", 14);
1195 }
1196
1197 function getcookie(n) {
1198 var t;
1199 return (t = new RegExp("(?:^|; )" + encodeURIComponent(n) + "=([^;]*)").exec(document.cookie)) ? t[1] : null;
1200 }
1201
1202 function savecookie(n, t) {
1203 var i = new Date, r;
1204 i.setTime(i.getTime() + 31536e6);
1205 r = "; expires=" + i.toGMTString();
1206 document.cookie = n + "=" + t + r + "; path=/;";
1207 }
1208
1209 if ($('.btn-font').length > 0) {
1210 $('.plus').off('click').on('click', function () {
1211 fontchange(1);
1212 });
1213 $('.minus').off('click').on('click', function () {
1214 fontchange(-1);
1215 });
1216 $('.font').off('click').on('click', function () {
1217 fontdefault();
1218 });
1219 }
1220
1221 function printDiv(divName){
1222
1223 var printContents = document.getElementById(divName).innerHTML;
1224 var originalContents = document.body.innerHTML;
1225
1226 document.body.innerHTML = printContents;
1227
1228 window.print();
1229
1230 document.body.innerHTML = originalContents;
1231 }
1232
1233 function copyLink(link) {
1234 $(".link").append('<span class="tooltiptext">Đã copy</span>');
1235 const unsecuredCopyToClipboard = (text) => {
1236 const textArea = document.createElement("textarea");
1237 textArea.value=text;
1238 document.body.appendChild(textArea);
1239 textArea.select();
1240 try {
1241 document.execCommand('copy');
1242 } catch(err) {
1243 console.error('Unable to copy to clipboard', err);
1244 }
1245 document.body.removeChild(textArea);
1246 };
1247
1248 if (window.isSecureContext && navigator.clipboard) {
1249 navigator.clipboard.writeText(link);
1250 } else {
1251 unsecuredCopyToClipboard(link);
1252 }
1253
1254 setTimeout(function() {
1255 $(".tooltiptext").remove();
1256 }, 3000);
1257 }
1258
1259 function isOnScreen(){
1260 var curPos = $('.singular-footer').offset();
1261 var curTop = curPos.top - $(window).scrollTop();
1262 var screenHeight = $(window).height();
1263 if (curTop < screenHeight) {
1264 $('.singular-sidebar').hide();
1265 } else {
1266 $('.singular-sidebar').show();
1267 }
1268 }
1269
1270 window.onscroll = isOnScreen;
1271
1272 //Start xử lý nút đọc nội dung
1273 const playButton = document.querySelector(".toggle-play");
1274 const playIcon = playButton.querySelector("i");
1275 const voicesList = document.querySelectorAll("#box_list_voice li a");
1276 const activeVoiceLabel = document.querySelector("#type_voice_active");
1277 const currentTimeDisplay = document.querySelector(".time .current");
1278 const totalTimeDisplay = document.querySelector(".time .length");
1279 const timeline = document.querySelector(".audio-timeline");
1280 const progress = document.querySelector(".audio-progress");
1281 let selectedVoice = "Vietnamese Male";
1282
1283 let isPlaying = false;
1284 let intervalId;
1285 let elapsedSeconds = 0;
1286 let estimatedLength = 0;
1287
1288 // Kiểm tra giọng đọc hợp lệ
1289 function validateVoice() {
1290 const voices = responsiveVoice.getVoices();
1291 const validVoice = voices.find(v => v.name === selectedVoice);
1292 if (!validVoice) {
1293 console.warn("Giọng đọc không hợp lệ:", selectedVoice);
1294 selectedVoice = "Vietnamese Female"; // Giọng mặc định nếu không tìm thấy
1295 }
1296 }
1297
1298 // Lấy nội dung từ class entry_body, xóa .post_social
1299 function getCleanContent() {
1300 const entryBodyElement = document.querySelector(".article-content").cloneNode(true);
1301 return entryBodyElement.innerText.replace("\n","").trim(); // Lấy nội dung sau khi xóa
1302 }
1303
1304 // Tính tổng thời gian dự kiến
1305 function calculateEstimatedLength(content) {
1306 const totalWords = content.split(/\s+/).length; // Đếm số từ
1307 return Math.ceil(totalWords / 3.33); // Thời gian đọc (giây) với tốc độ ~3.33 từ/giây
1308 }
1309
1310 // Định dạng thời gian thành mm:ss
1311 function formatTime(seconds) {
1312 const mins = Math.floor(seconds / 60);
1313 const secs = seconds % 60;
1314 return mins + ":" + (secs < 10 ? "0" : "") + secs;
1315 }
1316
1317 // Cập nhật thanh timeline
1318 function updateProgress() {
1319 const percentage = (elapsedSeconds / estimatedLength) * 100;
1320 progress.style.width = percentage + "%";
1321 }
1322
1323 // Gán sự kiện cho nút play/pause
1324 playButton.addEventListener("click", function () {
1325 const cleanContent = getCleanContent(); // Lấy nội dung đã loại bỏ post_social
1326 estimatedLength = calculateEstimatedLength(cleanContent);
1327 totalTimeDisplay.textContent = formatTime(estimatedLength);
1328
1329 validateVoice();
1330
1331 if (!cleanContent) {
1332
1333 alert("Không có nội dung để đọc!");
1334
1335 return;
1336 }
1337
1338 if (isPlaying) {
1339 responsiveVoice.cancel();
1340 isPlaying = false;
1341 playIcon.classList.remove("fa-pause");
1342 playIcon.classList.add("fa-play");
1343 clearInterval(intervalId); // Dừng bộ đếm thời gian
1344 } else {
1345 responsiveVoice.speak(cleanContent, selectedVoice, {
1346 onend: function () {
1347 isPlaying = false;
1348 playIcon.classList.remove("fa-pause");
1349 playIcon.classList.add("fa-play");
1350 clearInterval(intervalId);
1351 elapsedSeconds = 0;
1352 currentTimeDisplay.textContent = formatTime(0);
1353 progress.style.width = "0%";
1354 },
1355 onerror: function (e) {
1356 console.error("Lỗi phát âm thanh:", e);
1357 alert("Không thể phát âm thanh. Vui lòng kiểm tra lại.");
1358 }
1359 });
1360 isPlaying = true;
1361 playIcon.classList.remove("fa-play");
1362 playIcon.classList.add("fa-pause");
1363
1364 // Bắt đầu bộ đếm thời gian
1365 elapsedSeconds = 0; // Đặt lại thời gian bắt đầu
1366 intervalId = setInterval(function () {
1367 if (elapsedSeconds < estimatedLength) {
1368 elapsedSeconds++;
1369 currentTimeDisplay.textContent = formatTime(elapsedSeconds);
1370 updateProgress(); // Cập nhật thanh tiến trình
1371 } else {
1372 clearInterval(intervalId); // Dừng khi đạt tổng thời lượng
1373 }
1374 }, 1000);
1375 }
1376 });
1377
1378 // Tua hoặc quay lại trong thanh timeline
1379 timeline.addEventListener("click", function (e) {
1380 const timelineWidth = timeline.offsetWidth;
1381 const clickX = e.offsetX;
1382 const newTime = (clickX / timelineWidth) * estimatedLength;
1383 elapsedSeconds = Math.floor(newTime);
1384 currentTimeDisplay.textContent = formatTime(elapsedSeconds);
1385 updateProgress();
1386
1387 // Nếu đang phát, cập nhật lại giọng nói từ thời điểm mới
1388 if (isPlaying) {
1389 responsiveVoice.cancel();
1390 const remainingContent = getRemainingContent(getCleanContent(), elapsedSeconds, estimatedLength);
1391 responsiveVoice.speak(remainingContent, selectedVoice);
1392 }
1393 });
1394
1395 // Hàm lấy nội dung từ thời điểm tua
1396 function getRemainingContent(content, elapsed, total) {
1397 const totalWords = content.split(/\s+/).length;
1398 const startWord = Math.floor((elapsed / total) * totalWords);
1399 return content.split(/\s+/).slice(startWord).join(" ");
1400 }
1401
1402 // Gán sự kiện thay đổi giọng đọc
1403 voicesList.forEach(function (voiceItem) {
1404 voiceItem.addEventListener("click", function () {
1405 const voiceName = voiceItem.textContent.trim();
1406
1407 // Chuyển đổi giọng đọc dựa trên tên giọng
1408 switch (voiceName) {
1409
1410 case "Giọng Nam":
1411 selectedVoice = "Vietnamese Male";
1412 break;
1413 case "Giọng Nữ":
1414 selectedVoice = "Vietnamese Female";
1415 break;
1416
1417 }
1418
1419 // Cập nhật nhãn hiển thị
1420 activeVoiceLabel.textContent = voiceName;
1421 });
1422 });
1423 //End xử lý nút đọc nội dung
1424
1425 //Start xử lý nút in trang
1426 const printButton = document.querySelector("#ic_print");
1427
1428 printButton.addEventListener("click", function (e) {
1429 e.preventDefault(); // Ngăn hành vi mặc định
1430debugger
1431 // Lấy HTML của <head> (tất cả <link> và <style>)
1432 const headHTML = document.head.outerHTML;
1433 // Lấy nội dung của class .main
1434 const mainContentElement = document.querySelector("#print-content").cloneNode(true);
1435
1436 // Xóa các phần tử không cần in
1437 const audioPlayerWrap = mainContentElement.querySelector(".audio_player_wrap");
1438 if (audioPlayerWrap) audioPlayerWrap.remove(); // Xóa audio_player_wrap
1439
1440 // Lưu nội dung gốc của trang
1441 const originalContent = document.body.innerHTML;
1442
1443 // Thay thế toàn bộ nội dung body bằng nội dung .main đã xử lý
1444 document.body.innerHTML = mainContentElement.innerHTML;
1445
1446 // Gọi hàm in
1447 window.print();
1448
1449 // Khôi phục lại nội dung gốc
1450 document.body.innerHTML = originalContent;
1451
1452 // Đảm bảo script được chạy lại sau khi khôi phục
1453 window.location.reload();
1454 });
1455
1456 const printButton2 = document.querySelector("#ic_print2");
1457
1458 printButton2.addEventListener("click", function (e) {
1459 e.preventDefault(); // Ngăn hành vi mặc định
1460
1461 // Lấy nội dung của class .main
1462 const mainContentElement = document.querySelector("#print-content").cloneNode(true);
1463
1464 // Xóa các phần tử không cần in
1465 const audioPlayerWrap = mainContentElement.querySelector(".audio_player_wrap");
1466 const postSocial = mainContentElement.querySelector(".post_social");
1467 const post_relate = mainContentElement.querySelector(".post_relate");
1468 const Danh_sach_comment = mainContentElement.querySelector("#Danh-sach-comment");
1469 const Danh_sach_ratting = mainContentElement.querySelector("#Danh-sach-ratting");
1470 if (audioPlayerWrap) audioPlayerWrap.remove(); // Xóa audio_player_wrap
1471 if (postSocial) postSocial.remove(); // Xóa post_social
1472 if (post_relate) post_relate.remove(); // Xóa post_relate
1473 if (Danh_sach_comment) Danh_sach_comment.remove(); // Xóa Danh_sach_comment
1474 if (Danh_sach_ratting) Danh_sach_ratting.remove(); // Xóa Danh_sach_ratting
1475
1476 // Lưu nội dung gốc của trang
1477 const originalContent = document.body.innerHTML;
1478
1479 // Thay thế toàn bộ nội dung body bằng nội dung .main đã xử lý
1480 document.body.innerHTML = mainContentElement.innerHTML;
1481
1482 // Gọi hàm in
1483 window.print();
1484
1485 // Khôi phục lại nội dung gốc
1486 document.body.innerHTML = originalContent;
1487
1488 // Đảm bảo script được chạy lại sau khi khôi phục
1489 window.location.reload();
1490 });
1491
1492 //End xử lý nút In trang
1493 });
1494</script>
1495
1496
1497
1498<script>
1499
1500function isInsideStrongTag(element) {
1501 while (element) {
1502 if (
1503 element.nodeType === Node.ELEMENT_NODE &&
1504 element.tagName.toLowerCase() === "strong"
1505 ) {
1506
1507 return true;
1508 }
1509 element = element.parentElement;
1510 }
1511 return false;
1512}
1513
1514 function formatImageCaptions() {
1515 const articleContents = document.querySelectorAll(".article-content");
1516 let formattedCount = 0;
1517
1518 articleContents.forEach((articleContent) => {
1519 const images = articleContent.querySelectorAll("img");
1520
1521 images.forEach((img) => {
1522 const firstText = findFirstTextAfterElement(img);
1523 if (firstText) {
1524 // --- NEW: kiểm tra có nằm trong thẻ <strong> không ---
1525 const isInStrongTag = isInsideStrongTag(firstText.element);
1526 const isLongDescription = firstText.text.length > 150;
1527
1528 if (isInStrongTag || isLongDescription) {
1529 return;
1530 }
1531
1532 removeBrElementsBetween(img, firstText.element);
1533
1534 const pElement = document.createElement("p");
1535 pElement.classList.add("img-caption-formatted");
1536 pElement.textContent = firstText.text;
1537
1538 if (firstText.type === "textNode") {
1539 firstText.element.parentNode.replaceChild(pElement, firstText.element);
1540 } else {
1541 firstText.element.parentNode.replaceChild(pElement, firstText.element);
1542 }
1543
1544 formattedCount++;
1545 }
1546 });
1547 });
1548}
1549
1550
1551 function removeBrElementsBetween(startElement, endElement) {
1552 let current = startElement.nextSibling;
1553 const elementsToRemove = [];
1554
1555 // Duyệt qua các sibling elements cho đến khi gặp endElement
1556 while (current && current !== endElement) {
1557 if (
1558 current.nodeType === Node.ELEMENT_NODE &&
1559 current.tagName.toLowerCase() === "br"
1560 ) {
1561 elementsToRemove.push(current);
1562 } else if (
1563 current.nodeType === Node.TEXT_NODE &&
1564 current.textContent.trim() === ""
1565 ) {
1566 // Cũng xóa các text node rỗng (chỉ chứa whitespace)
1567 elementsToRemove.push(current);
1568 }
1569 current = current.nextSibling;
1570 }
1571
1572 // Xóa tất cả các element đã đánh dấu
1573 elementsToRemove.forEach((el) => {
1574 if (el.parentNode) {
1575 el.parentNode.removeChild(el);
1576 }
1577 });
1578 }
1579
1580 function findFirstTextAfterElement(element) {
1581 // Tìm text đầu tiên sau element, bao gồm cả text node và element chứa text
1582
1583 function getNextElements(el) {
1584 const results = [];
1585 let current = el;
1586
1587 // Duyệt qua các sibling elements
1588 while (current.nextSibling) {
1589 current = current.nextSibling;
1590 results.push(current);
1591 }
1592
1593 // Nếu không có sibling, đi lên parent và tìm tiếp
1594 if (results.length === 0 && el.parentElement) {
1595 const parentResults = getNextElements(el.parentElement);
1596 results.push(...parentResults);
1597 }
1598
1599 return results;
1600 }
1601
1602 function findTextInElement(el) {
1603 // Kiểm tra text node trực tiếp
1604 if (el.nodeType === Node.TEXT_NODE) {
1605 const text = el.textContent.trim();
1606 if (text) {
1607 return {
1608 text: text,
1609 element: el,
1610 type: "textNode",
1611 };
1612 }
1613 }
1614
1615 // Kiểm tra element có text content
1616 if (el.nodeType === Node.ELEMENT_NODE) {
1617 // Bỏ qua các thẻ br
1618 if (el.tagName && el.tagName.toLowerCase() === "br") {
1619 return null;
1620 }
1621
1622 // Tìm text đầu tiên trong element này (dùng TreeWalker)
1623 const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, {
1624 acceptNode: function (node) {
1625 return node.textContent.trim()
1626 ? NodeFilter.FILTER_ACCEPT
1627 : NodeFilter.FILTER_SKIP;
1628 },
1629 });
1630
1631 const firstTextNode = walker.nextNode();
1632 if (firstTextNode) {
1633 // Tìm element chứa text này (có thể là parent của text node)
1634 let containingElement = firstTextNode.parentElement;
1635
1636 // Nếu element chứa text là con trực tiếp của element gốc
1637 // thì lấy element đó, nếu không thì lấy element con đầu tiên có text
1638 while (
1639 containingElement &&
1640 containingElement !== el &&
1641 containingElement.parentElement !== el
1642 ) {
1643 containingElement = containingElement.parentElement;
1644 }
1645
1646 if (containingElement && containingElement !== el) {
1647 return {
1648 text: firstTextNode.textContent.trim(),
1649 element: containingElement,
1650 type: "elementWithText",
1651 };
1652 } else {
1653 return {
1654 text: firstTextNode.textContent.trim(),
1655 element: el,
1656 type: "directText",
1657 };
1658 }
1659 }
1660 }
1661
1662 return null;
1663 }
1664
1665 // Lấy danh sách các element tiếp theo
1666 const nextElements = getNextElements(element);
1667
1668 // Tìm text đầu tiên trong các element này
1669 for (let nextEl of nextElements) {
1670 const textResult = findTextInElement(nextEl);
1671 if (textResult) {
1672 return textResult;
1673 }
1674 }
1675
1676 return null;
1677 }
1678
1679 function resetFormat() {
1680 // Xóa tất cả format đã áp dụng
1681 const formattedElements = document.querySelectorAll(
1682 ".img-caption-formatted"
1683 );
1684 formattedElements.forEach((el) => {
1685 el.remove();
1686 });
1687 }
1688
1689 // Tự động format khi trang load
1690 document.addEventListener("DOMContentLoaded", function () {
1691 formatImageCaptions();
1692 });
1693</script>
1694
1695<script>
1696window.addEventListener("load", function () {
1697 const images = document.querySelectorAll('.article-content img');
1698
1699 images.forEach(function (img) {
1700 const hasWidthAttr = img.hasAttribute('width');
1701 const hasHeightAttr = img.hasAttribute('height');
1702
1703 if (!hasWidthAttr && !hasHeightAttr) {
1704 img.style.width = '100%';
1705 img.style.height = 'auto'; // đảm bảo tỉ lệ hình ảnh không bị méo
1706 }
1707 });
1708});
1709
1710</script>