An error occurred while processing the template.
The following has evaluated to null or missing: ==> article.getDisplayDate() [in template "16924578#16924624#30950" at line 62, column 55] ---- Tip: If the failing expression is known to be 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: ${article.getDisplayDate()?string["MM... [in template "16924578#16924624#30950" at line 62, column 53] ----
1<#assign journalArticleId = .vars['reserved-article-id'].data>
2
3<#assign JournalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService")>
4<#assign AssetCategoryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetCategoryLocalService")>
5<#assign AssetVocabularyLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetVocabularyLocalService")>
6<#assign AssetTagLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetTagLocalService")>
7<#assign AssetEntryLocalService = serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService")>
8<#assign DLAppLocalService = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppLocalService")>
9<#assign ImageToolUtil = serviceLocator.findService("com.liferay.portal.kernel.image.ImageToolUtil")>
10
11<#assign blogVocabulary = AssetVocabularyLocalService.getGroupVocabulary(groupId, "Blog")>
12
13<#if separator.getSiblings()?has_content>
14 <#list separator.getSiblings() as separatorField>
15
16 <#assign postTitle = separatorField.title.getData() >
17
18 <#if separatorField.intro?? && separatorField.intro.getData()?has_content>
19 <#assign postIntro = separatorField.intro.getData() >
20 </#if>
21 <#if separatorField.image.getData()?has_content>
22 <#assign postImage = separatorField.image.getData() >
23 </#if>
24 <#if separatorField.youtubeInsertionCode?? && separatorField.youtubeInsertionCode.getData()?has_content>
25 <#assign postYoutubeInsertionCode = separatorField.youtubeInsertionCode.getData() >
26 </#if>
27 <#assign postContent = separatorField.content.getData() >
28
29 <#-- Recuperamos el web content -->
30 <#assign article = JournalArticleLocalService.fetchArticle(groupId, journalArticleId)>
31
32 <#-- Recuperamos las categorías del web content -->
33 <#assign articleCategories = AssetCategoryLocalService.getCategories("com.liferay.journal.model.JournalArticle", article.getResourcePrimKey())>
34
35 <#-- Recuperamos los tags del web content -->
36 <#assign articleTags = AssetTagLocalService.getTags("com.liferay.journal.model.JournalArticle", article.getResourcePrimKey())>
37
38 <div id="main">
39 <article id="post-${journalArticleId}" class="post-${journalArticleId} post type-post status-publish format-standard hentry">
40
41 <div class="post-header">
42 <span class="cat">
43 <#if articleCategories?has_content>
44 <#list articleCategories as articleCategory>
45 <#-- Categorías del vocabulario Blog -->
46 <#if articleCategory.getVocabularyId() == blogVocabulary.getVocabularyId() >
47 <#assign categoryName = articleCategory.getName()?upper_case />
48 <#assign categoryID = articleCategory.getCategoryId() />
49 <#assign categoryURL = '/cat/-/categories/' + categoryID />
50 <a href="${categoryURL}" rel="category tag">${categoryName}</a>
51 </#if>
52 </#list>
53 </#if>
54 </span>
55
56 <h1>${postTitle}</h1>
57 <span class="title-divider"></span>
58 <span class="post-date">
59 <#if (locale == "es_ES") >
60 <span class="post-date">${article.getDisplayDate()?string["dd/MM/yyyy"]}</span>
61 <#else>
62 <span class="post-date">${article.getDisplayDate()?string["MM/dd/yyyy"]}</span>
63 </#if>
64 </span>
65
66 <#if postIntro?? >
67 <div class="post-entry-intro">
68 ${postIntro}
69 </div>
70 </#if>
71 </div>
72
73 <#if postYoutubeInsertionCode?? && (postYoutubeInsertionCode?length > 10) >
74 <div class="embed-container">${postYoutubeInsertionCode}</div>
75 <#elseif postImage?? >
76 <#assign parts = stringUtil.split(postImage, "/")>
77 <#assign parts = stringUtil.split(parts?last, "?")>
78 <#assign uuid = parts[0]>
79 <#assign fileEntry = DLAppLocalService.getFileEntryByUuidAndGroupId(uuid, groupId)>
80 <#assign fileEntryContentStrean = fileEntry.getContentStream()>
81 <#assign image = ImageToolUtil.getImage(fileEntryContentStrean)>
82 <#assign imageWidth = image.width >
83 <#assign imageHeight = image.height >
84 <#assign srcset = "" >
85 <#assign sizes = ", " + imageWidth + "px" >
86 <#assign useResponsiveImages = false >
87
88
89 <#if separatorField.image.responsiveImage?? >
90 <#if separatorField.image.responsiveImage.getSiblings()?has_content>
91 <#list separatorField.image.responsiveImage.getSiblings() as responsiveImageField>
92 <#assign responsiveImageData = responsiveImageField.getData() >
93
94 <#if responsiveImageData?has_content >
95 <#assign respParts = stringUtil.split(responsiveImageData, "/")>
96 <#assign respParts = stringUtil.split(respParts?last, "?")>
97 <#assign respUuuid = respParts[0]>
98 <#assign respFileEntry = DLAppLocalService.getFileEntryByUuidAndGroupId(respUuuid, groupId)>
99 <#assign respFileEntryContentStrean = respFileEntry.getContentStream()>
100 <#assign respImage = ImageToolUtil.getImage(respFileEntryContentStrean)>
101 <#assign respImageWidth = respImage.width >
102 <#assign srcset = srcset + responsiveImageData + " " + respImageWidth + "w " >
103 <#assign sizes = sizes + ", " + respImageWidth + "px" >
104 <#assign useResponsiveImages = true >
105 </#if>
106 </#list>
107 </#if>
108 </#if>
109
110 <#if useResponsiveImages >
111 <div class="post-img">
112 <img src="${postImage}" class="attachment-full-thumb size-full-thumb wp-post-image" srcset="${srcset}" sizes="(max-width: ${imageWidth}px) 100vw${sizes}" width="${imageWidth}" height="${imageHeight}">
113 </div>
114 <#else>
115 <div class="post-img">
116 <img src="${postImage}" class="attachment-full-thumb size-full-thumb wp-post-image">
117
118 </div>
119 </#if>
120
121 </#if>
122
123 <div class="post-entry">
124 <div class="post-entry-content">
125 ${postContent}
126 </div>
127
128 <#if articleTags?has_content>
129 <div class="post-tags">
130 <#list articleTags as articleTag>
131 <#assign tagName = articleTag.getName()?upper_case />
132 <#assign tagURL = '/tag/-/tag/' + tagName />
133 <a href="${tagURL}" rel="tag">${tagName}</a>
134 </#list>
135 </div>
136 </#if>
137
138 </div>
139
140 <div class="post-share">
141
142 <#assign serviceContext = staticUtil["com.liferay.portal.kernel.service.ServiceContextThreadLocal"].getServiceContext()>
143 <#assign themeDisplay = serviceContext.getThemeDisplay() />
144 <#assign currentUrl = themeDisplay.getPortalURL() + themeDisplay.getURLCurrent() />
145
146 <div class="post-share-box share-buttons">
147 <a target="_blank" href="https://www.facebook.com/sharer/sharer.php?u=${currentUrl}">
148 <i class="fa fa-facebook"></i>
149 </a>
150 <a target="_blank" href="https://twitter.com/intent/tweet?text=Check%20out%20this%20article:%20${postTitle}&url=${currentUrl}">
151 <i class="fa fa-twitter"></i>
152 </a>
153 <a target="_blank" href="https://www.linkedin.com/shareArticle?mini=true&url=${currentUrl}&title=${postTitle}">
154 <i class="fa fa-linkedin"></i>
155 </a>
156<!--
157 <#if postImage??>
158 <#assign pinterestImageUrl = themeDisplay.getPortalURL() + postImage />
159 <a data-pin-do="none" target="_blank" href="https://pinterest.com/pin/create/button?url=${currentUrl}&media=${pinterestImageUrl}&description=${postTitle}">
160 <i class="fa fa-pinterest"></i>
161 </a>
162 </#if>
163 <a target="_blank" href="https://plus.google.com/share?url=${currentUrl}">
164 <i class="fa fa-google-plus"></i>
165 </a>
166-->
167 </div>
168 </div>
169
170 <#-- Buscamos artículos relacionados por la primera categoría -->
171 <#if articleCategories?has_content>
172 <#list articleCategories as articleCategory>
173 <#-- Categorías del vocabulario Blog -->
174 <#if articleCategory.getVocabularyId() == blogVocabulary.getVocabularyId() >
175 <#assign category = articleCategory >
176 <#break>
177 </#if>
178 </#list>
179
180 <#assign assetEntries = AssetEntryLocalService.getAssetCategoryAssetEntries(category.getCategoryId()) >
181 <#if assetEntries?has_content>
182 <div class="post-related">
183 <div class="post-box">
184 <h4 class="post-box-title">
185 <#if (locale == "es_ES") >
186 <span>También podría gustarte</span>
187 <#else>
188 <span>You may also like</span>
189 </#if>
190 </h4>
191 </div>
192
193 <#--<div class="row"> -->
194
195 <#-- #assign relatedAssetEntries = assetEntries?reverse?chunk(4)?first -->
196 <#assign relatedAssetEntries = assetEntries?reverse >
197
198 <#if relatedAssetEntries?has_content>
199 <#assign counter = 0 >
200 <#list relatedAssetEntries as relatedAssetEntry>
201 <#if relatedAssetEntry.getClassPK() != article.getResourcePrimKey() && relatedAssetEntry.getVisible() >
202 <#assign relatedArticle = JournalArticleLocalService.fetchLatestArticle (relatedAssetEntry.getClassPK()) >
203 <#if relatedArticle.getDDMStructureKey() == article.getDDMStructureKey() >
204
205 <#-- Recuperamos la url de visualización del artículo -->
206 <#assign relatedArticleURL = '/-/' + relatedArticle.getUrlTitle() />
207
208 <#-- Extraemos los campos del web content recorriendo su estructura -->
209 <#assign document = saxReaderUtil.read(relatedArticle.getContent()) />
210 <#assign rootElement = document.getRootElement() />
211 <#assign xPathSelector = saxReaderUtil.createXPath("dynamic-element[@name='separator']") >
212 <#list xPathSelector.selectNodes(rootElement) as separatorNode>
213 <#assign titleXPathSelector = saxReaderUtil.createXPath("dynamic-element[@name='title']") >
214 <#list titleXPathSelector.selectNodes(separatorNode) as title>
215 <#assign relatedArticleTitle = title.getStringValue() />
216 </#list>
217 <#assign imageXPathSelector = saxReaderUtil.createXPath("dynamic-element[@name='image']") >
218 <#list imageXPathSelector.selectNodes(separatorNode) as image>
219 <#if image.getData()?has_content >
220 <#assign relatedArticleImage = image.getStringValue()?trim />
221 </#if>
222 </#list>
223 </#list>
224
225 <#-- <div class="col-xs-12 col-lg-4"> -->
226 <div class="item-related">
227 <#if relatedArticleImage?has_content >
228 <a href="${relatedArticleURL}"><img src="${relatedArticleImage}" class="attachment-misc-thumb size-misc-thumb wp-post-image" alt="" width="520" height="400"></a>
229 </#if>
230
231 <h3>
232 <a href="${relatedArticleURL}">${relatedArticleTitle}</a>
233 </h3>
234
235 <#if (locale == "es_ES") >
236 <span class="date">${relatedArticle.getDisplayDate()?string["dd/MM/yyyy"]}</span>
237 <#else>
238 <span class="date">${relatedArticle.getDisplayDate()?string["MM/dd/yyyy"]}</span>
239 </#if>
240
241 </div>
242 <#-- </div> -->
243
244 <#assign counter = counter + 1 >
245 </#if>
246 </#if>
247
248 <#if counter == 3>
249 <#break>
250 </#if>
251 </#list>
252 </#if>
253 <#--</div> -->
254 </div>
255 </#if>
256 </#if>
257 </article>
258 </div>
259 </#list>
260</#if>