Фильтр календарь

Asset Publisher

Вакансии 2026

An error occurred while processing the template.
Java method "com.liferay.portal.kernel.util.DateUtil_IW.parseDate(String, String, Locale)" threw an exception when invoked on com.liferay.portal.kernel.util.DateUtil_IW object "com.liferay.portal.kernel.util.DateUtil_IW@2eb76117"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign displayDate = dateUtil.parseD...  [in template "29173645033645#730199#759154" at line 11, column 1]
----
1<#assign jsonFactoryUtil = staticUtil["com.liferay.portal.kernel.json.JSONFactoryUtil"]> 
2<#assign AssetEntryLocalService = staticUtil["com.liferay.asset.kernel.service.AssetEntryLocalServiceUtil"]> 
3<#assign JournalArticleLocalService = staticUtil["com.liferay.journal.service.JournalArticleLocalServiceUtil"]> 
4<#assign dlFileEntryService = staticUtil["com.liferay.document.library.kernel.service.DLFileEntryServiceUtil"]> 
5<#assign dlAppService = staticUtil["com.liferay.document.library.kernel.service.DLAppServiceUtil"]> 
6<#assign dlURLHelper = staticUtil["com.liferay.document.library.util.DLURLHelperUtil"]> 
7 
8<#assign articleModifiedDate = .vars["reserved-article-modified-date"].data /> 
9<#assign articleDisplayDate = .vars["reserved-article-display-date"].data /> 
10 
11<#assign displayDate = dateUtil.parseDate("EEE, d MMM yyyy HH:mm:ss Z", articleDisplayDate, locale) /> 
12<#assign modifiedDate = dateUtil.parseDate("EEE, d MMM yyyy HH:mm:ss Z", articleModifiedDate, locale) /> 
13 
14<#assign displayDateFormatted = dateUtil.getDate(displayDate, "dd MMM yyyy HH:mm", locale) /> 
15<#assign modifiedDateFormatted = dateUtil.getDate(modifiedDate, "dd MMM yyyy HH:mm", locale) /> 
16 
17<#attempt> 
18    <#assign articleId = .vars["reserved-article-id"].data /> 
19    <#assign article = JournalArticleLocalService.getArticle(groupId, articleId) /> 
20    <#assign entry = AssetEntryLocalService.getEntry("com.liferay.journal.model.JournalArticle", article.getResourcePrimKey()) /> 
21    <#assign views = entry.getViewCount() /> 
22<#recover> 
23    <#assign views = 1 /> 
24</#attempt> 
25 
26<#function isValidJSON jsonString> 
27    <#attempt> 
28        <#assign parsed = jsonFactoryUtil.createJSONObject(jsonString) /> 
29        <#return true> 
30    <#recover> 
31        <#return false> 
32    </#attempt> 
33</#function> 
34 
35<#function getImageUrl(imageData)> 
36    <#attempt> 
37        <#if isValidJSON(imageData)> 
38            <#assign json = jsonFactoryUtil.looseDeserialize(imageData) /> 
39            <#return '/o/adaptive-media/image/' + json.classPK + '/Preview-1000x0/' + json.title /> 
40        </#if> 
41    <#recover> 
42    </#attempt> 
43    <#return imageData /> 
44</#function> 
45 
46<#assign portletnamespace = portletDisplay.getNamespace() /> 
47<#assign isPrint = getterUtil.getBoolean(renderRequest.getAttribute('view.jsp-print'))?string('true', 'false') /> 
48<#assign adaptiveMediaId = 'Preview-1000x0' /> 
49 
50<#assign thumbnailUrl = "" /> 
51<#if bigPreview?? && bigPreview.getData()?? && bigPreview.getData() != ""> 
52    <#assign thumbnailUrl = bigPreview.getData() /> 
53<#elseif .vars?? && .vars['reserved-article-small-image-url']??> 
54    <#assign thumbnailUrl = .vars['reserved-article-small-image-url'].data /> 
55</#if> 
56 
57<div class="page_dates_news"> 
58    <p>Материал опубликован: <span>${displayDateFormatted}</span></p> 
59    <p>Обновлён: <span>${modifiedDateFormatted}</span></p> 
60    <p>Просмотров: <span>${views}</span></p> 
61</div> 
62 
63<#if content??> 
64    <div>${content.getData()}</div> 
65</#if> 
66 
67<#if isPrint == "false" && videoLink?? && videoLink.getSiblings()?has_content> 
68    <#list videoLink.getSiblings() as curVideoLink> 
69        <#if curVideoLink.getData()?length gt 0> 
70            <#assign videoInfo = jsonFactoryUtil.looseDeserialize(curVideoLink.getData()) /> 
71            <video class="video-js vjs-16-9"  
72                   poster="${defaultFullPosterURL}"  
73                   preload="metadata"  
74                   controls  
75                   width="100%"  
76                   height="354"  
77                   data-source="${videoInfo[0]}"> 
78                <source src="${videoInfo[3]}" type="video/${videoInfo[2]}" /> 
79                <source src="${videoInfo[5]}" type="video/${videoInfo[4]}" /> 
80                <source src="${videoInfo[7]}" type="video/${videoInfo[6]}" /> 
81            </video> 
82        </#if> 
83    </#list> 
84</#if> 
85 
86<#assign hasGallery = false /> 
87<#assign galleryItems = [] /> 
88 
89<#-- Проверяем альбом --> 
90<#if album?? && album.getData()?has_content> 
91    <#assign rootFileUrl = album.getData() /> 
92    <#assign groupId = rootFileUrl?keep_after("/")?keep_after("/")?keep_before("/")?number /> 
93    <#assign uuid = rootFileUrl?keep_after_last("/")?keep_before_last("?") /> 
94     
95    <#assign rootFileEntry = dlFileEntryService.getFileEntryByUuidAndGroupId(uuid, groupId) /> 
96    <#assign albumFolder = rootFileEntry.getFolder() /> 
97    <#assign albumEntries = dlAppService.getFileEntries(groupId, albumFolder.getFolderId()) /> 
98     
99    <#assign hasGallery = true /> 
100    <#list albumEntries as albumEntry> 
101        <#assign galleryItems += [{ 
102            "url": dlURLHelper.getPreviewURL(albumEntry, albumEntry.getFileVersion(), themeDisplay, ""), 
103            "alt": albumEntry.getDescription()! 
104        }] /> 
105    </#list> 
106     
107<#-- Проверяем изображения --> 
108<#elseif image?? && image.getSiblings()?has_content> 
109    <#assign images = image.getSiblings() /> 
110    <#if images?size gt 1 || (images?size == 1 && images[0].getData()?has_content)> 
111        <#assign hasGallery = true /> 
112        <#list images as curImage> 
113            <#assign imageUrl = getImageUrl(curImage.getData()) /> 
114            <#assign galleryItems += [{ 
115                "url": imageUrl, 
116                "alt": "" 
117            }] /> 
118        </#list> 
119    </#if> 
120</#if> 
121 
122<#-- ВЫВОД ГАЛЕРЕИ --> 
123<#if hasGallery && galleryItems?size gt 1> 
124    <#if isPrint == "false"> 
125        <div style="clear:both"></div> 
126        <div class="clg_u_novost_media"> 
127            <div class="js-universal-slider-hor gallery-slider"  
128                 id="${portletnamespace}gallerySlider" 
129                 data-slick='{ 
130                     "slidesToShow": 1, 
131                     "slidesToScroll": 1, 
132                     "autoplay": true, 
133                     "dots": false, 
134                     "arrows": true, 
135										 "responsive": [ 
136
137                 "breakpoint": 768, 
138                 "settings": { 
139                     "dots": true, 
140										 "arrows": false 
141
142
143
144                 }'> 
145                <#list galleryItems as item> 
146                    <div class="item"> 
147                        <a href="${item.url}" class="item-img-click"> 
148                            <img src="${item.url}" alt="${item.alt}" /> 
149                        </a> 
150                    </div> 
151                </#list> 
152            </div> 
153						<div class="slider-counter">1/${galleryItems?size}</div> 
154        </div> 
155         
156        <@imageViewer selector="#${portletnamespace}gallerySlider .item-img-click" /> 
157        <@initSlider sliderId="${portletnamespace}gallerySlider" totalSlides=galleryItems?size /> 
158         
159    <#else> 
160        <#list galleryItems as item> 
161            <p><img src="${item.url}" data-large="${item.url}" alt="${item.alt}" /></p> 
162        </#list> 
163    </#if> 
164     
165<#-- Если есть только одно изображение (не галерея) --> 
166<#elseif thumbnailUrl?has_content> 
167    <#if isPrint == "false"> 
168        <div style="clear:both"></div> 
169        <div class="clg_u_novost_media"> 
170            <div class="js-universal-slider-hor gallery-slider"  
171                 id="${portletnamespace}singleImage" 
172                 data-slick='{ 
173                     "slidesToShow": 1, 
174                     "slidesToScroll": 1, 
175                     "autoplay": true, 
176                     "dots": false, 
177                     "arrows": true 
178                 }'> 
179                <div class="item"> 
180                    <a href="${thumbnailUrl}" class="item-img-click"> 
181                        <img src="${thumbnailUrl}" data-large="${thumbnailUrl}" alt="" /> 
182                    </a> 
183                </div> 
184            </div> 
185        </div> 
186        <@imageViewer selector="#${portletnamespace}singleImage .item-img-click" /> 
187    <#else> 
188        <p><img src="${thumbnailUrl}" data-large="${thumbnailUrl}" alt="" /></p> 
189    </#if> 
190</#if> 
191 
192<#macro imageViewer selector> 
193    <script> 
194        (function() { 
195            if (typeof YUI !== 'undefined') { 
196                YUI().use('aui-image-viewer', function(Y) { 
197                    new Y.ImageViewer({ 
198                        caption: 'Фотогалерея', 
199                        captionFromTitle: true, 
200                        centered: true, 
201                        imageAnim: { 
202                            duration: 1, 
203                            easing: 'easeIn' 
204                        }, 
205                        intervalTime: 2, 
206                        links: '${selector}', 
207                        playing: false, 
208                        preloadAllImages: false, 
209                        preloadNeighborImages: false, 
210                        showInfo: true, 
211                        showPlayer: true, 
212                        zIndex: 223 
213                    }).render(); 
214                }); 
215
216        })(); 
217    </script> 
218</#macro> 
219 
220<#macro initSlider sliderId totalSlides> 
221<script> 
222(function () { 
223 
224    var sliderSelector = '#${sliderId}'; 
225    function attachCounter() { 
226        var $slider = $(sliderSelector); 
227        if (!$slider.length) { 
228            return; 
229
230 
231        if (!$slider.hasClass('slick-initialized')) { 
232            setTimeout(attachCounter, 100); 
233            return; 
234
235 
236        var $counter = $slider 
237            .closest('.clg_u_novost_media') 
238            .find('.slider-counter'); 
239 
240        if (!$counter.length) { 
241            return; 
242
243 
244        if ($slider.data('counterAttached')) { 
245            return; 
246
247 
248        $slider.data('counterAttached', true); 
249 
250        function updateCounter(currentSlide) { 
251            var slick = $slider.slick('getSlick'); 
252            var current = (typeof currentSlide === 'number') 
253                ? currentSlide + 1 
254                : slick.currentSlide + 1; 
255            var total = slick.slideCount; 
256            $counter.text(current + '/' + total); 
257
258 
259        updateCounter(); 
260 
261        $slider.on('afterChange', function (event, slick, currentSlide) { 
262            updateCounter(currentSlide); 
263        }); 
264 
265
266 
267    $(function () { 
268        attachCounter(); 
269    }); 
270 
271})(); 
272</script> 
273</#macro>