Notícias em Destaque
The following has evaluated to null or missing:
==> configuration [in template "76143552151047#20120#140471" at line 58, column 59]
----
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 badgeClass = "badge-" + (conf... [in template "76143552151047#20120#140471" at line 58, column 25]
----
1<#assign
2 assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")
3 groupLocalService = serviceLocator.findService("com.liferay.portal.kernel.service.GroupLocalService")
4 groupFriendlyURL = groupLocalService.getGroup(themeDisplay.getSiteGroupId()).getFriendlyURL()
5/>
6
7<#-- <#function getJournalFieldValue key locale=locale>
8 <#local field = DDMFormFieldsReferencesMap[key].name />
9 <#return DDMFormFieldValuesMap[field][0].getValue().getString(locale)!"" />
10</#function> -->
11<#function getJournalFieldValue key locale=locale>
12 <#attempt>
13 <#local field = DDMFormFieldsReferencesMap[key].name />
14 <#return DDMFormFieldValuesMap[field][0].getValue().getString(locale)!"" />
15 <#recover>
16 <#return "" />
17 </#attempt>
18</#function>
19
20<div class="latest-news-carosel-template swiper carousel py-1 pb-md-5 pb-4 pb-md-0">
21 <div class="swiper-wrapper py-4" id="swiperWrapper">
22 <#if entries?has_content>
23 <#list entries as entry>
24 <#assign
25 asset = assetEntryLocalService.getEntry(entry.getClassName(), entry.getClassPK())
26 categoriesNames = asset.getCategories()?map(c -> c.getTitle(locale))
27 assetRenderer = asset.getAssetRenderer()
28 DDMFormFieldValuesMap = assetRenderer.getDDMFormValuesReader().getDDMFormValues().getDDMFormFieldValuesMap()
29 DDMFormFieldsReferencesMap = assetRenderer.article.DDMStructure.DDMForm.getDDMFormFieldsReferencesMap(true)
30
31 title = entry.getTitle(locale)
32 subtitle = getJournalFieldValue("subtitle", locale)
33 displayPageURL = "/web" + groupFriendlyURL + "/w/" + assetRenderer.getUrlTitle()
34 imageJSON = jsonFactoryUtil.createJSONObject(getJournalFieldValue("image", locale)!"{}")
35 imageUrl = imageJSON.url
36 imageAlt = imageJSON.alt
37 category = ""
38 />
39
40 <#if entry.getCategories()?has_content>
41 <#assign
42 category = entry.getCategories()[0]
43 categoryTitle = category.getTitle(locale)
44 rawDescription = (category.getDescription(locale, true))!""
45 />
46
47 <#if !rawDescription?has_content>
48 <#assign rawDescription = (category.getDescriptionCurrentValue())!"" />
49 </#if>
50 <#assign cleanedDescription = rawDescription?replace(r"(?is)<[^>]*>", "", "r")?trim />
51 <#assign classFromDesc = cleanedDescription?replace(r"[^A-Za-z0-9_\- ]", "", "r")?trim />
52
53 <#if categoryTitle?lower_case == "minuto asserj">
54 <#assign badgeClass = "badge-minuto-asserj" />
55 <#elseif classFromDesc?has_content>
56 <#assign badgeClass = classFromDesc />
57 <#else>
58 <#assign badgeClass = "badge-" + (configuration.badgeColor!"primary") />
59 </#if>
60 <#else>
61 <#assign category = "" />
62 <#assign categoryTitle = "" />
63 <#assign badgeClass = "" />
64 </#if>
65
66 <div class="swiper-slide">
67 <div class="cover-card position-relative h-100 w-100 rounded-xxl overflow-hidden">
68 <a href="${displayPageURL}">
69 <img class="position-absolute h-100 w-100"
70 src="${imageUrl}"
71 alt="${imageAlt}"
72 />
73 <div class="h-100 w-100 p-4 card-content d-flex flex-column justify-content-between">
74 <#if category?has_content && category != "">
75 <span class="badge ${badgeClass}">
76 <p>${category.getTitle(locale)}</p>
77 </span>
78 </#if>
79 <div class="d-flex flex-column mt-auto">
80 <h5 class="text-white">
81 ${title}
82 </h5>
83 </div>
84 </div>
85 </a>
86 </div>
87 </div>
88 </#list>
89 </#if>
90 </div>
91
92 <div class="swiper-pagination"></div>
93 <div class="swiper-button-prev d-md-none d-none"></div>
94 <div class="swiper-button-next d-md-none d-none"></div>
95</div>
96
97<style>
98
99 .badge-minuto-asserj {
100 background-color: #FFC0CB !important;
101 color: #C71585 !important;
102 }
103
104 .latest-news-carosel-template .cover-card {
105 height: 28rem !important;
106 }
107
108 .latest-news-carosel-template .cover-card .card-content h5 {
109 -webkit-line-clamp: 5;
110 }
111
112 .latest-news-carosel-template .swiper-pagination-bullet {
113 background: var(--white) !important;
114 opacity: unset;
115 height: 1rem;
116 width: 1rem;
117 }
118
119 .latest-news-carosel-template .swiper-pagination-bullet-active {
120 background: #0E7DC2 !important;
121 }
122
123 .latest-news-carosel-template .swiper-pagination-bullet {
124 width: 1rem !important;
125 height: 1rem !important;
126 }
127
128 .latest-news-carosel-template .swiper-pagination-bullet-active {
129 width: 2rem !important;
130 height: 1rem !important;
131 border-radius: 1rem !important;
132 }
133</style>
134
135<script>
136 (async function () {
137 const Global = await import("Global");
138 const templateElement = document.querySelector(
139 ".latest-news-carosel-template"
140 );
141
142 // Remove news that already exists in the featured grid
143 const existingTitles = new Set();
144 document
145 .querySelectorAll(".news-highlight-grid .cover-card h5")
146 .forEach((el) => {
147 const text = el.textContent.trim().toLowerCase();
148 if (text) existingTitles.add(text);
149 });
150
151 const slides = templateElement.querySelectorAll(".swiper-slide");
152
153 slides.forEach((slide) => {
154 const titleElement = slide.querySelector(".cover-card h5");
155 const titleText = titleElement?.textContent?.trim().toLowerCase();
156
157 if (!titleText) return;
158
159 if (existingTitles.has(titleText)) {
160 slide.remove();
161 }
162 });
163
164 let swiper = new Global.Swiper(templateElement, {
165 slidesPerView: 4,
166 spaceBetween: 30,
167 loop: true,
168 pagination: {
169 el: ".latest-news-carosel-template .swiper-pagination",
170 clickable: true,
171 },
172 breakpoints: {
173 0: { slidesPerView: 1, spaceBetween: 10 },
174 768: { slidesPerView: 2, spaceBetween: 15 },
175 992: { slidesPerView: 3, spaceBetween: 20 },
176 1200: { slidesPerView: 4, spaceBetween: 30 },
177 },
178 });
179 })();
180</script>
Revista Super Negócios
Edição #85 • Agosto 2026
Edição #83 • Junho 2026
Principais Editorias
MATÉRIA DE CAPA
Compras com menos impulso e mais escolhas inteligentes
Pág. 12
SUPER PAPO
Insights sobre o futuro do varejo na ótica de Lucas Daibert
Pág. 28
BOAS VENDAS
Copa do Mundo Feminina no Brasil: tendências e expectativas de vendas para 2027
Pág. 86
CADERNO ESPECIAL
O poder das marcas próprias para os supermercados
Pág. 44
Principais Editorias
MATÉRIA DE CAPA
Supermercadistas, vocês têm a mídia nas mãos!
Pág. 10
Super papo
IA, hiperpersoanlização e loja física
Pág. 20
BOAS VENDAS
Bebidas zero álcool quebraram tabus
Pág. 70
CADERNO ESPECIAL
Investir em Gerenciamento de Categoria é preciso
Pág. 36
Soluções da ASSERJ
Super Negócios
O Mercado em Revista
ASSERJ Experience
Quem sabe vende ao vivo!
Seminário Super Negócios
Sua marca frente a frente com decisores do varejo!
SRE Super Rio Expofood
O melhor e mais inovador evento de negócios das Américas!
Já é associado?
Visite a página de benefícios e começa a usufruir de tudo.
Associe-se à ASSERJ
Escola ASSERJ
Noções básicas de higiene e Manipulação de Alimentos
Como Maximizar Resultados com o Mix Ideal
Depoimentos dos Nossos Associados
Faça Parte da Nossa Comunidade
associação de supermercados do Estado do Rio de Janeiro