/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 116, 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 116, column 25]
~ Reached through: #nested [in template "3192443#3192485#null" in macro "section" at line 208, column 17]
~ Reached through: @section title=languageUtil.get(local... [in template "3192443#3192485#null" at line 101, 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 publisherDetailsResponse = restClient.get("/c/publisherdetailses?filter=publisherName eq '${catalogName}'") />
20<#assign redirectPath="https://marketplace.liferay.com/e/publisher-details/29282497"/>
21
22<#if publisherDetailsResponse.items?has_content>
23 <#assign
24 publisherDetails = publisherDetailsResponse.items[0]
25 profileImageURL = publisherDetails.publisherProfileImage?replace("https://", "http://")
26 />
27</#if>
28
29<#assign
30 appUsageTerms = getSpecificationValue("appusagetermsurl")
31 cpuValue = getSpecificationValue("cpu")
32 developerName = getSpecificationValue("developer-name", catalogName)
33 publisherURL = (getSpecificationValue("publisherwebsiteurl")?trim?replace(" ", ""))!""
34 ramValue = getSpecificationValue("ram")
35 supportEmail = getSpecificationValue("supportemailaddress")
36 supportPhone = getSpecificationValue("supportphone")
37 type = getSpecificationValue("type")?lower_case
38>
39<@section title = languageUtil.get(locale, "developer")>
40 <#if publisherDetails?has_content>
41 <a class="bg-neutral-8" href="${redirectPath}/${publisherDetails.id}">
42 ${developerName}
43 </a>
44 <#else>
45 <a class="bg-neutral-8" href="/?q=${developerName}">
46 ${developerName}
47 </a>
48 </#if>
49</@section>
50
51<@section title=languageUtil.get(locale, "publisher-date", "Publisher Date")>
52 <#if createDate?has_content>
53 <#assign parsedDate = createDate?datetime("yyyy-MM-dd'T'HH:mm:ss'Z'")>
54 <p>${parsedDate?string("MMMM d, yyyy")}</p>
55 </#if>
56</@section>
57
58<@section title = languageUtil.get(locale, "deployment-method", "Deployment Method")>
59 <#list platformOffering as offering>
60 <p>${offering.name}</p>
61 </#list>
62</@section>
63
64<@section title = languageUtil.get(locale, "app-type", "App Type")>
65 <#if type == 'client-extension'> Client Extension </#if>
66 <#if type == 'cloud'> Cloud </#if>
67 <#if type == 'composite-app'> Composite App </#if>
68 <#if type == 'dxp'> DXP </#if>
69 <#if type == 'low-code-configuration'> Low Code Configuration </#if>
70</@section>
71
72<@section title = languageUtil.get(locale, "version")>
73 ${getSpecificationValue("latest-version", "1.0.0")}
74</@section>
75
76<#if liferayVersions?has_content>
77 <@section title = languageUtil.get(locale, "supported-versions", "Supported Versions")>
78 <#list liferayVersions as version>
79 ${version.value}<#if version?has_next>, </#if>
80 </#list>
81 </@section>
82</#if>
83
84<#if cpuValue?has_content>
85 <@section title = languageUtil.get(locale, "resource-requirements", "Resource Requirements")>
86 <p>
87 <#if cpuValue?has_content>
88 ${cpuValue}
89 <#assign cpuNumber = cpuValue?number?default(0) />
90 <#if cpuValue?eval gt 1>
91 CPUS
92 </#if>
93 <#if cpuValue?eval lt 2>
94 CPU
95 </#if>
96 </#if>, <#if ramValue?has_content>${ramValue} GB RAM</#if>
97 </p>
98 </@section>
99</#if>
100
101<@section title = languageUtil.get(locale, "standard-price", "Standard Price")>
102 <div>
103 <#assign purchasableSkus = [] />
104
105 <#list product.skus as sku>
106 <#if sku.purchasable?? && sku.purchasable>
107 <#assign purchasableSkus = purchasableSkus + [sku] />
108 </#if>
109 </#list>
110
111 <#assign standardSku = {} />
112
113 <#list purchasableSkus as sku>
114 <#assign matched = false />
115
116 <#list sku.skuOptions as opt>
117 <#if stringUtil.equals(opt.skuOptionValueKey, "standard")>
118 <#assign
119 matched = true
120 standardSku = sku
121 />
122
123 <#break>
124 </#if>
125 </#list>
126 <#if matched><#break></#if>
127 </#list>
128
129 <#if standardSku.price?? && standardSku.price.price?eval gt 0>
130 <div class="bg-neutral-8">${standardSku.price.priceFormatted!""}</div>
131 <#else>
132 ${languageUtil.get(locale, "free", "Free")}
133 </#if>
134 </div>
135</@section>
136
137<@section title = languageUtil.get(locale, "help-and-support", "Help and Support")>
138 <div class="d-flex flex-column mt-4">
139 <div class="d-flex">
140 <span class="help-and-support-link-icon">
141 <@clay["icon"] symbol="document" />
142 </span>
143
144 <a
145 class="d-flex w-100 justify-content-between help-and-support-link"
146 href="${(appUsageTerms?has_content)?then(appUsageTerms, 'https://www.liferay.com/en/legal/marketplace-terms-of-service')}"
147 target="_blank">
148 <span class="copy-text ml-1 help-and-support-link">
149 ${languageUtil.get(locale, "terms-and-conditions", "Terms & Conditions")}
150 </span>
151
152 <@clay["icon"]
153 className="help-and-support-link-arrow link-arrow ml-auto"
154 height="12"
155 symbol="angle-right"
156 />
157 </a>
158 </div>
159
160 <div class="d-flex">
161 <span class="help-and-support-link-icon">
162 <@clay["icon"] symbol="document" />
163 </span>
164
165 <a class="d-flex w-100 justify-content-between help-and-support-link" href="javascript:void(0)" onClick="openModal()">
166 <span class="copy-text ml-1 help-and-support-link">
167 ${languageUtil.get(locale, "publisher-contact-info", "Publisher Contact Info")}
168 </span>
169
170 <@clay["icon"]
171 className="help-and-support-link-arrow link-arrow ml-auto"
172 height="12"
173 symbol="angle-right"
174 />
175 </a>
176 </div>
177 </div>
178</@section>
179
180<@section
181 showLine = false
182 title = languageUtil.get(locale, "share-link")
183>
184 <a class="align-items-center copy-text d-flex font-weight-bold ml-1 text-decoration-none text-primary" href="#copy-share-link" onclick="copyToClipboard(Liferay.ThemeDisplay.getCanonicalURL())">
185 <span class="help-and-support-link-icon mr-1">
186 <@clay["icon"] symbol="link" />
187 </span>
188 Copy & Share
189 </a>
190</@section>
191
192<#function getSpecificationValue key default="">
193 <#local spec = productSpecifications?filter(productSpecification ->
194 stringUtil.equals(productSpecification.specificationKey, key)) />
195
196 <#return (spec?first.value)!default />
197</#function>
198
199<#macro section
200 title
201 showLine=true
202>
203 <p>
204 <strong>${title}</strong>
205 </p>
206
207 <div>
208 <#nested>
209 </div>
210
211 <#if showLine>
212 <hr />
213 </#if>
214</#macro>
215
216<script ${nonceAttribute}>
217 function modalBody() {
218 return `
219 <div class="align-items-center d-flex flex-row mb-3">
220 <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;">
221 <#if profileImageURL?? && profileImageURL?length gt 0>
222 <img src="${profileImageURL}" alt="Publisher Image" style="width: 100%; height: 100%; object-fit: cover; border-radius: 50%;" />
223 <#else>
224 <@clay["icon"]
225 style="fill:#6B6C7E;"
226 symbol="picture"
227 />
228 </#if>
229 </span>
230
231 <div class="d-flex flex-column">
232 <h3 class="font-weight-bold mb-0">
233 ${catalogName}
234 </h3>
235 </div>
236 </div>
237
238 <#if publisherURL?has_content>
239 <div class="align-items-center d-flex flex-row mb-3">
240 <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;">
241 <@clay["icon"]
242 style="fill:#6B6C7E;"
243 symbol="globe"
244 />
245 </span>
246
247 <div class="d-flex flex-column">
248 <span class="text-black-50">${languageUtil.get(locale, "publisher-website", "Publisher Website")}</span>
249
250 <a href="${publisherURL}" target="_blank" class="font-weight-bold">
251 ${publisherURL}
252 </a>
253 </div>
254 </div>
255 </#if>
256
257 <#if supportEmail?has_content>
258 <div class="align-items-center d-flex flex-row 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"] style="fill:#6B6C7E;"symbol="envelope-closed" />
261 </span>
262
263 <div class="d-flex flex-column">
264 <span class="text-black-50">${languageUtil.get(locale, "support-email", "Support Email")}</span>
265
266 <a class="font-weight-bold" href="mailto:${supportEmail}" target="_blank">
267 ${supportEmail}
268 </a>
269 </div>
270 </div>
271 </#if>
272
273 <#if supportPhone?has_content>
274 <div class="d-flex flex-row align-items-center mb-3">
275 <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;">
276 <@clay["icon"]
277 style="fill:#6B6C7E;"
278 symbol="phone"
279 />
280 </span>
281
282 <div class="d-flex flex-column">
283 <span class="text-black-50">${languageUtil.get(locale, "phone")}</span>
284
285 <a class="font-weight-bold" href="tel:${supportPhone}" target="_blank">
286 ${supportPhone}
287 </a>
288 </div>
289 </div>
290 </#if>
291 `;
292 }
293
294 function openModal() {
295 Liferay.Util.openModal({
296 bodyHTML: modalBody(),
297 center: true,
298 headerHTML: "<h2>Publisher Support Contact Info</h2>",
299 size: "md"
300 });
301 }
302</script>
303
304<script ${nonceAttribute}>
305 function copyToClipboard(text) {
306 if (navigator && navigator.clipboard && navigator.clipboard.writeText) {
307 navigator.clipboard.writeText(text);
308
309 Liferay.Util.openToast({ message: "Copied link to the clipboard" });
310 }
311 }
312</script>
313
314<style ${nonceAttribute}>
315 .copy-text {
316 color: #282934;
317 font-size: 16px;
318 }
319
320 .help-and-support-link {
321 color: inherit;
322 text-decoration: none;
323 }
324
325 .help-and-support-link-arrow {
326 fill: rgb(133, 140, 148);
327 }
328
329 .help-and-support-link:hover {
330 color: inherit;
331 text-decoration: none;
332 }
333
334 .help-and-support-link-icon {
335 color: rgb(133, 140, 148);
336 }
337
338 .help-and-support-svg mask,
339 .link-arrow mask {
340 mask-type: alpha;
341 }
342</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.