Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing: ==> assetEntry.getCategories()[0] [in template "76908261436272#20123#526167" at line 22, 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 categoria = assetEntry.getCat... [in template "76908261436272#20123#526167" at line 22, column 25] ----
1<#assign _assetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
2<#assign _assetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService") />
3
4<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
5<div class="mpsc-conteudo-results">
6 <p class="texto-search-result">Foram encontrados <span>${searchContainer.getTotal()}</span> resultado(s).</p>
7 <#if entries?has_content>
8 <#list entries as entry>
9 <#assign assetEntry = _assetEntryLocalService.fetchEntry(entry.getClassName(), entry.getClassPK()) />
10 <#assign content = assetEntry.getAssetRenderer().getArticle().getContent() />
11 <#assign docXML = saxReaderUtil.read(content?string) />
12 <#assign imgConteudo = docXML.selectSingleNode("/root/dynamic-element[@field-reference='thumbnail']/dynamic-content").getStringValue() />
13 <#assign jsonConteudo = imgConteudo?eval />
14 <#assign urlConteudo = "/web/guest/w/" + assetEntry.getAssetRenderer().getUrlTitle() />
15 <#assign urlFacebook = "https://www.facebook.com/sharer/sharer.php?u=" + themeDisplay.getURLPortal()
16 + "/web/guest/w/" + assetEntry.getAssetRenderer().getUrlTitle() />
17 <#assign urlTwitter = "https://twitter.com/intent/tweet?url=" + themeDisplay.getURLPortal()
18 + "/web/guest/w/" + assetEntry.getAssetRenderer().getUrlTitle() />
19 <#assign titulo = entry.getTitle() />
20 <#assign descricao = assetEntry.getDescription(locale)/>
21 <#assign nodeAudio = docXML.selectSingleNode("/root/dynamic-element[@field-reference='audioConteudo']/dynamic-content") />
22 <#assign categoria = assetEntry.getCategories()[0] />
23 <#assign urlAudio = "" />
24
25 <#if nodeAudio?? && nodeAudio.getStringValue()?has_content>
26 <#attempt>
27 <#assign audioConteudo = nodeAudio.getStringValue()?eval />
28 <#assign urlAudio = "/documents/" + audioConteudo.groupId + "/" + audioConteudo.uuid />
29 <#recover>
30 <#assign urlAudio = "" />
31 </#attempt>
32 </#if>
33
34 <#assign dataConteudo = assetEntry.getAssetRenderer().getArticle().getCreateDate()/>
35
36 <div class="card-conteudo mb-2 pb-2">
37 <div class="img-conteudo">
38 <#if jsonConteudo.url?has_content>
39 <a href="${urlConteudo}"><img src="${jsonConteudo.url}"/></a>
40 <#else>
41 <a href="${urlConteudo}"><img src="/documents/d/guest/sonora-1"/></a>
42 </#if>
43 </div>
44 <div class="texto-conteudo">
45 <h3><a href="${urlConteudo}">${titulo}</a></h3>
46 <p class="texto-conteudo">${descricao}</p>
47 <div class="linha-conteudo">
48 <p class="data-conteudo">${dataConteudo?string("dd/MM/yyyy")} - Categoria: ${categoria.name}</p>
49
50 </div>
51 <div class="linha-conteudo">
52 <#if urlAudio?has_content>
53 <audio class="mr-2" src="${urlAudio}" controls></audio>
54 </#if>
55 <a href="${urlFacebook}" target="_blank" class="btn-social">
56 <i class="fa-brands fa-facebook facebook"></i> Facebook</a>
57 <a href="${urlTwitter}" target="_blank" class="btn-social">
58 <i class="fa-brands fa-twitter twitter"></i> Twitter</a>
59 </div>
60 </div>
61 </div>
62 </#list>
63 <#else>
64 <h2>Não há conteúdos com esse filtro selecionado.</h2>
65 </#if>
66</div>
67
68<style>
69 .mpsc-conteudo-results{
70 display: flex;
71 flex-direction: column;
72 }
73
74 .card-conteudo {
75 display: flex;
76 align-items: flex-start;
77 gap: 20px;
78 border-bottom: 1px solid #ddd;
79 padding: 15px 0;
80 font-family: "Open Sans", sans-serif;
81 }
82
83 .img-conteudo img {
84 width: 160px;
85 height: auto;
86 object-fit: contain;
87 border-radius: 6px;
88 }
89
90 .texto-conteudo h3 a {
91 font-size: 20px;
92 margin: 0 0 10px;
93 color: #333;
94 }
95
96 .data-conteudo{
97 font-size: 13px;
98 margin-right: 15px;
99 color: #999;
100 }
101
102 .texto-conteudo h3 a:hover{
103 text-decoration:none;
104 }
105
106 .texto-conteudo p{
107 color: #999;
108 font-size: 14px;
109 margin: 0 0 10px;
110 }
111
112 .texto-conteudo div{
113 color: #999;
114 font-size: 14px;
115 }
116
117 .texto-search-result {
118 color: #999;
119 font-size: 15px;
120 margin: 0 0 10px;
121 }
122
123 .texto-search-result span {
124 font-weight: 700;
125 }
126
127 .texto-conteudo div li a{
128 color: #999;
129 font-size: 14px;
130 }
131
132 .linha-conteudo {
133 margin-top: 10px;
134 display: flex;
135 align-items: center;
136 }
137
138 .btn-social {
139 display: inline-block;
140 margin-right: 8px;
141 padding: 4px 8px;
142 background-color: #efefef;
143 border: 1px solid #ddd;
144 font-family: "Open Sans", sans-serif;
145 font-size: 12px;
146 color: #333;
147 border-radius: 3px;
148 text-decoration: none;
149 }
150
151 .btn-social:hover{
152 text-decoration: none;
153 color: #333;
154 }
155
156 .facebook {
157 color: #3b5998;
158 }
159
160 .twitter {
161 color: #1da1f2;
162 }
163
164 li{
165 color: #999;
166 }
167
168 li::marker{
169 color:#5fa01f;
170 }
171
172 @media (max-width: 900px) {
173 .card-conteudo{
174 flex-direction: column;
175 }
176 }
177
178 @media (min-width: 1024px) {
179 .mpsc-conteudo-results{
180 padding-right: 10px;
181 }
182 }
183</style>