Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing:
==> channel.items[0] [in template "3192443#3192485#null" at line 8, column 30]
----
Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 8, column 9]
----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
6
7<#if channel?has_content>
8 <#assign channelId = channel.items[0].id />
9</#if>
10
11<#if (CPDefinition_cProductId.getData())??>
12 <#assign productId = CPDefinition_cProductId.getData() />
13</#if>
14
15<#assign
16 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&images.accountId=-1&nestedFields=images")
17 productImage = product.images?filter(item -> item.tags?seq_contains("app icon"))![]
18/>
19
20<#if productImage?has_content>
21 <#assign productThumbnail = productImage[0].src?split("/o") />
22 <#if productThumbnail?has_content && productThumbnail?size gte 2>
23 <#assign productThumbnail1 = "/o/${productThumbnail[1]}"!"" />
24 <#else>
25 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
26 </#if>
27<#else>
28 <#if product.urlImage?has_content>
29 <#assign productThumbnail = product.urlImage?split("/o") />
30 <#if productThumbnail?has_content && productThumbnail?size gte 2>
31 <#assign productThumbnail1 = "/o/${productThumbnail[1]}"!"" />
32 <#else>
33 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
34 </#if>
35 <#else>
36 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
37 </#if>
38</#if>
39
40${productThumbnail1}
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 8, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 8, column 9] ----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
6
7<#if channel?has_content>
8 <#assign channelId = channel.items[0].id />
9</#if>
10
11<#if (CPDefinition_cProductId.getData())??>
12 <#assign productId = CPDefinition_cProductId.getData() />
13</#if>
14
15<#assign
16 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&images.accountId=-1&nestedFields=images")
17 productImage = product.images?filter(item -> item.tags?seq_contains("app icon"))![]
18/>
19
20<#if productImage?has_content>
21 <#assign productThumbnail = productImage[0].src?split("/o") />
22 <#if productThumbnail?has_content && productThumbnail?size gte 2>
23 <#assign productThumbnail1 = "/o/${productThumbnail[1]}"!"" />
24 <#else>
25 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
26 </#if>
27<#else>
28 <#if product.urlImage?has_content>
29 <#assign productThumbnail = product.urlImage?split("/o") />
30 <#if productThumbnail?has_content && productThumbnail?size gte 2>
31 <#assign productThumbnail1 = "/o/${productThumbnail[1]}"!"" />
32 <#else>
33 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
34 </#if>
35 <#else>
36 <#assign productThumbnail1 = "/o/commerce-media/default/?groupId=${scopeGroupId}" />
37 </#if>
38</#if>
39
40${productThumbnail1}
Travis Integration Portlet
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 62, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 62, column 9] ----
1<style>
2 .app-container {
3 font-size: MEDIUM;
4 }
5
6 .app-container .app-category {
7 background-color: #e6ebf5;
8 padding: 6px 8px 4px
9 }
10
11 .app-container .app-product-type {
12 border-color: #2e5aac !important;
13 color:#2e5aac;
14 padding: 4px 8px;
15 }
16
17 @media screen and (max-width: 768px) {
18 .app-container {
19 font-size: small;
20 }
21 }
22
23 @media screen and (max-width: 576px) {
24 .app-container {
25 font-size: x-small;
26 }
27
28 .app-container .app-category,
29 .app-container .app-product-type {
30 padding: 2px 4px;
31 }
32 }
33</style>
34
35<#assign
36 PRODUCT_TYPE_CLOUD = "CLOUD"
37 PRODUCT_TYPE_DXP = "DXP"
38 PRODUCT_TYPE_FREE = "FREE"
39 PRODUCT_TYPE_PAID = "PAID"
40 VOCABULARY_PRODUCT_CATEGORY = "MARKETPLACE APP CATEGORY"
41/>
42
43<#if themeDisplay?has_content>
44 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
45</#if>
46
47<#assign siteName = "marketplace" />
48
49<#if currentURL?has_content>
50 <#if currentURL?contains('web')>
51 <#assign
52 index = 2
53 partsUrl = currentURL?split('/')
54 siteName = partsUrl[index..index]?join('/')
55 />
56 </#if>
57</#if>
58
59<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
60
61<#if channel?has_content>
62 <#assign channelId = channel.items[0].id />
63</#if>
64
65<#if (CPDefinition_cProductId.getData())??>
66 <#assign productId = CPDefinition_cProductId.getData() />
67</#if>
68
69<#assign
70 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=productSpecifications,categories")
71 categories = product.categories![]
72 productSpecifications = product.productSpecifications![]
73/>
74
75<div class="app-container color-neutral-3 d-flex flex-wrap font-size-paragraph-small justify-content-between w-100">
76 <div class="d-flex">
77 <#if categories?has_content>
78 <#list categories as category>
79 <#if category.vocabulary?upper_case == VOCABULARY_PRODUCT_CATEGORY>
80 <div class="app-category bg-neutral-8 border-radius-small mb-1 mr-2 px-1 rounded">
81 ${category.name}
82 </div>
83 </#if>
84 </#list>
85 </#if>
86
87 <#if productSpecifications?has_content>
88
89 <#assign productTypes = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "type")) />
90
91 <#list productTypes as productType>
92 <#if productType.value?upper_case == PRODUCT_TYPE_DXP>
93 <#assign
94 icon = "dxp-svg"
95 type = "DXP App"
96 />
97 <#elseif productType.value?upper_case == PRODUCT_TYPE_CLOUD>
98 <#assign
99 icon = "cloud-svg"
100 type = "Cloud App"
101 />
102 </#if>
103
104 <#if type?has_content && icon?has_content>
105 <div class="app-product-type border border-radius-small d-flex mb-1 mr-2 px-1 rounded">
106 <div class="app-product-type-icon mr-1">
107 <img alt="Icon" class="mb-1" src="/documents/d/${siteName}/${icon}" />
108 </div>
109
110 <div class="bg-neutral-8">${type}</div>
111 </div>
112 </#if>
113 </#list>
114 </#if>
115 </div>
116</div>
More and more often, development teams adopt Continuous Integration as a good practice within development processes, and team members need to watch the results of its current work.
Travis-ci is a continuous integration service perfect for open-source projects, so many and many teams are using it as their preferred CI server.
As Travis provides many metrics by itself, I've decided to start a Liferay+ AlloyUI + Travis integration portlet that allows to display build status in an easy and portal-deployable way. For that, a Liferay portal Admin, can deploy this portlet in his portal, allowing its users to watch last builds statuses, in an user-friendly style, using AlloyUI built-in capabilities.
Travis-ci is a continuous integration service perfect for open-source projects, so many and many teams are using it as their preferred CI server.
As Travis provides many metrics by itself, I've decided to start a Liferay+ AlloyUI + Travis integration portlet that allows to display build status in an easy and portal-deployable way. For that, a Liferay portal Admin, can deploy this portlet in his portal, allowing its users to watch last builds statuses, in an user-friendly style, using AlloyUI built-in capabilities.
DEVELOPER
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 18, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 18, column 9] ----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#if currentURL?has_content>
6 <#if currentURL?contains('web')>
7 <#assign
8 index = 2
9 partsUrl = currentURL?split('/')
10 siteName = partsUrl[index..index]?join('/')
11 />
12 </#if>
13</#if>
14
15<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
16
17<#if channel?has_content>
18 <#assign channelId = channel.items[0].id />
19</#if>
20
21<#if (CPDefinition_cProductId.getData())??>
22 <#assign productId = CPDefinition_cProductId.getData() />
23</#if>
24
25<#assign
26 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=productSpecifications")
27 productSpecifications = product.productSpecifications![]
28/>
29
30<div>
31 <#if productSpecifications?has_content>
32 <#assign developerNames = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "developer-name")) />
33
34 <#if developerNames?has_content>
35 <#list developerNames as developerName>
36 <div class="bg-neutral-8">${developerName.value}</div>
37 </#list>
38 </#if>
39 </#if>
40</div>
DEVELOPER
23/03/15 00:00
Published date
November 3, 2016
Published Date
23/03/15 00:00
SUPPORTED OFFERINGS
Self-Hosted, Self-Managed
Supported Versions
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 22, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 22, column 9] ----
1<#assign
2 VOCABULARY_PRODUCT_CATEGORY = "MARKETPLACE LIFERAY VERSION"
3/>
4
5<#if themeDisplay?has_content>
6 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
7</#if>
8
9<#if currentURL?has_content>
10 <#if currentURL?contains('web')>
11 <#assign
12 index = 2
13 partsUrl = currentURL?split('/')
14 siteName = partsUrl[index..index]?join('/')
15 />
16 </#if>
17</#if>
18
19<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
20
21<#if channel?has_content>
22 <#assign channelId = channel.items[0].id />
23</#if>
24
25<#if (CPDefinition_cProductId.getData())??>
26 <#assign productId = CPDefinition_cProductId.getData() />
27</#if>
28
29<#assign
30 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=categories")
31 categories = product.categories![]
32/>
33
34<div class="app-container color-neutral-3 d-flex flex-wrap font-size-paragraph-small justify-content-between w-100">
35 <div class="d-flex">
36 <#if categories?has_content>
37 <#function getVersions(version)>
38 <#return version.vocabulary?upper_case == "MARKETPLACE-LIFERAY-VERSION">
39 </#function>
40
41 ${categories?sort_by("name")?reverse?filter(getVersions)?map(version -> version.name)?join(", ")}
42 </#if>
43 </div>
44</div>
Resource Requirements
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 18, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 18, column 9] ----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#if currentURL?has_content>
6 <#if currentURL?contains('web')>
7 <#assign
8 index = 2
9 partsUrl = currentURL?split('/')
10 siteName = partsUrl[index..index]?join('/')
11 />
12 </#if>
13</#if>
14
15<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
16
17<#if channel?has_content>
18 <#assign channelId = channel.items[0].id />
19</#if>
20
21<#if (CPDefinition_cProductId.getData())??>
22 <#assign productId = CPDefinition_cProductId.getData() />
23</#if>
24
25<#assign
26 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=productSpecifications")
27 specifications = product.productSpecifications![]
28/>
29
30<div>
31 <#if specifications?has_content>
32
33 <#assign
34 specificationCPUs = specifications?filter(item -> stringUtil.equals(item.specificationKey, "cpu"))
35 specificationRAMs = specifications?filter(item -> stringUtil.equals(item.specificationKey, "ram"))
36 cpuQuantity = ""
37 memoryQuantity = ""
38 />
39
40 <#if specificationCPUs?has_content>
41 <#list specificationCPUs as cpu>
42 <#assign cpuQuantity = cpu.value />
43
44 <#if cpuQuantity?has_content>
45 ${cpuQuantity}
46 <#if cpuQuantity?eval gt 1>
47 CPUS
48 </#if>
49
50 <#if cpuQuantity?eval lt 2>
51 CPU
52 </#if>
53 </#if>
54 </#list>
55 </#if>
56
57 <#if specificationRAMs?has_content>
58 <#list specificationRAMs as ram>
59 <#assign memoryQuantity = ram.value />
60
61 <#if cpuQuantity?has_content && memoryQuantity?has_content >, </#if>
62
63 <#assign memoryQuantity = ram.value />
64
65 <#if memoryQuantity?has_content>
66 ${memoryQuantity} GB RAM
67 </#if>
68 </#list>
69 </#if>
70 </#if>
71</div>
Edition
CE, EE
PRICE
Une erreur s'est produite lors du traitement du modèle.
The following has evaluated to null or missing: ==> channel.items[0] [in template "3192443#3192485#null" at line 18, column 30] ---- Tip: It's the final [] step 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: #assign channelId = channel.items[0].id [in template "3192443#3192485#null" at line 18, column 9] ----
1<#if themeDisplay?has_content>
2 <#assign scopeGroupId = themeDisplay.getScopeGroupId() />
3</#if>
4
5<#if currentURL?has_content>
6 <#if currentURL?contains('web')>
7 <#assign
8 index = 2
9 partsUrl = currentURL?split('/')
10 siteName = partsUrl[index..index]?join('/')
11 />
12 </#if>
13</#if>
14
15<#assign channel = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?accountId=-1&filter=name eq 'Marketplace Channel' and siteGroupId eq '${scopeGroupId}'") />
16
17<#if channel?has_content>
18 <#assign channelId = channel.items[0].id />
19</#if>
20
21<#if (CPDefinition_cProductId.getData())??>
22 <#assign productId = CPDefinition_cProductId.getData() />
23</#if>
24
25<#assign
26 product = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/"+ channelId +"/products/"+ productId +"?accountId=-1&nestedFields=productSpecifications")
27 productSpecifications = product.productSpecifications![]
28/>
29
30<div>
31 <#if productSpecifications?has_content>
32 <#assign priceModels = productSpecifications?filter(item -> stringUtil.equals(item.specificationKey, "price-model")) />
33
34 <#if priceModels?has_content>
35 <#list priceModels as priceModel>
36 <div class="bg-neutral-8">${priceModel.value}</div>
37 </#list>
38 </#if>
39 </#if>
40</div>
help & support
Terms & Conditions
SHARE LINK
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.