Controlled vocabularies

Controlled vocabularies provide a consistent way to describe data. They are standardized and organized arrangements of words and phrases presented as alphabetical lists of terms or as thesauri and taxonomies with a hierarchical structure of broader and narrower terms.
Při zpracování šablony došlo k chybě.
The following has evaluated to null or missing:
==> curEntry.getAssetRenderer().getArticle [in template "10157#10197#6686865" at line 10, column 54]
----
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: #assign docXml = saxReaderUtil.read(c... [in template "10157#10197#6686865" at line 10, column 17]
----
1<#assign liferay_ui = PortletJspTagLibs["/META-INF/liferay-ui.tld"] />
2<div class="container bc-page card-content-t-1">
3<div class="row">
4
5 <#list entries as curEntry>
6 <#assign curEntry = curEntry />
7 <#assign assetRenderer = curEntry.getAssetRenderer() />
8 <#assign className = assetRenderer.getClassName() >
9
10 <#assign docXml = saxReaderUtil.read(curEntry.getAssetRenderer().getArticle().getContent()) />
11 <#assign rootElement = docXml.getRootElement() />
12 <#assign availableLocales = rootElement.attribute("available-locales").getText() />
13 <#assign defaultLocale = rootElement.attribute("default-locale").getText() />
14
15
16 <#if (availableLocales?contains(locale)) >
17 <#assign CardTitle = docXml.valueOf("//dynamic-element[@name='CardTitle']/dynamic-content[@language-id='"+locale+"']/text()") />
18 <#assign CardDescription = docXml.valueOf("//dynamic-element[@name='CardDescription']/dynamic-content[@language-id='"+locale+"']/text()") />
19 <#assign LearnMoreLink = docXml.valueOf("//dynamic-element[@name='LearnMoreLink']/dynamic-content[@language-id='"+locale+"']/text()") />
20 <#else>
21 <#assign CardTitle = docXml.valueOf("//dynamic-element[@name='CardTitle']/dynamic-content[@language-id='"+defaultLocale+"']/text()") />
22 <#assign CardDescription = docXml.valueOf("//dynamic-element[@name='CardDescription']/dynamic-content[@language-id='"+defaultLocale+"']/text()") />
23 <#assign LearnMoreLink = docXml.valueOf("//dynamic-element[@name='LearnMoreLink']/dynamic-content[@language-id='"+defaultLocale+"']/text()") />
24 </#if>
25
26 <#assign LearnMoreLink = docXml.valueOf("//dynamic-element[@name='LearnMoreLink']/dynamic-content[@language-id='"+defaultLocale+"']/text()") />
27
28 <div class="col-xl-4 col-md-6 col-sm-12 card-content-page d-flex">
29 <div class="card flex-fill" onclick="document.location='${LearnMoreLink}'">
30 <div class="card-header bg-transparent">${CardTitle}</div>
31 <div class="card-body">
32 ${CardDescription}
33 </div>
34 <div class="card-footer bg-transparent"><a aria-label="Learn more about ${CardTitle}" href="${LearnMoreLink}">Learn more</a><i class="arrow right"></i></div>
35 </div>
36 </div>
37 </#list>
38
39</div>
40</div>
41
42<style>
43.portlet-asset-publisher {
44 height: auto;
45}
46.container.bc-page .card-body p {
47 margin: 0;
48 color: #666666;
49 line-height: 1.5;
50}
51
52.container.bc-page .card-body {
53 flex: 1 1 auto;
54 margin: 0.5rem 1.25rem 3.75rem 1.25rem;
55 padding: 0;
56 height: 100px;
57 display: -webkit-box;
58 -webkit-line-clamp: 5;
59 -webkit-box-orient: vertical;
60 overflow: hidden;
61 text-overflow: ellipsis;
62}
63.container.bc-page .card{
64 min-height: unset;
65 cursor: pointer;
66}
67.container.bc-page .card:hover{
68 border: 1px solid #5599FF;
69 box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.1);
70}
71.container.bc-page .card-header {
72 font-size: 16px;
73 line-height: 23px;
74 color: #112250;
75 font-weight: bold;
76 margin: 0.75rem 0 0 0;
77 padding: 0 1.25rem;
78 border-bottom: 0;
79}
80.card-footer {
81 position: absolute;
82 width: 100%;
83 bottom: 0;
84}
85.card-footer a{
86 font-weight: bold;
87}
88
89</style>