Fehler bei der Verarbeitung der Vorlage.
The following has evaluated to null or missing: ==> assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL) [in template "29767924528592#240049#336752" at line 158, column 40] ---- 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 viewURL = assetRenderer.getUR... [in template "29767924528592#240049#336752" at line 158, column 21] ----
1<#-- STAFF PICKS ASSET DISPLAY TEMPLATE -->
2
3<#function getFieldValue ddmFormFieldValues fieldReference>
4 <#list ddmFormFieldValues as ddmFormFieldValue>
5 <#if ddmFormFieldValue.getDDMFormField().getFieldReference()==fieldReference>
6 <#if (ddmFormFieldValue.getValue())??>
7 <#assign value=ddmFormFieldValue.getValue().getString(locale) />
8 <#return value />
9 <#else>
10 <#return null />
11 </#if>
12 </#if>
13 </#list>
14 <#return 'null' />
15</#function>
16
17<#assign queryLimit = 8 /><#-- Limits how many records are shown at maximum in list view -->
18
19<#assign centralApiEndpoint = ArenaConfigurationScopeManager.arenaSystemConfiguration().centralApiEndpoint() />
20<#assign localApiEndpoint = ArenaConfigurationScopeManager.arenaSystemConfiguration().localApiEndpoint() />
21<#assign csAddress =centralApiEndpoint />
22<#assign lsAddress =localApiEndpoint />
23
24<#assign friendlyUrl = "" />
25<#assign sitePrefix = "/web/arena" />
26
27<#-- If friendlyUrl is not set, get it from the organization -->
28<#if friendlyUrl == "" >
29 <#assign groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")/>
30 <#assign group = groupLocalService.getGroup(groupId)/>
31 <#assign friendlyUrl = group.getFriendlyURL() />
32 <#assign sitePrefix = "/web${friendlyUrl}" />
33</#if>
34
35<#-- Get server and page URLs -->
36<#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext() />
37<#assign themeDisplay = serviceContext.getThemeDisplay() />
38<#assign portalUrl = themeDisplay.getPortalURL() />
39<#assign portalUrlSecure = portalUrl />
40<#if portalUrlSecure?index_of("https") == -1>
41 <#assign portalUrlSecure = portalUrl?replace("http", "https") />
42</#if>
43<#if portalUrl?index_of("https") != -1>
44 <#assign portalUrl = portalUrl?replace("https", "http") />
45</#if>
46
47<#assign virtualURL = portalUrlSecure?replace("https://","") />
48
49<#assign fullPageUrl = portalUrl + themeDisplay.getURLCurrent() />
50<#assign crdPageUrl = portalUrlSecure + sitePrefix+"/results"/>
51<#assign searchPageUrl = portalUrlSecure + sitePrefix+"/search"/>
52
53
54<#--Makes a query to the REST API and requests records. This function should be used to call the API within this template.
55Returns the result as a simpleHash object -->
56<#function queryAPI query limit>
57 <#assign fullRequestUrl = "${lsAddress}/portalsites/${portalSiteID}/records?query=${urlCodec.encodeURL(query)}&count=${limit}&isShowExtended=false&sortDirection=Descending&sortField=Relevance&agencyMemberId=${agencyMemberID}&decorationNames=Ratings"/>
58 <#assign response = httpUtilUnsafe.URLtoString(fullRequestUrl) />
59 <#assign result = jsonFactoryUtil.looseDeserialize(response) />
60 <#return result />
61</#function>
62
63<#-- Makes a query to Central REST API to get portal site settings -->
64<#function getPortalSiteSettingsFromCentralService>
65 <#assign requestUrlPortalSites = "${csAddress}/configs/portalsites?vhost=${urlCodec.encodeURL(virtualURL)}&friendlyUrl=${urlCodec.encodeURL(friendlyUrl)}" />
66 <#assign response = httpUtilUnsafe.URLtoString(requestUrlPortalSites) />
67 <#assign result = jsonFactoryUtil.looseDeserialize(response) />
68 <#return result />
69</#function>
70
71<#-- Makes a query to Central REST API to get Member settings to extract Agency ID from -->
72<#function getAgencySettingsFromCentralService>
73 <#assign requestUrlMemberAgencies = "${csAddress}/configs/agencymembers/${agencyMemberID}" />
74 <#assign response = httpUtilUnsafe.URLtoString(requestUrlMemberAgencies) />
75 <#assign result = jsonFactoryUtil.looseDeserialize(response) />
76 <#return result />
77</#function>
78
79<#function getServerSettingsFromCentralService>
80 <#assign portalSites = "" />
81 <#assign returnValue = "OK" />
82 <#assign portalSites = "" />
83 <#assign memberData = "" />
84 <#assign favoriteAgencyName = "" />
85 <#attempt>
86 <#assign portalSites = getPortalSiteSettingsFromCentralService() />
87 <#if portalSites.id??>
88 <#assign portalSiteID = portalSites.id?string />
89 <#assign favoriteAgencyName = portalSites.mainGroup.properties["Favourite Agency Member"] />
90 <#else>
91 <#assign requestUrlPortalSites = "${csAddress}/configs/portalsites?vhost=${urlCodec.encodeURL(virtualURL)}&friendlyUrl=${urlCodec.encodeURL(friendlyUrl)}" />
92 <#assign response = httpUtilUnsafe.URLtoString(requestUrlPortalSites) />
93 </#if>
94 <#if favoriteAgencyName != "">
95 <#-- Go through portalSites.agencyMemberSummaries to find the one with matching favoriteAgencyName -->
96 <#list portalSites.agencyMemberSummaries as summary>
97 <#if summary.name == favoriteAgencyName>
98 <#assign agencyMemberID = summary.id?string />
99 </#if>
100 </#list>
101 </#if>
102 <#recover>
103 <#assign returnValue = "Portal Sites failed" />
104 </#attempt>
105 <#if agencyMemberID != "" && returnValue == "OK">
106 <#attempt>
107 <#assign memberData = getAgencySettingsFromCentralService() />
108 <#if memberData.agency??>
109 <#assign agencyID = memberData.agency.id />
110 <#assign agencyName = memberData.agency.name />
111 </#if>
112 <#recover>
113 <#assign returnValue = "Agency member data failed" />
114 </#attempt>
115 </#if>
116
117 <#return returnValue />
118</#function>
119
120<#-- Shows server info gained from the central service. You can add a call to this macro when debugging -->
121<#macro debugServerInfo>
122 <div class="serverInfo debug informative">
123 <p class="idsForRestAPI">
124 <strong>Portal Site ID:</strong> ${portalSiteID}<br />
125 <strong>Agency ID:</strong> ${agencyID}<br />
126 <strong>Agency name:</strong> ${agencyName}<br />
127 <strong>Member ID:</strong> ${agencyMemberID}
128 </p>
129 <p class="serverURL">
130 <strong>Portal site URL:</strong> ${portalUrl}<br />
131 <strong>Portal site URL Secure:</strong> ${portalUrlSecure}<br />
132 <strong>Virtual URL:</strong> ${virtualURL}
133 </p>
134 </div>
135</#macro>
136
137
138<link rel="stylesheet" href="//cdn-s3.axiell.com/arena/staffpicks/staffpicks.css">
139<div class="staffpick-list-large-container">
140 <#assign status = getServerSettingsFromCentralService() />
141 <#if status != "OK" >
142 <script>
143 console.log("Failed to get API settings with: "+${status});
144 </script>
145 </#if>
146
147 <ul class="staffpick-list-large">
148 <#if entries?has_content>
149 <#list entries as curEntry>
150 <#assign assetRenderer = curEntry.getAssetRenderer() />
151 <#assign className = assetRenderer.getClassName() >
152 <#assign ddmFormValuesReader = assetRenderer.getDDMFormValuesReader() />
153 <#assign ddmFormFieldValues = ddmFormValuesReader.getDDMFormValues().getDDMFormFieldValues() />
154 <#if className == "com.liferay.journal.model.JournalArticle">
155 <#assign article = assetRenderer.getArticle() >
156 <#assign img = article.getSmallImageURL() >
157 <#assign dateFormat = "d.M.yyyy - HH:mm" />
158 <#assign viewURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL) />
159 <#assign recordId = getFieldValue(ddmFormFieldValues, 'recordId') />
160 <#assign articleAuthor = getFieldValue(ddmFormFieldValues, 'articleAuthor') />
161 <#assign articleTitle = assetRenderer.getTitle(locale) />
162 <#assign searchQuery = "" />
163 <#if recordId?? && recordId != "">
164 <#if recordId?index_of("id:") == -1>
165 <#assign searchQuery = 'id:"${recordId}"' />
166 <#else>
167 <#assign searchQuery = recordId />
168 </#if>
169 </#if>
170 <#assign result = "" />
171 <#assign recordCSS = "" />
172 <#assign recordInfo = ""/>
173 <#assign containerCSS = "connected" />
174 <#if searchQuery != "">
175 <#attempt>
176 <#assign result = queryAPI(searchQuery, 1) />
177 <#assign recordInfo = result.records[0] />
178 <#recover><#-- Rest call failed. Populating similar object with dummy values-->
179 <#assign recordInfo = {
180 "fields" : {
181 "title" : "${articleTitle}"
182 }
183 } />
184 <#assign containerCSS = "no-connection" />
185 </#attempt>
186 <#else>
187 <#assign containerCSS = "no-connection" />
188 <#assign recordInfo = {
189 "fields" : {
190 "title" : "${articleTitle}"
191 }
192 } />
193 </#if>
194 <#if recordId?? && recordId != "">
195 <#assign recordCSS = "record-${recordId}" />
196 </#if>
197 <li class="row staffpick-entry ${recordCSS} ${containerCSS}">
198 <a class="" href="${viewURL}">
199 <div class="ccol-xs-3 col-sm-3">
200 <#if recordInfo.id??> <#-- simple check to see if we have record data -->
201 <#assign agencyID = recordInfo.agencyId />
202 <#if assetRenderer.getThumbnailPath(renderRequest)??>
203 <img class="cover-image cover-overwrite" alt="" src="${renderer.getThumbnailPath(renderRequest)}"/>
204 <#else>
205 <img class="cover-image" alt="" src="${portalUrlSecure}/local-rest/api/v1/portalsites/${portalSiteID}/agencies/${agencyID}/records/${urlCodec.encodeURL(recordInfo.id)}/cover" />
206 </#if>
207 <#else>
208 <#if assetRenderer.getThumbnailPath(renderRequest)??>
209 <img class="cover-image cover-overwrite" alt="" src="${renderer.getThumbnailPath(renderRequest)}"/>
210 </#if>
211 </#if>
212 </div>
213 <div class="ccol-xs-9 col-sm-9 record-info">
214 <h2 class="staffpick-list-record-title">
215 ${recordInfo.fields.title}
216 </h2>
217 <#if recordInfo.fields?? && recordInfo.fields.authors?? && recordInfo.fields.authors?size gt 0 && recordInfo.fields.authors[0]??>
218 <p class="staffpick-list-author">
219 <@liferay.language_format key="staffpicks.list.author" arguments=[recordInfo.fields.authors[0].name] />
220 </p>
221 </#if>
222 <p class="staffpick-list-summary">
223 ${article.getDescription(locale)}
224 </p>
225 <#if articleAuthor?? && articleAuthor != "">
226
227 <p class="recommended-by">
228 <@liferay.language_format key="staffpicks.list.articleauthor" arguments=[articleAuthor] />
229 </p>
230 </#if>
231 </div>
232 </a>
233 </li>
234 <#else>
235 ${assetRenderer.getClassName()}
236 </#if>
237 </#list>
238 </#if>
239 </ul>
240
241</div>
242
243<#macro getEditIcon>
244 <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())>
245 <#assign redirectURL = renderResponse.createRenderURL() />
246
247 ${redirectURL.setParameter("struts_action", "/asset_publisher/add_asset_redirect")}
248 ${redirectURL.setWindowState("pop_up")}
249
250 <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("pop_up"), redirectURL) />
251
252 <#if validator.isNotNull(editPortletURL)>
253 <#assign title = languageUtil.format(locale, "edit-x", htmlUtil.escape(assetRenderer.getTitle(locale))) />
254
255 <@liferay_ui["icon"]
256 <#--image="edit"-->
257 iconCssClass="icon-edit"
258 message=title
259 url="javascript:Liferay.Util.openWindow({dialog: {destroyOnHide: true, width: 960}, id:'" + renderResponse.getNamespace() + "editAsset', title: '" + title + "', uri:'" + htmlUtil.escapeURL(editPortletURL.toString()) + "'});"
260 />
261 </#if>
262 </#if>
263</#macro>
Anmelden