Loading Knowledge
Learning Path

Practitioner

 hours

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

An error occurred while processing the template.
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> 

Step

1

Introduction

Start with this introductory video.

hours

Capabilities

Product

Contact Us

Connect

Powered by Liferay
© 2024 Liferay Inc. All Rights Reserved • Privacy Policy