Новости Северо-Западной транспортной прокуратуры - Северо-Западная транспортная прокуратура
Во время обработки запрошенного шаблона произошла ошибка...
The following has evaluated to null or missing: ==> ctx.proc [in template "20100#20136#1583049" at line 447, column 26] ---- 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 be 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: ${ctx.proc} [in template "20100#20136#1583049" at line 447, column 24] ----
1<#assign log = staticUtil['com.liferay.portal.kernel.log.LogFactoryUtil'].getLog("feeds.template")>
2<#assign _ = log.info(themeDisplay.getURLCurrent())/>
3
4<#assign ctx = staticUtil['ru.voskhod.gpparf.portal.feeds.main.page.portlet.util.FeedsTemplateRenderUtil'].buildContext(.vars)>
5
6<#assign tagList = templateUtil.getArticleTagsWithId(groupId, ctx.journalArticleId, locale)/>
7<#assign catList = templateUtil.getNewsCategoriesWithId(groupId, ctx.journalArticleId, locale)/>
8
9<#assign feedUrl = "/web" + themeDisplay.getSiteGroup().getFriendlyURL() + "/mass-media/news/archive"/>
10
11<#--todo:: перенести это безумие в buildContext-->
12<#if gp_media_file?? && gp_media_file.getSiblings()?has_content>
13 <#assign audioList = ddmService.getAudioFiles(gp_media_file.getSiblings()) />
14 <#assign videoList = ddmService.getVideoFiles(gp_media_file.getSiblings()) />
15</#if>
16
17<#assign imagesList = [] />
18<#if gp_images?? && gp_images.getSiblings()?has_content >
19 <#list gp_images.getSiblings() as cur_gp_images>
20 <#if cur_gp_images.getData()?? && cur_gp_images.getData() != "">
21 <#if gp_main_image_uuid?? && gp_main_image_uuid.getData()?? && cur_gp_images.getAttribute("uuid") == gp_main_image_uuid.getData()>
22 <#assign imagesList = [cur_gp_images] + imagesList />
23 <#else>
24 <#assign imagesList = imagesList + [cur_gp_images] />
25 </#if>
26 </#if>
27 </#list>
28</#if>
29
30<#assign mediaFileCount = 0 />
31<#if gp_media_file?? && gp_media_file?has_content && gp_media_file.getSiblings()?has_content>
32 <#list gp_media_file.getSiblings() as cur_gp_media>
33 <#if cur_gp_media.data?? && cur_gp_media.data?has_content>
34 <#assign mediaFileCount = mediaFileCount + 1 />
35 </#if>
36 </#list>
37</#if>
38
39<#assign attachmentCount = 0 />
40<#if gp_attachment?? && gp_attachment?has_content && gp_attachment.getSiblings()?has_content>
41 <#list gp_attachment.getSiblings() as cur_gp_attachment>
42 <#if cur_gp_attachment.data?? && cur_gp_attachment.data?has_content>
43 <#assign attachmentCount = attachmentCount + 1 />
44 </#if>
45 </#list>
46</#if>
47
48<style>
49 button:focus {
50 outline: unset;
51 }
52
53 .a_custom {
54 padding-top: 10px !important;
55 color: white;
56 }
57
58 .a_custom:hover, .a_custom:focus {
59 color: #ffffff;
60 text-decoration: none;
61 outline: unset;
62 }
63</style>
64
65<h2 class="feeds-page__title">
66 ${themeDisplay.portletDisplay.title}
67</h2>
68<div class="feeds-page__header">
69 <ul class="feeds-page__info">
70 <#if ctx.datetimePubFieldFormatted?has_content>
71 <li class="feeds-page__info_item">${ctx.datetimePubFieldFormatted}</li>
72 </#if>
73 <#if ctx.proc?has_content>
74 <li class="feeds-page__info_item">
75 <#if ctx.procUri?has_content>
76 <a href="${ctx.procUri}" title="" class="feeds-page__info_link">
77 ${ctx.proc}
78 </a>
79 <#else>
80 <a title="" class="feeds-page__info_link" style="cursor: default;">
81 ${ctx.proc}
82 </a>
83 </#if>
84 </li>
85 </#if>
86 </ul>
87 <div class="feeds-page__subtitle" id="text_printprw">${ctx.journalArticleTitle}</div>
88</div>
89<div class="feeds-page__body">
90 <div class="feeds-page__navigation">
91 <#if gp_content?has_content>
92 <div class="feeds-page__navigation_item text-item is-active"
93 onclick="openTab('feeds-page__article_text_block', 'text-item')">
94 <span class="feeds-page__navigation_icon is-text"> </span>
95 <span class="feeds-page__navigation_tooltip">
96 <@liferay.language key="feeds.tab.text" />
97 </span>
98 </div>
99 </#if>
100 <#if (imagesList?size > 0)>
101 <div class="feeds-page__navigation_item photo-item"
102 onclick="openTab('feeds-page__article_gallery', 'photo-item')">
103 <span class="feeds-page__navigation_icon is-image"> </span>
104 <span class="feeds-page__navigation_badge">${imagesList?size}</span>
105 <span class="feeds-page__navigation_tooltip">
106 <@liferay.language key="feeds.tab.photo" />
107 </span>
108 </div>
109 </#if>
110 <#if (mediaFileCount > 0)>
111 <div class="feeds-page__navigation_item media-item"
112 onclick="openTab('feeds-page__article_media', 'media-item')">
113 <span class="feeds-page__navigation_icon is-video"> </span>
114 <span class="feeds-page__navigation_badge">${mediaFileCount}</span>
115 <span class="feeds-page__navigation_tooltip">
116 <@liferay.language key="feeds.tab.media" />
117 </span>
118 </div>
119 </#if>
120 <#if (attachmentCount > 0)>
121 <div class="feeds-page__navigation_item attach-item"
122 onclick="openTab('feeds-page__article_file', 'attach-item')">
123 <span class="feeds-page__navigation_icon is-attach"> </span>
124 <span class="feeds-page__navigation_badge">${attachmentCount}</span>
125 <span class="feeds-page__navigation_tooltip">
126 <@liferay.language key="feeds.tab.attach" />
127 </span>
128 </div>
129 </#if>
130 <#if !ctx.internal>
131 <div class="feeds-page__navigation_item share-item"
132 onclick="openTab('feeds-page__article_share', 'share-item')">
133 <span class="feeds-page__navigation_icon is-share"> </span>
134 <span class="feeds-page__navigation_tooltip">
135 <@liferay.language key="feeds.tab.share" />
136 </span>
137 </div>
138 </#if>
139 </div>
140 <div class="feeds-page__article">
141 <#if gp_content?has_content>
142 <div class="feeds-page__article_text_block">
143 <#if (imagesList?size > 0)>
144 <div class="feeds-page__article_image">
145 <div class="feeds-page__article_image-viewport">
146 <div class="feeds-page__article_image-list">
147 <#list imagesList as cur_gp_image>
148 <#if cur_gp_image.getAttribute("alt")??>
149 <#assign img_alt = cur_gp_image.getAttribute("alt")/>
150 <#else>
151 <#assign img_alt = ""/>
152 </#if>
153
154 <#if cur_gp_image.getAttribute("displaySource")?? && cur_gp_image.getAttribute("displaySource") == "true">
155 <#assign img_src = cur_gp_image.getData()/>
156 <#else>
157 <#assign img_src = "/o/adaptive-media/image/" + cur_gp_image.getAttribute("fileEntryId") + "/news/img"/>
158 </#if>
159
160 <div class="feeds-page__article_image-item">
161 <img src="${img_src}" alt="${img_alt}">
162 </div>
163 </#list>
164 </div>
165 </div>
166 <div class="feeds-page__article_image-buttons">
167 <span class="feeds-page__article_image-arr to-left"> </span>
168 <span class="feeds-page__article_image-arr to-right"> </span>
169 </div>
170 <div class="feeds-page__article_image-counter">
171 </div>
172 </div>
173 </#if>
174
175 <div class="feeds-page__article_text">
176 ${gp_content.getData()}
177 </div>
178
179 <div class="feeds-page__article_buttons">
180 <a href="" class="button size-s a_custom" aria-label="<@liferay.language key="news.print" />"
181 id="button_printprw"><@liferay.language key="news.print" />
182 </a>
183 <a href="${feedUrl}"
184 class="button button-contour size-s"><@liferay.language key="news.archive" />
185 </a>
186 <div class="feeds-page__article_buttons-last" id="subscribeButtonPlaceHolder"></div>
187 </div>
188 </div>
189 </#if>
190
191 <!-- Images begin -->
192 <#if (imagesList?size > 0)>
193 <div class="feeds-page__article_gallery" style="display: none">
194 <h4 class="feeds-page__article_gallery-title">${gp_images.getSiblings()?size} <@liferay.language key="photo" /></h4>
195 <ul class="feeds-page__article_gallery-list">
196 <#list imagesList as cur_gp_image>
197 <#if cur_gp_image.getAttribute("alt")??>
198 <#assign img_alt = cur_gp_image.getAttribute("alt")/>
199 <#else>
200 <#assign img_alt = ""/>
201 </#if>
202
203 <#if cur_gp_image.getAttribute("displaySource")?? && cur_gp_image.getAttribute("displaySource") == "true">
204 <#assign img_src = cur_gp_image.getData()/>
205 <#else>
206 <#assign img_src = "/o/adaptive-media/image/" + cur_gp_image.getAttribute("fileEntryId") + "/news/img"/>
207 </#if>
208
209 <a data-epp-photo-modal="feeds-images"
210 data-title="${img_alt}"
211 href="${img_src}">
212 <li class="feeds-page__article_gallery-item one-new-slider__item swiper-slide"
213 style="background-image: url('${img_src}')"
214 >
215 </li>
216 </a>
217 </#list>
218 </ul>
219 </div>
220 </#if>
221 <!-- Images end -->
222
223
224 <!-- Media -->
225 <#if (mediaFileCount > 0)>
226 <div class="feeds-page__article_media" style="display: none">
227 <!-- Video slide -->
228 <#if videoList?has_content>
229 <div class="feeds-page__article_video">
230 <h4 class="feeds-page__article_video-title">${videoList?size}
231 <@liferay.language key="video" />
232 </h4>
233 <ul class="feeds-page__article_video-list">
234 <#list videoList as cur_gp_media_file>
235 <#assign url = templateUtil.getImagePath(cur_gp_media_file, themeDisplay) />
236 <#assign previewUrl = url + "&videoThumbnail=1" />
237 <#assign videoSizeTitle = templateUtil.fileSizeFormat(cur_gp_media_file.size, locale)/>
238
239 <#if cur_gp_media_file.description?has_content >
240 <#assign description = cur_gp_media_file.description />
241 <#else>
242 <#assign description = cur_gp_media_file.title />
243 </#if>
244
245 <li class="feeds-page__article_video-item">
246 <div class="feeds-page__article_video-preview">
247 <a data-epp-video-modal="feeds-images"
248 data-title="${description}"
249 data-preview="${previewUrl}"
250 href="${url}"
251 >
252 <span class="feeds-page__article_video-tumb"
253 style="background-image: url('${previewUrl}')"
254 >
255 </span>
256 </a>
257 <p class="feeds-page__article_video-name">
258 <span>
259 ${description}
260 </span>
261 </p>
262 </div>
263 <a href="${url}&download=true" target="_blank" class="button size-s">
264 <@liferay.language key="news.download" /> [ ${videoSizeTitle} ]
265 </a>
266 </li>
267 </#list>
268 </ul>
269 </div>
270 </#if>
271 <!-- Video slide end -->
272
273 <!-- Audio slide -->
274 <#if audioList?has_content>
275 <div class="feeds-page__article_audio ">
276 <h4 class="feeds-page__article_audio-title">
277 ${audioList?size} <@liferay.language key="audio" />
278 </h4>
279 <ul class="feeds-page__article_audio-list media-audio-wrapper">
280 <#list audioList as cur_gp_media_file>
281 <#assign url = templateUtil.getImagePath(cur_gp_media_file, themeDisplay) />
282 <#assign videoSizeTitle = templateUtil.fileSizeFormat(cur_gp_media_file.size, locale)/>
283
284 <li class="feeds-page__article_audio-item media-a-wrapper">
285 <span class="feeds-page__article_audio-name">
286 <span>
287 <#if cur_gp_media_file.description?has_content >
288 ${cur_gp_media_file.description}
289 <#else>
290 ${cur_gp_media_file.title}
291 </#if>
292 </span>
293 </span>
294 <audio class="feeds_media_player"
295 controls
296 style="max-width:100%;"
297 stretching="auto"
298 pluginPath="js"
299 loop="false"
300 features="['playpause', 'progress', 'current', 'duration', 'tracks', 'volume']"
301 alwaysShowControls="false"
302 pauseOtherPlayers="true"
303 preload="none"
304 >
305 <source src="${url}" type="${cur_gp_media_file.getMimeType()}">
306 </audio>
307 <a href="${url}&download=true" target="_blank" class="button size-s">
308 <@liferay.language key="news.download" /> [ ${videoSizeTitle} ]
309 </a>
310 </li>
311 </#list>
312 </ul>
313 </div>
314 </#if>
315 <!-- Audio slide end -->
316 </div>
317 </#if>
318 <!-- Media end -->
319
320 <!-- Attachments begin -->
321 <#if (attachmentCount > 0)>
322 <div class="feeds-page__article_file" style="display: none">
323 <#assign numberOfFiles = templateUtil.numberOfFiles(gp_attachment.getSiblings()?size) />
324 <h4 class="feeds-page__article_file-title">${numberOfFiles}</h4>
325 <ul class="feeds-page__article_file-list">
326 <#list gp_attachment.getSiblings() as cur_gp_attachment>
327 <#assign fileSize = ddmService.getFileSizeByDataEntry(locale, groupId, cur_gp_attachment) />
328 <#assign sizeTitle = templateUtil.fileSizeFormat(fileSize, locale)/>
329
330 <#if cur_gp_attachment.data?? && cur_gp_attachment.data?has_content>
331 <#assign fileMeta = cur_gp_attachment.data?replace('\\\\u(....)', '&#x$1;', 'r')?eval/>
332
333 <li class="feeds-page__article_file-item">
334 <p class="feeds-page__article_file-name">
335 <#if cur_gp_attachment.gp_attachment_description?? && cur_gp_attachment.gp_attachment_description.getData()?has_content>
336 <#assign fileDescription = cur_gp_attachment.gp_attachment_description.getData() />
337 <spna>
338 ${fileDescription}
339 </spna>
340 <#else >
341 <spna>
342 ${fileMeta.title}
343 </spna>
344 </#if>
345 </p>
346 <a href="${cur_gp_attachment.getData()}&download=true" target="_blank"
347 class="button size-s a_custom">
348 <@liferay.language key="news.download" /> [ ${sizeTitle} ]
349 </a>
350 </li>
351 </#if>
352 </#list>
353 </ul>
354 </div>
355 </#if>
356
357 <!-- Attachments end -->
358
359 <#if !ctx.internal>
360 <div class="feeds-page__article_share" style="display: none">
361 <span class="feeds-page__article_share-title">
362 <@liferay.language key="news.direct-link" />
363 </span>
364 <div class="text-field hidden-xs">
365 <div class="text-field__value">
366 <input type="search" class="text-field__input" placeholder="${ctx.repostUrl}"
367 value="${ctx.repostUrl}"
368 readonly>
369 </div>
370 <span class="text-field__help"> </span>
371 </div>
372 <button id="shareButton" class="a_custom button hidden-lg hidden-sm hidden-md size-s"
373 onclick="CopyToClipboard('${ctx.repostUrl}')"
374 >
375 <@liferay.language key="news.direct-link.copy" />
376 </button>
377
378 <span class="feeds-page__article_share-title">
379 <@liferay.language key="news.share" />
380 </span>
381 <ul class="feeds-page__article_share-list">
382 <li class="feeds-page__article_share-item">
383 <a href="#" title="" class="feeds-page__article_share-link s_vk">Вконтакте</a>
384 </li>
385 <li class="feeds-page__article_share-item">
386 <a href="#" title="" class="feeds-page__article_share-link s_livejournal">LiveJournal</a>
387 </li>
388 <li class="feeds-page__article_share-item">
389 <a href="#" title="" class="feeds-page__article_share-link s_facebook">Facebook</a>
390 </li>
391 <li class="feeds-page__article_share-item">
392 <a href="#" title="" class="feeds-page__article_share-link s_twitter">Twitter</a>
393 </li>
394 </ul>
395 </div>
396 </#if>
397 </div>
398</div>
399<div class="feeds-page__footer">
400 <#if catList?has_content>
401 <div class="feeds-page__footer_item">
402 <h4 class="feeds-page__footer_title"><@liferay.language key="news.rubrics" /></h4>
403 <#list catList?keys as catName>
404 <a class="chips" href="${feedUrl + "?rubrics=" + catList[catName]}">
405 ${catName}
406 </a>
407 </#list>
408 </div>
409 </#if>
410 <#if tagList?has_content>
411 <div class="feeds-page__footer_item">
412 <h4 class="feeds-page__footer_title">Теги</h4>
413 <#list tagList?keys as tagName>
414 <a class="chips" href="${feedUrl + "?tags=" + tagList[tagName]}">
415 ${tagName}
416 </a>
417 </#list>
418 </div>
419 </#if>
420</div>
421
422<div id="printContent" class="print_data">
423 <div class="print_header">
424 <div class="print__wrapper">
425 <div class="print__logo">
426 <#if !ctx.internal>
427 <img src="/o/gpparf-public-theme/images/logo.png" alt="logo" width="50" height="54">
428 <#else>
429 <img src="/o/gpparf-internal-theme/images/logo.svg" alt="logo" width="50" height="54">
430 </#if>
431 <h2 class="print__title">${ctx.procStart}<br><span>${ctx.procEnd}</span></h2>
432 </div>
433 <div class="print_button_wrapper no-print">
434 <a href="#" class="print_button" aria-label="<@liferay.language key="news.print" />"
435 id="button_print" onclick="self.print()">
436 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="19" viewBox="0 0 24 19">
437 <path fill-rule="evenodd"
438 d="M7 17h10v-7H7v7zm-2 1v-4H0V3h24v11h-5v5H5v-1zm0-9V8h14v4h3V5H2v7h3V9zm0-9h14v2H5V0zm4 13h6v2H9v-2z"></path>
439 </svg>
440 </a>
441 </div>
442 </div>
443 <div class="container">
444 <div class="category__info row">
445 <div class="category__item col-xs-6 col-sm-6 col-md-6 col-lg-6">
446 <span class="category__category"><@liferay.language key="news.source" />:</span>
447 <p>${ctx.proc}</p>
448 </div>
449 <div class="category__item col-xs-6 col-sm-6 col-md-6 col-lg-6">
450 <span class="category__category"><@liferay.language key="news.publication-date" />:</span>
451 <p>${ctx.datetimePubFieldFormatted}</p>
452 </div>
453 </div>
454 </div>
455 </div>
456
457 <section class="one-new__content">
458 <h2 class="one-new__title">${ctx.journalArticleTitle}</h2>
459 <#if gp_content?has_content>
460 <div class="break-word">${gp_content.getData()}</div>
461 </#if>
462 </section>
463 <div class="print_footer">
464 <div class="container">
465 <div class="row">
466 <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
467 © 2003-2020 ${ctx.proc}<br>
468 <@liferay.language key="footer.copyright" />
469 </div>
470 <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6">
471 <#if ctx.currentUnitContactInfo?has_content>
472 <@liferay.language key="news.address" />: ${ctx.currentUnitContactInfo.address}<br>
473 <#if ctx.currentUnitContactInfo.categoryPointTitle?? && ctx.currentUnitContactInfo.phone??>
474 ${ctx.currentUnitContactInfo.categoryPointTitle}:
475 <a href="tel:${ctx.currentUnitContactInfo.phone}">${ctx.currentUnitContactInfo.phone}</a>
476 </#if>
477 </#if>
478 </div>
479 </div>
480 </div>
481 </div>
482</div>
483
484
485<script>
486 (function () {
487 var init = function () {
488 $(".feeds-page__article_share-link").ShareLink({
489 title: '${ctx.journalArticleTitle}',
490 text: '${ctx.journalArticleTitle}',
491 image: '${themeDisplay.getPortalURL()}/documents/1664002/1691794/emblem_big%281%29.PNG',//'http://cdn.myanimelist.net/images/characters/3/27890.jpg',
492 url: '${ctx.repostUrl}'
493 });
494
495
496 $("#button_printprw").printPreview({
497 obj2print: '#printContent',
498 width: '980',
499 style: '<style>.print_data{display:block;}</style>',
500 resizable: 'no',
501 status: 'no',
502 title: '${ctx.proc?html}'
503 });
504
505 $("#shareButton").on("click", function () {
506 $(this).html('<@liferay.language key="news.direct-link.copy-success" />');
507 setTimeout(function () {
508 $("#shareButton").html('<@liferay.language key="news.direct-link.copy" />');
509 }, 600);
510 });
511
512 $('.feeds_media_player').mediaelementplayer({
513 audioVolume: "vertical",
514 success: function (mediaElement, originalNode, instance2) {
515 mediaElement.pause();
516 mediaElement.load();
517 }
518 });
519
520 <#if (imagesList?size > 0)>
521 eppCarousel.create({
522 containerSelector: '.feeds-page__article_image-list',
523 buttonsSelector: '.feeds-page__article_image-buttons',
524 dotContainerSelector: '.feeds-page__article_image-counter',
525 dotElementClass: '${(imagesList?size > 1 && imagesList?size <= 5)?string('feeds-page__article_image-counter_item', '')}',
526 dotElementTag: 'a',
527 fadeElementSelector: '.feeds-page__article_image_content',
528 infinity: true,
529 });
530 </#if>
531
532 textOverflowDots('.feeds-page__article_video-name span');
533 textOverflowDots('.feeds-page__article_audio-name span');
534 };
535
536 if ($().mediaelementplayer && $().ShareLink && $().printPreview)
537 init();
538 else
539 document.addEventListener("DOMContentLoaded", init);
540 })();
541
542 function openTab(blockName, tabName) {
543
544 var tab = $('.' + tabName);
545
546 if (!tab.hasClass('is-active')) {
547
548 $('.text-item').removeClass('is-active');
549 $('.photo-item').removeClass('is-active');
550 $('.media-item').removeClass('is-active');
551 $('.attach-item').removeClass('is-active');
552 $('.share-item').removeClass('is-active');
553
554 tab.addClass('is-active');
555
556 $('.feeds-page__article_text_block').css('display', 'none');
557 $('.feeds-page__article_gallery').css('display', 'none');
558 $('.feeds-page__article_media').css('display', 'none');
559 $('.feeds-page__article_file').css('display', 'none');
560 $('.feeds-page__article_share').css('display', 'none');
561 $('.' + blockName).css('display', 'block');
562 }
563 }
564</script>