Pogosta vprašanja o načinih plačila
Prišlo je do napake pri odpiranju teme.
Java method "com.sun.proxy.$Proxy1381.getArticle(long, String)" threw an exception when invoked on com.sun.proxy.$Proxy1381 object "com.liferay.journal.service.impl.JournalArticleLocalServiceImpl@e56be6e"; see cause exception in the Java stack trace.
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign accordion_article = journalAr... [in template "20099#20125#508371" at line 104, column 11]
----
1<#assign theme_css_path = themeDisplay.getPathThemeCss() />
2
3<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
4<#assign group_id = getterUtil.getLong(themeDisplay.getScopeGroupId()) />
5
6<#assign accordion_categories = [] />
7
8<#if entries?has_content>
9 <#list entries as curEntry>
10 <#assign categories = curEntry.getCategories() />
11
12 <#list categories as curCategory>
13 <#assign categoryName = curCategory.getName()?trim />
14 <#if !accordion_categories?seq_contains(curCategory)>
15 <#assign accordion_categories += [curCategory] />
16 </#if>
17 </#list>
18 </#list>
19</#if>
20
21${portletDisplay.setShowPortletCssIcon(true)}
22
23<#assign show_custom_title = false />
24
25<#assign portlet_preferences = portletDisplay.getPortletSetup() />
26<#assign portlet_preferences_map = portlet_preferences.getMap() />
27
28<#if portlet_preferences_map?? && portlet_preferences_map["portletSetupUseCustomTitle"]??>
29 <#assign VOID = portlet_preferences.setValue("portletSetupUseCustomTitle", "false") />
30 <#assign show_custom_title = portlet_preferences_map["portletSetupUseCustomTitle"][0]?boolean />
31</#if>
32
33<#assign is_asset_accordion = true />
34
35<#list portletPreferences as key, value_sequence>
36 <#if key == "anyAssetType" && value_sequence[0] == "true">
37 <#assign is_asset_accordion = false />
38 </#if>
39</#list>
40
41<#if entries?has_content>
42 <#assign assetRenderer = entries[0].getAssetRenderer() />
43 <#assign className = assetRenderer.getClassName() />
44
45 <#if className == "com.liferay.journal.model.JournalArticle">
46 <#assign assetClassTypeId = entries[0].getClassTypeId() />
47
48 <#assign DDMStructureLocalServiceUtil = staticUtil["com.liferay.dynamic.data.mapping.service.DDMStructureLocalServiceUtil"] />
49
50 <#assign structure = DDMStructureLocalServiceUtil.getStructure(assetClassTypeId) />
51 <#assign structure_name = structure.getName(locale)?trim?upper_case />
52
53 <#if structure_name != "ACCORDION">
54 <#assign is_asset_accordion = false />
55 <#else>
56 <#assign available_templates = structure.getTemplates() />
57
58 <#list available_templates as template>
59 <#assign template_name = template.getName(locale)?trim />
60
61 <#if template_name == "Accordion - standard">
62 <#assign ddmTemplateKey = template.getTemplateKey() />
63 </#if>
64
65 </#list>
66 </#if>
67 <#else>
68 <#assign is_asset_accordion = false />
69 </#if>
70</#if>
71
72<#if is_asset_accordion>
73 <link rel="stylesheet" href="${theme_css_path}/components-standalone/badges-and-filters.css" />
74 <link rel="stylesheet" href="${theme_css_path}/components-standalone/accordion.css" />
75
76 <section class="container" id="accordion-list-${randomNamespace}">
77 <#if show_custom_title>
78 <h2 class="g-headline-2 text-center">${portletDisplay.getTitle()}</h2>
79 </#if>
80
81 <#if accordion_categories?has_content>
82 <div class="d-flex flex-wrap justify-content-center g-gap-2 mb-4" id="accordion-list-categories-${randomNamespace}">
83 <label class="g-filter g-filter--selected" data-category="vse">
84 <input type="checkbox" checked />
85 <span>Vse</span>
86 </label>
87 <#list accordion_categories as curCategory>
88 <#assign category_normalized = curCategory.getName()?replace("ž", "z")?replace("č", "c")?replace("ć", "c")?replace("đ", "d")?replace("š", "s")?replace("Ž", "z")?replace("Č", "c")?replace("Ć", "c")?replace("Đ", "d")?replace("Š", "s")?replace(" ", "-")?lower_case />
89 <label class="g-filter" data-category="${category_normalized}">
90 <input type="checkbox" />
91 <span>${curCategory.getName()}</span>
92 </label>
93 </#list>
94 </div>
95 </#if>
96
97 <div class="g-accordion-wrapper">
98 <#if entries?has_content>
99 <#list entries as curEntry>
100 <#assign assetRenderer = curEntry.getAssetRenderer() />
101 <#assign asset_object = assetRenderer.getAssetObject() />
102 <#assign accordion_article_id = asset_object.articleId />
103
104 <#assign accordion_article = journalArticleLocalService.getArticle(group_id, accordion_article_id) />
105
106 <#assign accordion_article_content = journalArticleLocalService.getArticleDisplay(group_id, accordion_article_id, ddmTemplateKey, "", locale, themeDisplay).getContent() />
107
108 ${accordion_article_content}
109 </#list>
110 </#if>
111 </div>
112 </section>
113
114
115
116 <script>
117 Liferay.on("allPortletsReady", function () {
118 const accordions = document.querySelectorAll("#accordion-list-${randomNamespace} div[data-category]");
119 const categorySelectors = document.querySelectorAll("#accordion-list-categories-${randomNamespace} label");
120 const vseButton = document.querySelector('#accordion-list-categories-${randomNamespace} label[data-category="vse"]');
121 const activeCategories = new Set(["vse"]);
122
123 const allCategories = new Set([
124 <#if accordion_categories?has_content>
125 <#list accordion_categories as curCategory>
126 <#assign category_normalized = curCategory.getName()?replace("ž", "z")?replace("č", "c")?replace("ć", "c")?replace("đ", "d")?replace("š", "s")?replace("Ž", "z")?replace("Č", "c")?replace("Ć", "c")?replace("Đ", "d")?replace("Š", "s")?replace(" ", "-")?lower_case />
127 "${category_normalized}",
128 </#list>
129 </#if>
130 ]);
131
132 allCategories.forEach(category => {
133 let counter = 0;
134
135 accordions.forEach(accordion => {
136 if(accordion.dataset.category.includes(category)) {
137 counter++;
138 }
139 });
140
141 const categorySelector = document.querySelector(`#accordion-list-categories-${randomNamespace} <#noparse>label[data-category="${category}"]</#noparse> span`);
142
143 <#-- fixing liferay duplicate categories bug -->
144 const categorySelectors = document.querySelectorAll(`#accordion-list-categories-${randomNamespace} <#noparse>label[data-category="${category}"]</#noparse> span`);
145
146 categorySelectors.forEach((cat, index) => {
147 if(index !== 0){
148 cat.parentNode.remove();
149 }
150 })
151
152
153 <#noparse>
154 categorySelector.innerHTML += ` (${counter})`;
155 </#noparse>
156 })
157
158 <#noparse>
159 function findAccordionsWithCategory(category) {
160 return document.querySelectorAll(`#accordion-list-${randomNamespace} div[data-category="${category}"]`).parentElement;
161 }
162 </#noparse>
163
164 function resetAccordions() {
165 accordions.forEach(accordion => {
166 accordion.classList.remove("d-none");
167 })
168 }
169
170 function showActiveCategoriesAccordions() {
171 accordions.forEach(accordion => {
172 const accordionCategories = accordion.dataset.category.split(",");
173 const found = accordionCategories.some(accordionCategory => activeCategories.has(accordionCategory));
174
175 if(found) {
176 accordion.classList.remove("d-none");
177 } else {
178 accordion.classList.add("d-none");
179 }
180 })
181 }
182
183 function uncheckAllFilter() {
184 activeCategories.delete("vse");
185 uncheckCategorySelector(vseButton);
186 }
187
188 function checkAllFilter() {
189 activeCategories.clear();
190 activeCategories.add("vse");
191 checkCategorySelector(vseButton);
192 resetAccordions();
193 }
194
195 function removeSelectedClassesFromCategorySelectors(categorySelectors) {
196 categorySelectors.forEach(categorySelector => {
197 removeActiveClassFromCategorySelector(categorySelector);
198 });
199 }
200
201 function addActiveClassToCategorySelector(button) {
202 button.classList.add("g-filter--selected");
203 }
204 function removeActiveClassFromCategorySelector(button) {
205 button.classList.remove("g-filter--selected");
206 }
207
208 function checkCategorySelector(button) {
209 addActiveClassToCategorySelector(button)
210 button.querySelector("input").checked = true;
211 }
212
213 function uncheckCategorySelector(button) {
214 removeActiveClassFromCategorySelector(button);
215 button.querySelector("input").checked = false;
216 }
217
218 function resetActiveCategories() {
219 removeSelectedClassesFromCategorySelectors(categorySelectors);
220 checkAllFilter();
221 }
222
223 function toggleActiveCategory(category, button) {
224 if(activeCategories.has(category)) {
225 activeCategories.delete(category);
226 uncheckCategorySelector(button);
227 } else {
228 activeCategories.add(category);
229 checkCategorySelector(button);
230 uncheckAllFilter();
231 }
232
233 if(activeCategories.size === 0) {
234 checkAllFilter();
235 }
236 }
237
238 categorySelectors.forEach(button => {
239 button.addEventListener("click", function(e) {
240 e.preventDefault();
241
242 if(button.dataset.category !== "vse") {
243 const buttonCategory = button.dataset.category;
244
245 toggleActiveCategory(buttonCategory, button);
246
247 if(!activeCategories.has("vse")) {
248 showActiveCategoriesAccordions();
249 }
250 } else {
251 resetActiveCategories();
252 }
253 })
254 })
255 });
256
257 </script>
258<#else>
259 <div class="container">
260 <div class="alert alert-danger">You're using "Accordions list with filter" template. Please choose Accordions as asset type!</div>
261 </div>
262</#if>