/o//commerce-media/accounts/-1/images/30454912?download=false
NTLM (NT LAN Manager) is a suite of Microsoft
protocols that provide authentication, integrity, and confidentiality
for users. Though Microsoft has adopted Kerberos in modern versions of
Windows server, NTLM is still used when authenticating to a workgroup.
@product@ supports NTLM v2 authentication. NTLM v2 is more secure and
has a stronger authentication process than NTLMv1.
Note: NTLM
authentication is deprecated in Liferay 7.1 and may be removed in
future versions. Users should migrate to Kerberos.
NTLM (NT LAN Manager) is a suite of Microsoft
protocols that provide authentication, integrity, and confidentiality
for users. Though Microsoft has adopted Kerberos in modern versions of
Windows server, NTLM is still used when authenticating to a workgroup.
@product@ supports NTLM v2 authentication. NTLM v2 is more secure and
has a stronger authentication process than NTLMv1.
Note: NTLM
authentication is deprecated in Liferay 7.1 and may be removed in
future versions. Users should migrate to Kerberos.
The following has evaluated to null or missing:
==> sku.skuOptions [in template "3192443#3192485#null" at line 122, column 32]
----
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: #list sku.skuOptions as opt [in template "3192443#3192485#null" at line 122, column 25]
~ Reached through: #nested [in template "3192443#3192485#null" in macro "section" at line 246, column 17]
~ Reached through: @section title=languageUtil.get(local... [in template "3192443#3192485#null" at line 107, column 1]
----
1<#assign
2 channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${themeDisplay.getScopeGroupId()}'")
3
4 product = restClient.get(
5 "/headless-commerce-delivery-catalog/v1.0/channels/" + channel.items[0].id +
6 "/products/" + CPDefinition_cProductId.getData() +
7 "?accountId=-1&nestedFields=categories,productSpecifications,skus&skus.accountId=-1&skus.currencyCode=USD"
8 )
9
10 catalogName = product.catalogName!""
11 categories = product.categories![]
12 createDate = product.createDate!0
13 productSpecifications = product.productSpecifications![]
14
15 liferayVersions = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "liferay-version"))
16 platformOffering = categories?filter(item -> stringUtil.equals(item.vocabulary?replace(" ", "-"), "marketplace-liferay-platform-offering"))
17>
18
19<#assign
20 publisherDetailsResponse = restClient.get("/c/publisherdetailses?filter=publisherName eq '${catalogName}'")
21 redirectPath = "https://marketplace.liferay.com/e/publisher-details/29282497"
22/>
23
24<#if publisherDetailsResponse.items?has_content>
25 <#assign
26 publisherDetails = publisherDetailsResponse.items[0]
27 profileImageURL = publisherDetails.publisherProfileImage?replace("https://", "http://")
28 />
29</#if>
30
31<#assign
32 appDocumentationURL = getSpecificationValue("appdocumentationurl")
33 appInstallationGuideURL = getSpecificationValue("appinstallationguideurl")
34 appUsageTerms = getSpecificationValue("appusagetermsurl")
35 cpuValue = getSpecificationValue("cpu")
36 developerName = getSpecificationValue("developer-name", catalogName)
37 publisherURL = (getSpecificationValue("publisherwebsiteurl")?trim?replace(" ", ""))!""
38 ramValue = getSpecificationValue("ram")
39 sourceCode = getSpecificationValue("source-code-url")
40 supportEmail = getSpecificationValue("supportemailaddress")
41 supportPhone = getSpecificationValue("supportphone")
42 type = getSpecificationValue("type")?lower_case
43>
44<@section title = languageUtil.get(locale, "developer")>
45 <#if publisherDetails?has_content>
46 <a class = "bg-neutral-8" href = "${redirectPath}/${publisherDetails.id}">
47 ${developerName}
48 </a>
49 <#else>
50 <a class = "bg-neutral-8" href = "/?developer-name=${developerName}">
51 ${developerName}
52 </a>
53 </#if>
54</@section>
55
56<@section title = languageUtil.get(locale, "publisher-date", "Publisher Date")>
57 <#if createDate?has_content>
58 <#assign parsedDate = createDate?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'") />
59
60 <p>${parsedDate?string("MMMM d, yyyy")}</p>
61 </#if>
62</@section>
63
64<@section title = languageUtil.get(locale, "deployment-method", "Deployment Method")>
65 <#list platformOffering as offering>
66 <p>${offering.name}</p>
67 </#list>
68</@section>
69
70<@section title = languageUtil.get(locale, "app-type", "App Type")>
71 <#if type == 'client-extension'> Client Extension </#if>
72 <#if type == 'cloud'> Cloud </#if>
73 <#if type == 'composite-app'> Composite App </#if>
74 <#if type == 'dxp'> DXP </#if>
75 <#if type == 'low-code-configuration'> Low Code Configuration </#if>
76</@section>
77
78<@section title = languageUtil.get(locale, "version")>
79 ${getSpecificationValue("latest-version", "1.0.0")}
80</@section>
81
82<#if liferayVersions?has_content>
83 <@section title = languageUtil.get(locale, "supported-versions", "Supported Versions")>
84 <#list liferayVersions as version>
85 ${version.value}<#if version?has_next>, </#if>
86 </#list>
87 </@section>
88</#if>
89
90<#if cpuValue?has_content>
91 <@section title = languageUtil.get(locale, "resource-requirements", "Resource Requirements")>
92 <p>
93 <#if cpuValue?has_content>
94 ${cpuValue}
95 <#assign cpuNumber = cpuValue?number?default(0) />
96 <#if cpuValue?eval gt 1>
97 CPUS
98 </#if>
99 <#if cpuValue?eval lt 2>
100 CPU
101 </#if>
102 </#if>, <#if ramValue?has_content>${ramValue} GB RAM</#if>
103 </p>
104 </@section>
105</#if>
106
107<@section title = languageUtil.get(locale, "standard-price", "Standard Price")>
108 <div>
109 <#assign purchasableSkus = [] />
110
111 <#list product.skus as sku>
112 <#if sku.purchasable?? && sku.purchasable>
113 <#assign purchasableSkus = purchasableSkus + [sku] />
114 </#if>
115 </#list>
116
117 <#assign standardSku = {} />
118
119 <#list purchasableSkus as sku>
120 <#assign matched = false />
121
122 <#list sku.skuOptions as opt>
123 <#if stringUtil.equals(opt.skuOptionValueKey, "standard")>
124 <#assign
125 matched = true
126 standardSku = sku
127 />
128
129 <#break>
130 </#if>
131 </#list>
132 <#if matched><#break></#if>
133 </#list>
134
135 <#if standardSku.price?? && standardSku.price.price?eval gt 0>
136 <div class="bg-neutral-8">${standardSku.price.priceFormatted!""}</div>
137 <#else>
138 ${languageUtil.get(locale, "free", "Free")}
139 </#if>
140 </div>
141</@section>
142
143<@section title = languageUtil.get(locale, "help-and-support", "Help and Support")>
144 <div class="d-flex flex-column mt-4">
145 <#if (appDocumentationURL?has_content || appInstallationGuideURL?has_content)>
146 <div class="d-flex mb-4">
147 <span class="help-and-support-modal-icon" id="installation-documentation">
148 <@clay["icon"] symbol="document" />
149 </span>
150
151 <a class="d-flex w-100 justify-content-between help-and-support-modal" href="javascript:void(0)" onClick="openInstallationDocsModal()">
152 <span class="copy-text ml-1 help-and-support-modal">
153 ${languageUtil.get(locale, "installation-documentation", "Installation Documentation")}
154 </span>
155
156 <@clay["icon"]
157 className="help-and-support-modal-arrow link-arrow ml-auto"
158 height="12"
159 symbol="angle-right-small"
160 />
161 </a>
162 </div>
163 </#if>
164
165 <div class="d-flex mb-4">
166 <span class="help-and-support-modal-icon" id="publisher-support">
167 <@clay["icon"] symbol="envelope-closed" />
168 </span>
169
170 <a class="d-flex w-100 justify-content-between help-and-support-modal" href="javascript:void(0)" onClick="openPublisherSupportModal()">
171 <span class="copy-text ml-1 help-and-support-modal">
172 ${languageUtil.get(locale, "publisher-support", "Publisher Support")}
173 </span>
174
175 <@clay["icon"]
176 className="help-and-support-modal-arrow link-arrow ml-auto"
177 height="12"
178 symbol="angle-right-small"
179 />
180 </a>
181 </div>
182
183 <#if sourceCode?has_content>
184 <div class="d-flex mb-4">
185 <span class="help-and-support-link-icon">
186 <@clay["icon"] symbol="code" />
187 </span>
188
189 <a
190 class="d-flex font-weight-semi-bold help-and-support-link justify-content-between w-100"
191 href="${sourceCode}"
192 target="_blank">
193 <span class="copy-text ml-1 help-and-support-link">
194 ${languageUtil.get(locale, "source-code", "Source Code")}
195 </span>
196 </a>
197 </div>
198 </#if>
199
200 <div class="d-flex">
201 <span class="help-and-support-link-icon">
202 <@clay["icon"] symbol="check-square" />
203 </span>
204
205 <a
206 class="d-flex font-weight-semi-bold help-and-support-link justify-content-between w-100"
207 href="${(appUsageTerms?has_content)?then(appUsageTerms, 'https://marketplace.liferay.com/license-agreement')}"
208 target="_blank">
209
210 <span class="copy-text ml-1 help-and-support-link">
211 ${languageUtil.get(locale, "eula", "EULA")}
212 </span>
213 </a>
214 </div>
215 </div>
216</@section>
217
218<@section
219 showLine = false
220 title = languageUtil.get(locale, "share-link")
221>
222 <a class="align-items-center copy-text d-flex font-weight-bold ml-1 text-primary" href="#copy-share-link" onclick="copyToClipboard(Liferay.ThemeDisplay.getCanonicalURL())">
223 <span class="help-and-support-link-icon mr-1">
224 <@clay["icon"] symbol="link" />
225 </span>
226 Copy & Share
227 </a>
228</@section>
229
230<#function getSpecificationValue key default="">
231 <#local spec = productSpecifications?filter(productSpecification ->
232 stringUtil.equals(productSpecification.specificationKey, key)) />
233
234 <#return (spec?first.value)!default />
235</#function>
236
237<#macro section
238 title
239 showLine=true
240>
241 <p>
242 <strong>${title}</strong>
243 </p>
244
245 <div>
246 <#nested>
247 </div>
248
249 <#if showLine>
250 <hr />
251 </#if>
252</#macro>
253
254<script ${nonceAttribute}>
255 function installationDocsModalBody() {
256 return `
257 <#if appDocumentationURL?has_content>
258 <div class="d-flex flex-row align-items-center mb-3">
259 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
260 <@clay["icon"]
261 style="fill:#6B6C7E;"
262 symbol="document-code"
263 />
264 </span>
265
266 <div class="d-flex flex-column">
267 <span class="text-black-50">${languageUtil.get(locale, "app-documentation-url", "App Documentation URL")}</span>
268
269 <a class="font-weight-bold" href="tel:${appDocumentationURL}" target="_blank">
270 ${appDocumentationURL}
271 </a>
272 </div>
273 </div>
274 </#if>
275
276 <#if appInstallationGuideURL?has_content>
277 <div class="d-flex flex-row align-items-center mb-4">
278 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
279 <@clay["icon"]
280 style="fill:#6B6C7E;"
281 symbol="document"
282 />
283 </span>
284
285 <div class="d-flex flex-column">
286 <span class="text-black-50">${languageUtil.get(locale, "app-installation-guide-url", "App Installation Guide URL")}</span>
287
288 <a class="font-weight-bold" href="tel:${appInstallationGuideURL}" target="_blank">
289 ${appInstallationGuideURL}
290 </a>
291 </div>
292 </div>
293 </#if>
294 `;
295 }
296
297 function publisherSupportModalBody() {
298 return `
299 <div class="align-items-center d-flex flex-row mb-3">
300 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
301 <#if profileImageURL?? && profileImageURL?length gt 0>
302 <img src="${profileImageURL}" alt="Publisher Image" style="width: 100%; height: 100%; object-fit: cover; border-radius: 50%;" />
303 <#else>
304 <@clay["icon"]
305 style="fill:#6B6C7E;"
306 symbol="picture"
307 />
308 </#if>
309 </span>
310
311 <div class="d-flex flex-column">
312 <h3 class="font-weight-bold mb-0">
313 ${catalogName}
314 </h3>
315 </div>
316 </div>
317
318 <#if publisherURL?has_content>
319 <div class="align-items-center d-flex flex-row mb-3">
320 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
321 <@clay["icon"]
322 style="fill:#6B6C7E;"
323 symbol="globe"
324 />
325 </span>
326
327 <div class="d-flex flex-column">
328 <span class="text-black-50">${languageUtil.get(locale, "publisher-website", "Publisher Website")}</span>
329
330 <a href="${publisherURL}" target="_blank" class="font-weight-bold">
331 ${publisherURL}
332 </a>
333 </div>
334 </div>
335 </#if>
336
337 <#if supportEmail?has_content>
338 <div class="align-items-center d-flex flex-row mb-3">
339 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
340 <@clay["icon"] style="fill:#6B6C7E;"symbol="envelope-closed" />
341 </span>
342
343 <div class="d-flex flex-column">
344 <span class="text-black-50">${languageUtil.get(locale, "support-email", "Support Email")}</span>
345
346 <a class="font-weight-bold" href="mailto:${supportEmail}" target="_blank">
347 ${supportEmail}
348 </a>
349 </div>
350 </div>
351 </#if>
352
353 <#if supportPhone?has_content>
354 <div class="d-flex flex-row align-items-center mb-3">
355 <span class="align-items-center d-flex justify-content-center modal-icon-background mr-3" style="background: #E2E2E4; border-radius:50%; height:40px; overflow:hidden; width:40px;">
356 <@clay["icon"]
357 style="fill:#6B6C7E;"
358 symbol="phone"
359 />
360 </span>
361
362 <div class="d-flex flex-column">
363 <span class="text-black-50">${languageUtil.get(locale, "phone")}</span>
364
365 <a class="font-weight-bold" href="tel:${supportPhone}" target="_blank">
366 ${supportPhone}
367 </a>
368 </div>
369 </div>
370 </#if>
371 `;
372 }
373
374 function openInstallationDocsModal() {
375 Liferay.Util.openModal({
376 bodyHTML: installationDocsModalBody(),
377 center: true,
378 headerHTML: "<h2>Installation Guide</h2>",
379 size: "md"
380 });
381 }
382
383 function openPublisherSupportModal() {
384 Liferay.Util.openModal({
385 bodyHTML: publisherSupportModalBody(),
386 center: true,
387 headerHTML: "<h2>Publisher Support Info</h2>",
388 size: "md"
389 });
390 }
391</script>
392
393<script ${nonceAttribute}>
394 function copyToClipboard(text) {
395 if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
396 navigator.clipboard.writeText(text);
397
398 Liferay.Util.openToast({ message: "Copied link to the clipboard" });
399 }
400 }
401</script>
402
403<style ${nonceAttribute}>
404 .copy-text {
405 color: #282934;
406 font-size: 16px;
407 }
408
409 .help-and-support-modal {
410 color: inherit;
411 text-decoration: none;
412 }
413
414 .help-and-support-modal-arrow {
415 margin-top: 3px;
416 fill: rgb(133, 140, 148);
417 }
418
419 .help-and-support-modal:hover {
420 color: inherit;
421 text-decoration: none;
422 }
423
424 .help-and-support-modal-icon {
425 color: rgb(133, 140, 148);
426 }
427
428 .help-and-support-link {
429 color: #0053F0 !important;
430 }
431
432 .help-and-support-link:hover {
433 color: #0041BE !important;
434 text-decoration: underline !important;
435 }
436
437 .help-and-support-link-icon {
438 color: #0053F0 !important;
439 }
440
441 .help-and-support-svg mask,
442 .link-arrow mask {
443 mask-type: alpha;
444 }
445</style>
HTML Example
A paragraph is a self-contained unit of a discourse in writing dealing with a particular point or idea. Paragraphs are usually an expected part of formal writing, used to organize longer prose.