Course
2 hours
Practitioner, Developer, Administrator
Beginner
The following has evaluated to null or missing: ==> navigationJSONObject.getJSONObject("course") [in template "17855804202317#32484267#LEARN-COURSE-SIDE-NAV" at line 5, column 28] ---- 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: courseJSONObject = navigationJSONObje... [in template "17855804202317#32484267#LEARN-COURSE-SIDE-NAV" at line 5, column 9] ----
1<#assign
2 groupPathFriendlyURLPublic = themeDisplay.getPathFriendlyURLPublic() + themeDisplay.getScopeGroup().getFriendlyURL()
3 navigationJSONObject = jsonFactoryUtil.createJSONObject(navigation.getData())
4
5 courseJSONObject = navigationJSONObject.getJSONObject("course")
6 modulesJSONArray = navigationJSONObject.getJSONArray("modules")
7/>
8
9<div class="learn-course-side-nav">
10 <div class="learn-course-nav-content">
11 <#if modulesJSONArray.length() gt 0>
12 <ul class="m-0 p-2">
13 <li class="learn-course-nav-item ${(navigationJSONObject.getJSONObject("self").url == courseJSONObject.url)?then("selected", "")}">
14 <a class="liferay-nav-item" href="${courseJSONObject.url}">
15 <span>Introduction</span>
16 </a>
17 </li>
18
19 <#list 0..modulesJSONArray.length()-1 as i>
20 <div>
21 <#assign
22 modulesJSONObject = modulesJSONArray.getJSONObject(i)
23
24 lessonsJSONArray = modulesJSONObject.getJSONArray("lessons")?eval_json
25 moduleLessonIsSelected = false
26 />
27
28 <#list lessonsJSONArray as lesson>
29 <#if navigationJSONObject.getJSONObject("self").url == lesson.url>
30 <#assign moduleLessonIsSelected = true />
31 </#if>
32 </#list>
33 <div class="panel-group">
34 <div class="panel panel-secondary">
35 <button
36 aria-controls= "collapsePanel${i}"
37 aria-expanded="false"
38 class="btn btn-unstyled panel-header panel-header-link collapse-icon collapse-icon-middle collapsed"
39 data-target= "#collapsePanel${i}"
40 data-toggle="liferay-collapse"
41 onclick="togglePanel(this)"
42 >
43 <span class="panel-title">
44 <li class="learn-course-nav-item">
45 <div
46 class="liferay-nav-item ${(moduleLessonIsSelected)?then("highlightedNavItem", "")} ${(navigationJSONObject.getJSONObject("self").url == modulesJSONObject.url)?then("selected", "")}"
47 href="${modulesJSONObject.url}"
48 style="display: flex; justify-content: space-between;"
49 >
50 <div class="nav-item-number-title">
51 <div>
52 <span class="course-module-number ${(moduleLessonIsSelected)?then("highlighted", "")}">${i+1}</span>
53 </div>
54
55 <span class="course-module-title">${modulesJSONObject.getString("title")}</span>
56 </div>
57 </div>
58
59 <span class="collapse-icon-closed">
60 <svg
61 class="lexicon-icon lexicon-icon-angle-right"
62 role="presentation"
63 >
64 <use xlink:href="/o/admin-theme/images/clay/icons.svg#angle-right" />
65 </svg>
66 </span>
67 <span class="collapse-icon-open">
68 <svg
69 class="lexicon-icon lexicon-icon-angle-down"
70 role="presentation"
71 >
72 <use xlink:href="/o/admin-theme/images/clay/icons.svg#angle-down" />
73 </svg>
74 </span>
75 </li>
76 </span>
77 </button>
78
79 <div class="panel-collapse collapse ${(moduleLessonIsSelected)?then("show", "")}" id="collapsePanel${i}">
80 <div class="panel-body">
81 <#list lessonsJSONArray as lesson>
82 <div class="container-lesson ${(navigationJSONObject.getJSONObject("self").url == lesson.url)?then("selected", "")}">
83 <div class="course-module-transparent" />
84
85 <a href="${lesson.url}">${lesson.title}</a>
86 </div>
87 </#list>
88 </div>
89 </div>
90 </div>
91 </div>
92 </div>
93 </#list>
94 </ul>
95 </#if>
96 </div>
97</div>
98
99<script>
100 function togglePanel(button) {
101 button.setAttribute('aria-expanded', button.getAttribute('aria-expanded') === 'true' ? 'false' : 'true');
102
103 const courseModuleNumber = button.querySelector('.course-module-number');
104
105 courseModuleNumber.classList.toggle('highlighted');
106
107 const liferayNavItem = button.querySelector('.liferay-nav-item');
108
109 liferayNavItem.classList.toggle('highlightedNavItem');
110 }
111</script>
Introduction
15 min
In today’s digital market, businesses need to provide users with engaging, personalized online experiences that distinguish their brand and drive conversions. Liferay DXP provides a comprehensive environment for business teams and developers to efficiently build enterprise websites at scale. With low-code capabilities and a user-friendly editor, Liferay’s flexible platform simplifies and optimizes site development. You can also leverage Liferay to unify your technical infrastructure and enable seamless integration with existing systems.
In this course you’ll learn how to build enterprise websites with Liferay following best practices. While this course primarily focuses on the needs of Enterprise Websites, many of the following capabilities and use cases also apply to other solutions. Programming knowledge is not needed, but an understanding of HTML, CSS, Javascript, and templating languages like FreeMarker would be helpful.
Given the breadth and depth of Liferay features and configurations, it is impossible to cover every detail necessary for building a production ready website. However, this course will equip you with the knowledge and skills necessary to tackle real-world problems and create solutions with Liferay.
To bridge the gap between theory and practice, this course will lead you through building an enterprise marketing website for a fictional company, Clarity Vision Solutions. Before diving into the technical aspects of Liferay DXP, we’ll introduce Clarity and outline what you’ll be building.
The following has evaluated to null or missing: ==> navigationJSONObject.getJSONArray("modules") [in template "17855804202317#32484267#LEARN-COURSE-INTRO-CONGRATS-BOTTOM-NAV" at line 7, column 23] ---- 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: firstModule = navigationJSONObject.ge... [in template "17855804202317#32484267#LEARN-COURSE-INTRO-CONGRATS-BOTTOM-NAV" at line 7, column 9] ----
1<#assign
2 currentURL = themeDisplay.getURLCurrent()
3 groupPathFriendlyURLPublic = themeDisplay.getPathFriendlyURLPublic() + themeDisplay.getScopeGroup().getFriendlyURL()
4 hrefLink = ""
5 navigationJSONObject = jsonFactoryUtil.createJSONObject(navigation.getData())
6
7 firstModule = navigationJSONObject.getJSONArray("modules").getJSONObject(0)
8/>
9
10<#if currentURL?contains("congratulations")>
11 <#assign hrefLink = "/education/courses/index" />
12<#else>
13 <#assign hrefLink = firstModule.url?html />
14</#if>
15
16<ul class="m-0 p-2">
17 <li class="course-bottom-nav-item">
18 <a class="d-flex justify-content-between" ${(navigationJSONObject.getJSONObject("self").url == firstModule.url)?then("selected", "")} href="${hrefLink}">
19 <#if currentURL?contains("congratulations")>
20 <div>
21 <span>View All Available Courses</span>
22 </div>
23 <#else>
24 <div>
25 <span class="course-bottom-nav-cta">Start the Course!</span>
26 <span>${firstModule.getString("title")}</span>
27 </div>
28 </#if>
29
30 <svg fill="none" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
31 <mask height="10" id="right_arrow" maskUnits="userSpaceOnUse" style="mask-type:alpha" width="19" x="2" y="7">
32 <path d="M16.8645 16.4842L20.2207 13.1279C20.727 12.5701 20.7457 11.5858 20.2207 10.9811L16.8645 7.62482C15.2895 6.22795 13.3535 8.36545 14.7176 9.7717L15.5004 10.5545H4.11914C2.12695 10.5545 2.12695 13.5545 4.11914 13.5545H15.5004L14.7176 14.3373C13.316 15.8279 15.416 17.8764 16.8645 16.4842Z" fill="#6B6C7E" />
33 </mask>
34
35 <g mask="url(#right_arrow)">
36 <rect fill="white" height="24" width="24" />
37 </g>
38 </svg>
39 </a>
40 </li>
41</ul>
Capabilities
Product
Contact Us