Learning Path
Practitioner
Welcome to the beginning! This is the entry point for the Practitioner learning paths. If you work with Liferay and Liferay’s product and offerings, this content is for you, especially if you have a customer-facing role. Regardless of role, however, if you need a basic understanding and foundation, this content benefits you.
Step
2
テンプレート処理中にエラーが発生しました。
The following has evaluated to null or missing:
==> learningPathStepInfo[stepTypeParam][0] [in template "57868206215768#32483061#null" at line 14, column 46]
----
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 learningPathStepContentId = l... [in template "57868206215768#32483061#null" at line 14, column 9]
----
1<#if ObjectField_type.getData() == "Video">
2 <#assign stepTypeParam = "externalMedia"/>
3</#if>
4
5<#if ObjectField_type.getData() == "Course">
6 <#assign stepTypeParam = "stepCourses"/>
7</#if>
8
9<#if (ObjectEntry_objectEntryId.getData())??>
10 <#assign learningPathStepId = ObjectEntry_objectEntryId.getData() />
11 <#assign learningPathStepInfo = restClient.get("/c/learningpathsteps/${learningPathStepId}?nestedFields=${stepTypeParam}") />
12
13 <#if learningPathStepInfo?? && stepTypeParam??>
14 <#assign learningPathStepContentId = learningPathStepInfo[stepTypeParam][0].id />
15 </#if>
16</#if>
17
18<a href="/l/${learningPathStepContentId}" id="step-${learningPathStepContentId}-link">
19 <div class="step-card learn-education__card">
20 <h3 class="mt-3">
21 ${ObjectField_title.getData()}
22 </h3>
23 <p class="mb-3">${ObjectField_description.getData()}</p>
24
25 <div class="card-tags d-flex mr-2">
26
27 <#if (ObjectEntry_objectEntryId.getData())??>
28 <div class="step-info-tag duration">
29 <p>
30 <liferay-lms-duration asset-id="${ObjectEntry_objectEntryId.getData()}" format="hours" asset-type="learningPathStep"></liferay-lms-duration> hours
31 </p>
32 </div>
33 <div class="progress-tag-${learningPathStepContentId}"></div>
34 </#if>
35
36 <#if (.data_model["ObjectRelationship#C_LearningPath#learningPathSteps_accessType"].getData())??>
37 <div class="step-info-tag access-type">
38 <p>
39 ${.data_model["ObjectRelationship#C_LearningPath#learningPathSteps_accessType"].getData()}
40 </p>
41 </div>
42 </#if>
43 </div>
44 </div>
45</a>
46
47<#if ObjectField_type.getData() == "Course">
48 <script type="module">
49 //import "lms";
50
51 let firstLesson = await LiferayLMS.getCourseFirstLessonAsync(${learningPathStepContentId});
52
53 console.log(firstLesson)
54
55 const courseLink = document.getElementById(
56 `step-${learningPathStepContentId}-link`
57 );
58
59 courseLink.href="/l/"+firstLesson.id;
60
61 let userEnrollments = await LiferayLMS.getUserEnrollmentsAsync();
62 let courseId = ${learningPathStepContentId}
63
64 let currentStepEnrollment = userEnrollments.filter((item) => {
65 return item.id == courseId;
66 })
67
68 const paragraph = document.createElement("p");
69
70 if(currentStepEnrollment) {
71 console.log(currentStepEnrollment)
72
73 if (currentStepEnrollment[0].finalQuizzesCompleted === true) {
74 paragraph.innerText = "Completed";
75 paragraph.classList.add("completed-tag");
76 document.querySelector(".progress-tag-${learningPathStepContentId}").appendChild(paragraph);
77 }
78 }
79 </script>
80</#if>
81
82<style>
83 .step-card {
84 background-color: #FBFCFE !important;
85 border-color: #E7EFFF !important;
86 border-radius: 1rem !important;
87 border-style: solid;
88 border-width: 1px !important;
89 padding: var(--spacer-4, 1.5rem) !important;
90 margin-bottom: var(--spacer-4, 1.5rem) !important;
91 position: relative;
92 }
93
94 .card-tags {
95 gap: 0.5rem;
96 }
97
98 .step-info-tag {
99 border-radius: var(--border-radius-sm) !important;
100 color: var(--color-state-info-darken-2, #1C3667);
101 height: 28px;
102 padding: 4px 8px;
103 }
104
105 .step-info-tag p {
106 font-size: var(--text-paragraph-sm-font-size);
107 line-height: var(--text-paragraph-sm-line-height);
108 }
109
110 .duration {
111 background-color: #E6EBF5 !important;
112 }
113
114 .duration p::before {
115 content: '';
116 display: inline-block;
117 width: 14px;
118 height: 14px;
119 margin-bottom: 2px;
120 margin-right: 4px;
121 background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='0.7'%3E%3Cmask id='mask0_2278_5196' style='mask-type:alpha' maskUnits='userSpaceOnUse' x='0' y='0' width='16' height='16'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M13.6562 2.34375C12.1465 0.831299 10.1377 0 8 0C5.8623 0 3.85352 0.831299 2.34375 2.34375C0.831055 3.85315 0 5.86255 0 8C0 10.1375 0.831055 12.1469 2.34375 13.6562C3.85645 15.1687 5.8623 16 8 16C10.1377 16 12.1465 15.1687 13.6562 13.6562C15.1689 12.1438 16 10.1375 16 8C16 5.86255 15.1689 3.85315 13.6562 2.34375ZM8 14C4.69043 14 2 11.3093 2 8C2 4.69067 4.69043 2 8 2C11.3096 2 14 4.69067 14 8C14 11.3093 11.3096 14 8 14ZM6 11C5.87207 11 5.74316 10.95 5.64648 10.8531C5.4502 10.6594 5.4502 10.3406 5.64648 10.1469L7.14648 8.64685C7.05273 8.44995 7 8.2312 7 8C7 7.34692 7.41895 6.79065 8 6.58435V3.5C8 3.22498 8.22461 3 8.5 3C8.77441 3 9 3.22498 9 3.5V6.58435C9.58105 6.79065 10 7.34692 10 8C10 8.82812 9.32812 9.5 8.5 9.5C8.26855 9.5 8.0498 9.4469 7.85254 9.35315L6.35254 10.8531C6.25586 10.95 6.12793 11 6 11Z' fill='%236B6C7E'/%3E%3C/mask%3E%3Cg mask='url(%23mask0_2278_5196)'%3E%3Crect width='16' height='16' fill='%231C3667'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
122 background-size: cover;
123 vertical-align: middle;
124 }
125
126 .access-type {
127 background-color: #E1E1E4;
128 }
129
130 .inprogress-tag {
131 background-color: #E6EBF5;
132 color: #1C3667;
133 font-size: 13px;
134 padding: 6px;
135 border-radius: 4px;
136 }
137
138 .completed-tag {
139 background-color: #4AAB3B;
140 color: white;
141 font-size: 13px;
142 padding: 6px;
143 border-radius: 4px;
144 display: flex;
145 }
146
147 .completed-tag::after {
148 content: '';
149 display: inline-block;
150 width: 14px;
151 height: 14px;
152 background-image: url('data:image/svg+xml;utf8,<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="mask0_4331_2544" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="1" y="2" width="14" height="12"><path d="M6.02855 13.4238C5.76918 13.4238 5.51605 13.3207 5.33168 13.1363L1.39105 9.19254C0.469179 8.22692 1.9598 6.93942 2.7848 7.79879L5.9848 11.0019L13.1723 2.91129C14.0223 1.95817 15.4942 3.27067 14.6442 4.22067L6.76293 13.0925C6.58168 13.2957 6.32543 13.4144 6.05668 13.4238C6.0473 13.4238 6.03793 13.4238 6.02855 13.4238Z" fill="%236B6C7E"/></mask><g mask="url(%23mask0_4331_2544)"><rect width="16" height="16" fill="white"/></g></svg>');
153 background-size: contain;
154 background-repeat: no-repeat;
155 margin-left: 2px;
156 align-items: center;
157 }
158</style>
The following has evaluated to null or missing: ==> learningPathStepInfo[stepTypeParam][0] [in template "57868206215768#32483061#null" at line 14, column 46] ---- 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 learningPathStepContentId = l... [in template "57868206215768#32483061#null" at line 14, column 9] ----
1<#if ObjectField_type.getData() == "Video">
2 <#assign stepTypeParam = "externalMedia"/>
3</#if>
4
5<#if ObjectField_type.getData() == "Course">
6 <#assign stepTypeParam = "stepCourses"/>
7</#if>
8
9<#if (ObjectEntry_objectEntryId.getData())??>
10 <#assign learningPathStepId = ObjectEntry_objectEntryId.getData() />
11 <#assign learningPathStepInfo = restClient.get("/c/learningpathsteps/${learningPathStepId}?nestedFields=${stepTypeParam}") />
12
13 <#if learningPathStepInfo?? && stepTypeParam??>
14 <#assign learningPathStepContentId = learningPathStepInfo[stepTypeParam][0].id />
15 </#if>
16</#if>
17
18<a href="/l/${learningPathStepContentId}" id="step-${learningPathStepContentId}-link">
19 <div class="step-card learn-education__card">
20 <h3 class="mt-3">
21 ${ObjectField_title.getData()}
22 </h3>
23 <p class="mb-3">${ObjectField_description.getData()}</p>
24
25 <div class="card-tags d-flex mr-2">
26
27 <#if (ObjectEntry_objectEntryId.getData())??>
28 <div class="step-info-tag duration">
29 <p>
30 <liferay-lms-duration asset-id="${ObjectEntry_objectEntryId.getData()}" format="hours" asset-type="learningPathStep"></liferay-lms-duration> hours
31 </p>
32 </div>
33 <div class="progress-tag-${learningPathStepContentId}"></div>
34 </#if>
35
36 <#if (.data_model["ObjectRelationship#C_LearningPath#learningPathSteps_accessType"].getData())??>
37 <div class="step-info-tag access-type">
38 <p>
39 ${.data_model["ObjectRelationship#C_LearningPath#learningPathSteps_accessType"].getData()}
40 </p>
41 </div>
42 </#if>
43 </div>
44 </div>
45</a>
46
47<#if ObjectField_type.getData() == "Course">
48 <script type="module">
49 //import "lms";
50
51 let firstLesson = await LiferayLMS.getCourseFirstLessonAsync(${learningPathStepContentId});
52
53 console.log(firstLesson)
54
55 const courseLink = document.getElementById(
56 `step-${learningPathStepContentId}-link`
57 );
58
59 courseLink.href="/l/"+firstLesson.id;
60
61 let userEnrollments = await LiferayLMS.getUserEnrollmentsAsync();
62 let courseId = ${learningPathStepContentId}
63
64 let currentStepEnrollment = userEnrollments.filter((item) => {
65 return item.id == courseId;
66 })
67
68 const paragraph = document.createElement("p");
69
70 if(currentStepEnrollment) {
71 console.log(currentStepEnrollment)
72
73 if (currentStepEnrollment[0].finalQuizzesCompleted === true) {
74 paragraph.innerText = "Completed";
75 paragraph.classList.add("completed-tag");
76 document.querySelector(".progress-tag-${learningPathStepContentId}").appendChild(paragraph);
77 }
78 }
79 </script>
80</#if>
81
82<style>
83 .step-card {
84 background-color: #FBFCFE !important;
85 border-color: #E7EFFF !important;
86 border-radius: 1rem !important;
87 border-style: solid;
88 border-width: 1px !important;
89 padding: var(--spacer-4, 1.5rem) !important;
90 margin-bottom: var(--spacer-4, 1.5rem) !important;
91 position: relative;
92 }
93
94 .card-tags {
95 gap: 0.5rem;
96 }
97
98 .step-info-tag {
99 border-radius: var(--border-radius-sm) !important;
100 color: var(--color-state-info-darken-2, #1C3667);
101 height: 28px;
102 padding: 4px 8px;
103 }
104
105 .step-info-tag p {
106 font-size: var(--text-paragraph-sm-font-size);
107 line-height: var(--text-paragraph-sm-line-height);
108 }
109
110 .duration {
111 background-color: #E6EBF5 !important;
112 }
113
114 .duration p::before {
115 content: '';
116 display: inline-block;
117 width: 14px;
118 height: 14px;
119 margin-bottom: 2px;
120 margin-right: 4px;
121 background-image: url("data:image/svg+xml,%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg opacity='0.7'%3E%3Cmask id='mask0_2278_5196' style='mask-type:alpha' maskUnits='userSpaceOnUse' x='0' y='0' width='16' height='16'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M13.6562 2.34375C12.1465 0.831299 10.1377 0 8 0C5.8623 0 3.85352 0.831299 2.34375 2.34375C0.831055 3.85315 0 5.86255 0 8C0 10.1375 0.831055 12.1469 2.34375 13.6562C3.85645 15.1687 5.8623 16 8 16C10.1377 16 12.1465 15.1687 13.6562 13.6562C15.1689 12.1438 16 10.1375 16 8C16 5.86255 15.1689 3.85315 13.6562 2.34375ZM8 14C4.69043 14 2 11.3093 2 8C2 4.69067 4.69043 2 8 2C11.3096 2 14 4.69067 14 8C14 11.3093 11.3096 14 8 14ZM6 11C5.87207 11 5.74316 10.95 5.64648 10.8531C5.4502 10.6594 5.4502 10.3406 5.64648 10.1469L7.14648 8.64685C7.05273 8.44995 7 8.2312 7 8C7 7.34692 7.41895 6.79065 8 6.58435V3.5C8 3.22498 8.22461 3 8.5 3C8.77441 3 9 3.22498 9 3.5V6.58435C9.58105 6.79065 10 7.34692 10 8C10 8.82812 9.32812 9.5 8.5 9.5C8.26855 9.5 8.0498 9.4469 7.85254 9.35315L6.35254 10.8531C6.25586 10.95 6.12793 11 6 11Z' fill='%236B6C7E'/%3E%3C/mask%3E%3Cg mask='url(%23mask0_2278_5196)'%3E%3Crect width='16' height='16' fill='%231C3667'/%3E%3C/g%3E%3C/g%3E%3C/svg%3E");
122 background-size: cover;
123 vertical-align: middle;
124 }
125
126 .access-type {
127 background-color: #E1E1E4;
128 }
129
130 .inprogress-tag {
131 background-color: #E6EBF5;
132 color: #1C3667;
133 font-size: 13px;
134 padding: 6px;
135 border-radius: 4px;
136 }
137
138 .completed-tag {
139 background-color: #4AAB3B;
140 color: white;
141 font-size: 13px;
142 padding: 6px;
143 border-radius: 4px;
144 display: flex;
145 }
146
147 .completed-tag::after {
148 content: '';
149 display: inline-block;
150 width: 14px;
151 height: 14px;
152 background-image: url('data:image/svg+xml;utf8,<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg"><mask id="mask0_4331_2544" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="1" y="2" width="14" height="12"><path d="M6.02855 13.4238C5.76918 13.4238 5.51605 13.3207 5.33168 13.1363L1.39105 9.19254C0.469179 8.22692 1.9598 6.93942 2.7848 7.79879L5.9848 11.0019L13.1723 2.91129C14.0223 1.95817 15.4942 3.27067 14.6442 4.22067L6.76293 13.0925C6.58168 13.2957 6.32543 13.4144 6.05668 13.4238C6.0473 13.4238 6.03793 13.4238 6.02855 13.4238Z" fill="%236B6C7E"/></mask><g mask="url(%23mask0_4331_2544)"><rect width="16" height="16" fill="white"/></g></svg>');
153 background-size: contain;
154 background-repeat: no-repeat;
155 margin-left: 2px;
156 align-items: center;
157 }
158</style>
Capabilities
Product
Contact Us
Powered by Liferay
© 2024 Liferay Inc. All Rights Reserved • Privacy Policy