Блог - Incomand
Блог
An error occurred while processing the template.
Java method "com.liferay.blogs.model.impl.BlogsEntryImpl.getCoverImageURL(com.liferay.portal.kernel.theme.ThemeDisplay)" threw an exception when invoked on com.liferay.blogs.model.impl.BlogsEntryImpl object "{mvccVersion=2, uuid=6af126f7-a40b-adb1-bdea-b1ff4bec5822, entryId=8822631, groupId=8822615, companyId=20098, userId=642675, userName=Ляшов Сергей, createDate=2025-09-16 14:35:40.022, modifiedDate=2025-09-16 14:35:53.06, lastModifiedUserId=642675, lastModifiedUserName=Ляшов Сергей, title=5 признаков, что ваш бизнес-портал — тайный психолог (и он вас жалеет), subtitle=, urlTitle=5-signs, description=, content=<p>1. Он предлагает «отдохнуть» после каждого действия. 👀 <br />\n Сохранили документ? «Вы молодец! Может, чаю?» Отправили отчет? «Не спешите, вот вам гороскоп на неделю». </p>\n\n<p>2. Он знает про ваши дела, но делает вид, что нет. <br />\n Напоминает о задаче за минуту до дедлайна: «Ой, а у вас тут отчет… Ну ладно, я никому не скажу». </p>\n\n<p>3. Он прячет кнопку «Отправить». <br />\n Трижды переспрашивает: «Точно? Может, еще раз проверим?» </p>\n\n<p>4. Он подсовывает мемы вместо инструкций. <br />\n Вместо «Ошибка 404» картинка с котиком: «Расслабься, это просто жизнь». </p>\n\n<p>5. Он автоматически ставит «отпуск» в календаре. <br />\n «Я вижу, вы не спали три дня. Вот вам две недели на Бали. Шучу… Или нет?» </p>\n\n<p>Если ваш портал ведет себя так он не просто софт, он ваш личный digital-терапевт. 😌 </p>\n\n<p>Нужен портал без лишней опеки? Мы поможем: https://incomand.ru/</p>, displayDate=2025-09-16 14:35:00.0, allowPingbacks=true, allowTrackbacks=false, trackbacks=, coverImageCaption=, coverImageFileEntryId=8822636, coverImageURL=, smallImage=false, smallImageFileEntryId=0, smallImageId=0, smallImageURL=, lastPublishDate=null, status=0, statusByUserId=642675, statusByUserName=Ляшов Сергей, statusDate=2025-09-16 14:35:53.06}"; see cause exception in the Java stack trace. ---- FTL stack trace ("~" means nesting-related): - Failed at: #if curBlogEntry.getCoverImageURL(the... [in template "20098#35420#5964958" at line 4, column 25] ----
1<div class="row widget-mode-card">
2 <#if entries?has_content>
3 <#list entries as curBlogEntry>
4 <#if curBlogEntry.getCoverImageURL(themeDisplay)??>
5 <#assign cardImage = true />
6 <#else>
7 <#assign cardImage = false />
8 </#if>
9
10 <div class="col-lg-4">
11 <div class="card">
12 <div class="card-header">
13 <div class="aspect-ratio aspect-ratio-8-to-3">
14 <img alt="thumbnail" class="aspect-ratio-item-center-middle aspect-ratio-item-fluid" src="${cardImage?then(curBlogEntry.getCoverImageURL(themeDisplay), portalUtil.getPathContext(renderRequest) + "/images/cover_image_placeholder.jpg")}">
15 </div>
16 </div>
17
18 <div class="card-body widget-topbar">
19 <div class="autofit-row card-title">
20 <div class="autofit-col autofit-col-expand">
21 <#assign viewEntryPortletURL = renderResponse.createRenderURL() />
22
23 ${viewEntryPortletURL.setParameter("mvcRenderCommandName", "/blogs/view_entry")}
24 ${viewEntryPortletURL.setParameter("redirect", currentURL)}
25
26 <#if validator.isNotNull(curBlogEntry.getUrlTitle())>
27 ${viewEntryPortletURL.setParameter("urlTitle", curBlogEntry.getUrlTitle())}
28 <#else>
29 ${viewEntryPortletURL.setParameter("entryId", curBlogEntry.getEntryId()?string)}
30 </#if>
31
32 <h3 class="title">
33 <a class="title-link" href="${viewEntryPortletURL.toString()}">
34 ${htmlUtil.escape(blogsEntryUtil.getDisplayTitle(resourceBundle, curBlogEntry))}</a>
35 </h3>
36 </div>
37
38 <div class="autofit-col visible-interaction">
39 <div class="dropdown dropdown-action">
40 <@liferay_ui["icon-menu"]
41 direction="left-side"
42 icon=""
43 markupView="lexicon"
44 message="actions"
45 showWhenSingleIcon=true
46 >
47 <#if blogsEntryPermission.contains(permissionChecker, curBlogEntry, "UPDATE")>
48 <#assign editEntryPortletURL = renderResponse.createRenderURL() />
49
50 ${editEntryPortletURL.setWindowState(windowStateFactory.getWindowState("MAXIMIZED"))}
51 ${editEntryPortletURL.setParameter("mvcRenderCommandName", "/blogs/edit_entry")}
52 ${editEntryPortletURL.setParameter("redirect", currentURL)}
53 ${editEntryPortletURL.setParameter("entryId", curBlogEntry.getEntryId()?string)}
54
55 <@liferay_ui["icon"]
56 label=true
57 message="edit"
58 url=editEntryPortletURL.toString()
59 />
60 </#if>
61 <#if blogsEntryPermission.contains(permissionChecker, curBlogEntry, "PERMISSIONS")>
62 <#assign permissionsEntryURL = permissionsURLTag.doTag(null, "com.liferay.blogs.model.BlogsEntry", blogsEntryUtil.getDisplayTitle(resourceBundle, curBlogEntry), curBlogEntry.getGroupId()?string, curBlogEntry.getEntryId()?string, windowStateFactory.getWindowState("POP_UP").toString(), null, request) />
63
64 <@liferay_ui["icon"]
65 label=true
66 message="permissions"
67 method="get"
68 url=permissionsEntryURL
69 useDialog=true
70 />
71 </#if>
72 <#if blogsEntryPermission.contains(permissionChecker, curBlogEntry, "DELETE")>
73 <#assign deleteEntryPortletURL = renderResponse.createActionURL() />
74
75 ${deleteEntryPortletURL.setParameter("javax.portlet.action", "/blogs/edit_entry")}
76 ${deleteEntryPortletURL.setParameter("cmd", trashHelper.isTrashEnabled(themeDisplay.getScopeGroupId())?then("move_to_trash", "delete"))}
77 ${deleteEntryPortletURL.setParameter("redirect", currentURL)}
78 ${deleteEntryPortletURL.setParameter("entryId", curBlogEntry.getEntryId()?string)}
79
80 <@liferay_ui["icon-delete"]
81 label=true
82 trash=trashHelper.isTrashEnabled(themeDisplay.getScopeGroupId())
83 url=deleteEntryPortletURL.toString()
84 />
85 </#if>
86 </@>
87 </div>
88 </div>
89 </div>
90
91 <div class="autofit-row widget-metadata">
92 <div class="autofit-col inline-item-before">
93 <@liferay_ui["user-portrait"]
94 size="lg"
95 userId=curBlogEntry.userId
96 userName=curBlogEntry.userName
97 />
98 </div>
99
100 <div class="autofit-col autofit-col-expand">
101 <div class="autofit-row">
102 <div class="autofit-col autofit-col-expand">
103 <#if serviceLocator??>
104 <#assign
105 userLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.UserLocalService")
106
107 entryUser = userLocalService.fetchUser(curBlogEntry.getUserId())
108 />
109
110 <#if entryUser?? && !entryUser.isDefaultUser()>
111 <#assign entryUserURL = entryUser.getDisplayURL(themeDisplay) />
112 </#if>
113 </#if>
114
115 <div class="text-truncate-inline">
116 <a href="${(entryUserURL?? && validator.isNotNull(entryUserURL))?then(entryUserURL, "")}" class="text-truncate username">${curBlogEntry.getUserName()}</a>
117 </div>
118
119 <div class="card-bottom">
120 <span class="card-date">
121 ${dateUtil.getDate(curBlogEntry.getStatusDate(), "dd MMM yyyy", locale)}
122
123 <#if blogsPortletInstanceConfiguration.enableReadingTime()>
124 - <@liferay_reading_time["reading-time"] displayStyle="simple" model=curBlogEntry />
125 </#if>
126 </span>
127
128 <#if serviceLocator??>
129 <#assign
130 assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
131
132 assetEntry = assetEntryLocalService.getEntry("com.liferay.blogs.model.BlogsEntry", curBlogEntry.getEntryId())
133 />
134
135 <#if blogsPortletInstanceConfiguration.enableViewCount()>
136 <span class="card-view">
137 <@liferay_ui["icon"]
138 icon="view"
139 markupView="lexicon"
140 />
141 ${assetEntry.getViewCount()}
142 </span>
143 </#if>
144 </#if>
145 </div>
146 </div>
147 </div>
148 </div>
149 </div>
150
151 <#if validator.isNotNull(curBlogEntry.getDescription())>
152 <#assign content = curBlogEntry.getDescription() />
153 <#else>
154 <#assign content = curBlogEntry.getContent() />
155 </#if>
156
157 <#if cardImage>
158 <p class="widget-resume">${stringUtil.shorten(htmlUtil.stripHtml(content), 150)}</p>
159 <#else>
160 <p class="widget-resume">${stringUtil.shorten(htmlUtil.stripHtml(content), 400)}</p>
161 </#if>
162 </div>
163
164 <div class="card-footer">
165 <div class="autofit-float autofit-row autofit-row-center widget-toolbar">
166 <#if blogsPortletInstanceConfiguration.enableComments()>
167 <div class="autofit-col">
168 <#assign viewCommentsPortletURL = renderResponse.createRenderURL() />
169
170 ${viewCommentsPortletURL.setParameter("mvcRenderCommandName", "/blogs/view_entry")}
171 ${viewCommentsPortletURL.setParameter("scroll", renderResponse.getNamespace() + "discussionContainer")}
172
173 <#if validator.isNotNull(curBlogEntry.getUrlTitle())>
174 ${viewCommentsPortletURL.setParameter("urlTitle", curBlogEntry.getUrlTitle())}
175 <#else>
176 ${viewCommentsPortletURL.setParameter("entryId", curBlogEntry.getEntryId()?string)}
177 </#if>
178
179 <a class="btn btn-outline-borderless btn-outline-secondary btn-sm" href="${viewCommentsPortletURL.toString()}" title="${language.get(locale, "comments")}">
180 <span class="inline-item inline-item-before">
181 <@clay["icon"] symbol="comments" />
182 </span> ${commentManager.getCommentsCount("com.liferay.blogs.model.BlogsEntry", curBlogEntry.getEntryId())}
183 </a>
184 </div>
185 </#if>
186
187 <#if blogsPortletInstanceConfiguration.enableRatings()>
188 <div class="autofit-col">
189 <@liferay_ui["ratings"]
190 className="com.liferay.blogs.model.BlogsEntry"
191 classPK=curBlogEntry.getEntryId()
192 />
193 </div>
194 </#if>
195
196 <div class="autofit-col autofit-col-end">
197 <#assign bookmarkURL = renderResponse.createRenderURL() />
198
199 ${bookmarkURL.setWindowState(windowStateFactory.getWindowState("NORMAL"))}
200 ${bookmarkURL.setParameter("mvcRenderCommandName", "/blogs/view_entry")}
201
202 <#if validator.isNotNull(curBlogEntry.getUrlTitle())>
203 ${bookmarkURL.setParameter("urlTitle", curBlogEntry.getUrlTitle())}
204 <#else>
205 ${bookmarkURL.setParameter("entryId", curBlogEntry.getEntryId()?string)}
206 </#if>
207
208 <@liferay_social_bookmarks["bookmarks"]
209 className="com.liferay.blogs.model.BlogsEntry"
210 classPK=curBlogEntry.getEntryId()
211 maxInlineItems=0
212 target="_blank"
213 title=blogsEntryUtil.getDisplayTitle(resourceBundle, curBlogEntry)
214 types=blogsPortletInstanceConfiguration.socialBookmarksTypes()
215 url=portalUtil.getCanonicalURL(bookmarkURL.toString(), themeDisplay, themeDisplay.getLayout())
216 />
217 </div>
218 </div>
219 </div>
220 </div>
221 </div>
222 </#list>
223 </#if>
224</div>
225
226<style>
227 .card-bottom {
228 display: flex;
229 justify-content: space-between;
230 width: 42%;
231 }
232</style>