Wiki source code of Macros for the Blog application
Last modified by Jan Rhebergen on 2022/03/12 10:00
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | {{include reference="Blog.BlogParameters"/}} | ||
| 2 | |||
| 3 | {{velocity output="false"}} | ||
| 4 | ## | ||
| 5 | ## | ||
| 6 | ## | ||
| 7 | ## Import the blog skin and javascripts. | ||
| 8 | $!xwiki.ssx.use($blogStyleDocumentName)## | ||
| 9 | $!xwiki.jsx.use($blogScriptsDocumentName)## | ||
| 10 | ## | ||
| 11 | ## import the hierarchy for the path the blog post footer (in displayEntryBlogLocation) | ||
| 12 | #template('hierarchy_macros.vm')## | ||
| 13 | ## | ||
| 14 | ## | ||
| 15 | #** | ||
| 16 | * Prints a blog. This is the main macro used in the BlogSheet. | ||
| 17 | * | ||
| 18 | * @param blogDoc the XDocument holding the blog definition object. | ||
| 19 | *### | ||
| 20 | #macro(printBlog $blogDoc) | ||
| 21 | {{include reference='Blog.CreatePost'/}} | ||
| 22 | |||
| 23 | ## Use the blogPostList macro to display the blogposts | ||
| 24 | ## The blogPostList is used only in case of 'all' or 'paged' blog display type because the blogPostList macro | ||
| 25 | ## do not support FTM the monthly and weekly blog display types | ||
| 26 | #getBlogDisplayType($blogDoc $displayType) | ||
| 27 | #if ($displayType == 'weekly' || $displayType == 'monthly') | ||
| 28 | #getBlogEntries($blogDoc $entries) | ||
| 29 | #displayBlog($entries 'index' true true) | ||
| 30 | #displayNavigationLinks($blogDoc) | ||
| 31 | #else | ||
| 32 | #getBlogDisplayType($blogDoc $displayType) | ||
| 33 | #set ($paginated = 'no') | ||
| 34 | #if ($displayType == 'paginated') | ||
| 35 | #set ($paginated = 'yes') | ||
| 36 | #end | ||
| 37 | #getBlogPostsLayout($blogDoc $postsLayout) | ||
| 38 | (% class="hfeed index" %)((({{blogpostlist blog="$blogDoc.fullName.replaceAll('~', '~~').replaceAll('"', '~"')" paginated="$paginated" layout="$!postsLayout.replaceAll('~', '~~').replaceAll('"', '~"')" /}}))) | ||
| 39 | #end | ||
| 40 | #end | ||
| 41 | ## | ||
| 42 | ## | ||
| 43 | ## | ||
| 44 | #** | ||
| 45 | * Shows blog information. In view mode, the description is printed. In edit mode, allows changing blog settings: title, | ||
| 46 | * description, blog type (global or in-space), index display type (fixed size pagination, weekly index, monthly index, | ||
| 47 | * all entries). | ||
| 48 | * | ||
| 49 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 50 | *### | ||
| 51 | #macro(showBlogInfo $blogDoc) | ||
| 52 | #if($blogDoc.getObject($blogClassname)) | ||
| 53 | ## Keep testing for inline action for backward compatibility with older blogs. | ||
| 54 | #if($xcontext.action == 'edit' || $xcontext.action == 'inline') | ||
| 55 | #macro(displayProperty $blogDoc $propname) | ||
| 56 | ; #displayPropName($xwiki.getClass($blogClassname).get($propname)): | ||
| 57 | : $blogDoc.display($propname) | ||
| 58 | #end | ||
| 59 | #displayProperty($blogDoc 'title') | ||
| 60 | #displayProperty($blogDoc 'description') | ||
| 61 | #displayProperty($blogDoc 'displayType') | ||
| 62 | #displayProperty($blogDoc 'itemsPerPage') | ||
| 63 | #displayProperty($blogDoc 'postsLayout') | ||
| 64 | #displayProperty($blogDoc 'postsLayoutParameters') | ||
| 65 | #else | ||
| 66 | $blogDoc.display('description') | ||
| 67 | #end | ||
| 68 | #elseif($doc.fullName == $blogSheet) | ||
| 69 | = $services.localization.render('blog.code.blogsheet') = | ||
| 70 | {{translation key='blog.code.sheetexplanation'/}} | ||
| 71 | #else | ||
| 72 | {{warning}}{{translation key='blog.code.notblog'/}}{{/warning}} | ||
| 73 | #end | ||
| 74 | #end | ||
| 75 | ## | ||
| 76 | ## | ||
| 77 | ## | ||
| 78 | #** | ||
| 79 | * Retrieve the blog document, which usually is either <tt><Space>.WebHome</tt> for whole-spaces blogs, or | ||
| 80 | * <tt><Space>.Blog</tt> for in-space blogs. If none of these documents contains a blog object, then the first | ||
| 81 | * (alphabetically) document in the target space that contains one is returned. Finally, if no document in the current | ||
| 82 | * space contains a blog object, then <tt>Blog.WebHome</tt> is returned as the default blog. | ||
| 83 | * | ||
| 84 | * @param space A <tt>String</tt>, the name of the space where to search. | ||
| 85 | * @param blogDoc The resulting XDocument. | ||
| 86 | *### | ||
| 87 | #macro(getBlogDocument $space $blogDoc) | ||
| 88 | #set ($result = $NULL) | ||
| 89 | ## Check if the current space has a WebPreferences page that contains a Blog.EnablePanelsConfigurationClass object. | ||
| 90 | ## It is possible to display a blog's panels info in a page that is not inside a blog and in that case we need to | ||
| 91 | ## identify the right blog based on a configuration object in a WebPreferences page. | ||
| 92 | #set ($spaceReference = $services.model.resolveSpace($space)) | ||
| 93 | #set ($preferencesDocRef = $services.model.createDocumentReference('WebPreferences', $spaceReference)) | ||
| 94 | #set ($preferencesDoc = $xwiki.getDocument($preferencesDocRef)) | ||
| 95 | #set ($preferencesObj = $preferencesDoc.getObject('Blog.EnablePanelsConfigurationClass')) | ||
| 96 | #if ($preferencesObj) | ||
| 97 | #set ($result = $xwiki.getDocument( $preferencesObj.getValue('blog'))) | ||
| 98 | #end | ||
| 99 | ## If no special case occurs (like the previous one), identify a blog by checking the current location from its hierarchy. | ||
| 100 | #if ("$!result" == '') | ||
| 101 | ## First, try the Space.WebHome, for a whole-space blog | ||
| 102 | #set($result = $xwiki.getDocument("${space}.WebHome")) | ||
| 103 | #if(!$result.getObject($blogClassname)) | ||
| 104 | ## Second, try the Space.Blog document | ||
| 105 | #set($result = $xwiki.getDocument("${space}.Blog")) | ||
| 106 | #if(!$result.getObject($blogClassname)) | ||
| 107 | ## Third, try searching for a blog document in the current space | ||
| 108 | ## Prevent the query fail when the space contains dots '.' | ||
| 109 | #set($blogDocs = $services.query.hql(", BaseObject obj where doc.space = :space and obj.name = doc.fullName and obj.className = '$blogClassname' order by doc.name").setLimit(1).setOffset(0).bindValue('space', $space).execute()) | ||
| 110 | #if($blogDocs.size() > 0) | ||
| 111 | #set($result = $xwiki.getDocument($blogDocs.get(0))) | ||
| 112 | #else | ||
| 113 | ## Fourth, try searching for a blog document that have the its 'postsLocation' set to the current space | ||
| 114 | #set($blogDocs = $services.query.hql(", BaseObject obj, StringProperty as postsLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=postsLocationProp.id.id and postsLocationProp.id.name='postsLocation' and postsLocationProp.value=:postsLocation order by doc.name").setLimit(1).setOffset(0).bindValue('postsLocation', $space).execute()) | ||
| 115 | #if($blogDocs.size() > 0) | ||
| 116 | #set($result = $xwiki.getDocument($blogDocs.get(0))) | ||
| 117 | #else | ||
| 118 | ## Last, fallback to Blog.WebHome, the default blog | ||
| 119 | #set($result = $xwiki.getDocument('Blog.WebHome')) | ||
| 120 | #end | ||
| 121 | #end | ||
| 122 | #end | ||
| 123 | #end | ||
| 124 | #end | ||
| 125 | #set ($blogDoc = $NULL) | ||
| 126 | #setVariable ("$blogDoc" $result) | ||
| 127 | #end | ||
| 128 | ## | ||
| 129 | ## | ||
| 130 | ## | ||
| 131 | #** | ||
| 132 | * Retrieve the blog title. | ||
| 133 | * | ||
| 134 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass<tt> object with the <tt>title</tt> property set. | ||
| 135 | * @param title The resulting title. | ||
| 136 | *### | ||
| 137 | #macro(getBlogTitle $blogDoc $title) | ||
| 138 | ## Titles can contain velocity code (most commonly translations), so we should evaluate them. | ||
| 139 | #set ($title = $NULL) | ||
| 140 | #setVariable ("$title" $!blogDoc.displayTitle) | ||
| 141 | #end | ||
| 142 | ## | ||
| 143 | ## | ||
| 144 | ## | ||
| 145 | #** | ||
| 146 | * Retrieve the blog description. | ||
| 147 | * | ||
| 148 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>description</tt> | ||
| 149 | * property set. | ||
| 150 | * @param description The resulting description. | ||
| 151 | *### | ||
| 152 | #macro(getBlogDescription $blogDoc $description) | ||
| 153 | #getBlogProperty($blogDoc 'description' '' $result) | ||
| 154 | #set ($description = $NULL) | ||
| 155 | #setVariable ("$description" $result) | ||
| 156 | #end | ||
| 157 | ## | ||
| 158 | ## | ||
| 159 | ## | ||
| 160 | #** | ||
| 161 | * Retrieves a list of entries to be displayed. The entries are either part of the blog's space, or have the blog | ||
| 162 | * document set as a parent. The number and range of entries returned (from all those belonging to this blog) depends on | ||
| 163 | * the blog display type: paginated (fixed number of entries), weekly (all entries in a week), monthly (all entries in a | ||
| 164 | * month), or all. | ||
| 165 | * | ||
| 166 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 167 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 168 | *### | ||
| 169 | #macro(getBlogEntries $blogDoc $entries) | ||
| 170 | #if (!$entries) | ||
| 171 | #setVariable ("$entries" []) | ||
| 172 | #end | ||
| 173 | #getAllBlogPostsQuery($query) | ||
| 174 | #isDefaultBlog($blogDoc $isDefault) | ||
| 175 | #set($queryParams = {}) | ||
| 176 | #if ($isDefault) | ||
| 177 | #getCategoryAllBlogPostsQuery($query) | ||
| 178 | #set($query = "${query} and (doc.creator = :creator or (isPublished.value = 1 and hidden.value = 0)) and (doc.space = :space or catList like :catList escape '!')") | ||
| 179 | #set($discard = $queryParams.put('creator', $xcontext.user)) | ||
| 180 | #set($discard = $queryParams.put('space', $blogDoc.space)) | ||
| 181 | #set($sanitizedBlogSpace = $blogDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) | ||
| 182 | #set($discard = $queryParams.put('catList', $sanitizedBlogSpace)) | ||
| 183 | #else | ||
| 184 | #set($query = "${query} and (doc.space = :space or doc.parent = :parent)") | ||
| 185 | #getBlogPostsLocation($blogDoc.space $blogPostsLocation) | ||
| 186 | #set($discard = $queryParams.put('space', $blogPostsLocation)) | ||
| 187 | #set($discard = $queryParams.put('parent', $blogDoc.space)) | ||
| 188 | #end | ||
| 189 | #getBlogDisplayType($blogDoc $displayType) | ||
| 190 | #if($displayType == 'weekly') | ||
| 191 | #getWeeklyBlogEntries($blogDoc $query $entries $queryParams) | ||
| 192 | #elseif($displayType == 'monthly') | ||
| 193 | #getMonthlyBlogEntries($blogDoc $query $entries $queryParams) | ||
| 194 | #elseif($displayType == 'all') | ||
| 195 | #getAllBlogEntries($blogDoc $query $entries $queryParams) | ||
| 196 | #else | ||
| 197 | #getPagedBlogEntries($blogDoc $query $entries $queryParams) | ||
| 198 | #end | ||
| 199 | #end | ||
| 200 | ## | ||
| 201 | ## | ||
| 202 | ## | ||
| 203 | #** | ||
| 204 | * Retrieves a list of entries to be displayed. The entries are taken from a "page" of the blog, a sequence of documents | ||
| 205 | * defined by the request parameters <tt>ipp</tt> (items per page) and <tt>page</tt> (the current page). Initially the | ||
| 206 | * first page is displayed, with the number of entries defined in the blog object in the <tt>itemsPerPage</tt> property | ||
| 207 | * (10 if not defined). | ||
| 208 | * | ||
| 209 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 210 | * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be | ||
| 211 | * refined to restrict to a given space, or to a given search criteria, etc. | ||
| 212 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 213 | * @param queryParams The parameters to bind with the query. | ||
| 214 | *### | ||
| 215 | #macro(getPagedBlogEntries $blogDoc $query $entries $queryParams) | ||
| 216 | #if (!$entries) | ||
| 217 | #setVariable ("$entries" []) | ||
| 218 | #end | ||
| 219 | #set($countQueryObj = $services.query.hql($query).addFilter("unique")) | ||
| 220 | #set($queryObj = $services.query.hql("${query} order by publishDate.value desc")) | ||
| 221 | #bindQueryParameters($countQueryObj $queryParams) | ||
| 222 | #bindQueryParameters($queryObj $queryParams) | ||
| 223 | #set($totalEntries = $countQueryObj.count()) | ||
| 224 | #getBlogProperty($blogDoc 'itemsPerPage' '10' $defaultItemsPerPage) | ||
| 225 | #set($defaultItemsPerPage = $numbertool.toNumber($defaultItemsPerPage).intValue()) | ||
| 226 | ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. | ||
| 227 | #preparePagedViewParams($totalEntries $defaultItemsPerPage) | ||
| 228 | #set($discard = $entries.addAll($queryObj.setLimit($itemsPerPage).setOffset($startAt).addFilter("unique").execute())) | ||
| 229 | #end | ||
| 230 | ## | ||
| 231 | ## | ||
| 232 | ## | ||
| 233 | #** | ||
| 234 | * Retrieves a list of entries to be displayed. The entries are taken from a week of the blog. The target week is | ||
| 235 | * defined by the request parameters <tt>week</tt> (the week number in the year, from 1 to 52) and <tt>year</tt> (4 | ||
| 236 | * digit year). Initially the current week is displayed. | ||
| 237 | * | ||
| 238 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 239 | * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be | ||
| 240 | * refined to restrict to a given space, or to a given search criteria, etc. | ||
| 241 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 242 | * @param queryParams The parameters to bind with the query. | ||
| 243 | *### | ||
| 244 | #macro(getWeeklyBlogEntries $blogDoc $query $entries $queryParams) | ||
| 245 | #if (!$entries) | ||
| 246 | #setVariable ("$entries" []) | ||
| 247 | #end | ||
| 248 | #getRequestedWeek($weekDate) | ||
| 249 | #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) | ||
| 250 | #set($minDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundFloor())) | ||
| 251 | #set($maxDay = $dateFormatter.print($weekDate.toMutableDateTime().weekOfWeekyear().roundCeiling())) | ||
| 252 | #set($query = "${query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'") | ||
| 253 | #set($countQueryObj = $services.query.hql($query).addFilter("unique")) | ||
| 254 | #set($queryObj = $services.query.hql("${query} order by publishDate.value desc").addFilter("unique")) | ||
| 255 | #bindQueryParameters($countQueryObj $queryParams) | ||
| 256 | #bindQueryParameters($queryObj $queryParams) | ||
| 257 | #set($totalEntries = $countQueryObj.count()) | ||
| 258 | #set($discard = $entries.addAll($queryObj.execute())) | ||
| 259 | #end | ||
| 260 | ## | ||
| 261 | ## | ||
| 262 | ## | ||
| 263 | #** | ||
| 264 | * Retrieves a list of entries to be displayed. The entries are taken from a month of the blog. The target month is | ||
| 265 | * defined by the request parameters <tt>month</tt> (the month number, from 1 to 12) and <tt>year</tt> (4 | ||
| 266 | * digit year). Initially the current month is displayed. | ||
| 267 | * | ||
| 268 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 269 | * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be | ||
| 270 | * refined to restrict to a given space, or to a given search criteria, etc. | ||
| 271 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 272 | * @param queryParams The parameters to bind with the query. | ||
| 273 | *### | ||
| 274 | #macro(getMonthlyBlogEntries $blogDoc $query $entries) | ||
| 275 | #if (!$entries) | ||
| 276 | #setVariable ("$entries" []) | ||
| 277 | #end | ||
| 278 | #getRequestedMonth($monthDate) | ||
| 279 | #set($dateFormatter = $xwiki.jodatime.getDateTimeFormatterForPattern('yyyy-MM-dd')) | ||
| 280 | #set($minDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundFloor())) | ||
| 281 | #set($maxDay = $dateFormatter.print($monthDate.toMutableDateTime().monthOfYear().roundCeiling())) | ||
| 282 | #set($query = "${query} and publishDate.value >= '$minDay' and publishDate.value < '$maxDay'") | ||
| 283 | #set($countQueryObj = $services.query.hql($query).addFilter("unique")) | ||
| 284 | #set($queryObj = $services.query.hql("${query} order by publishDate.value desc").addFilter("unique")) | ||
| 285 | #bindQueryParameters($countQueryObj $queryParams) | ||
| 286 | #bindQueryParameters($queryObj $queryParams) | ||
| 287 | #set($totalEntries = $countQueryObj.count()) | ||
| 288 | #set($discard = $entries.addAll($queryObj.execute())) | ||
| 289 | #end | ||
| 290 | ## | ||
| 291 | ## | ||
| 292 | ## | ||
| 293 | #** | ||
| 294 | * Retrieves a list of entries to be displayed. All entries belonging to the current blog are returned. | ||
| 295 | * | ||
| 296 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 297 | * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be | ||
| 298 | * refined to restrict to a given space, or to a given search criteria, etc. | ||
| 299 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 300 | * @param queryParams The parameters to bind with the query. | ||
| 301 | *### | ||
| 302 | #macro(getAllBlogEntries $blogDoc $query $entries $queryParams) | ||
| 303 | #if (!$entries) | ||
| 304 | #setVariable ("$entries" []) | ||
| 305 | #end | ||
| 306 | #set($countQueryObj = $services.query.hql($query).addFilter("unique")) | ||
| 307 | #set($queryObj = $services.query.hql("${query} order by publishDate.value desc").addFilter("unique")) | ||
| 308 | #bindQueryParameters($countQueryObj $queryParams) | ||
| 309 | #bindQueryParameters($queryObj $queryParams) | ||
| 310 | #set($totalEntries = $countQueryObj.count()) | ||
| 311 | #set($discard = $entries.addAll($queryObj.execute())) | ||
| 312 | #end | ||
| 313 | ## | ||
| 314 | ## | ||
| 315 | ## | ||
| 316 | #** | ||
| 317 | * Retrieves a list of entries to be displayed. Only (and all) unpublished entries are returned. | ||
| 318 | * | ||
| 319 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 320 | * @param query The base query for selecting entries. Apart from the base query that selects entries, it can further be | ||
| 321 | * refined to restrict to a given space, or to a given search criteria, etc. | ||
| 322 | * @param queryParams The parameters to bind with the query. | ||
| 323 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 324 | *### | ||
| 325 | #macro(getUnpublishedBlogEntries $blogDoc $query $queryParams $entries) | ||
| 326 | #if (!$entries) | ||
| 327 | #setVariable ("$entries" []) | ||
| 328 | #end | ||
| 329 | #set($query = "${query} and isPublished.value = 0") | ||
| 330 | #set ($countQueryObj = $services.query.hql($query).addFilter("unique")) | ||
| 331 | #set ($queryObj = $services.query.hql("${query} order by publishDate.value desc").addFilter("unique")) | ||
| 332 | #bindQueryParameters($countQueryObj $queryParams) | ||
| 333 | #bindQueryParameters($queryObj $queryParams) | ||
| 334 | #set($totalEntries = $countQueryObj.count()) | ||
| 335 | #set($discard = $entries.addAll($queryObj.execute())) | ||
| 336 | #end | ||
| 337 | ## | ||
| 338 | ## | ||
| 339 | ## | ||
| 340 | #** | ||
| 341 | * Retrieves a list of entries to be displayed. The entries are taken from all the wiki, and not from a specific blog. | ||
| 342 | * | ||
| 343 | * @param entries The resulting list of entries to display, a list of XDocument names. | ||
| 344 | *### | ||
| 345 | #macro(getGlobalBlogEntries $entries) | ||
| 346 | #if (!$entries) | ||
| 347 | #setVariable ("$entries" []) | ||
| 348 | #end | ||
| 349 | #getAllBlogPostsQuery($query) | ||
| 350 | #set($totalEntries = $services.query.hql($query).count()) | ||
| 351 | #set($defaultItemsPerPage = 20) | ||
| 352 | ## This macro is defined in the default macros.vm library. It also sets $itemsPerPage and $startAt. | ||
| 353 | #preparePagedViewParams($totalEntries $defaultItemsPerPage) | ||
| 354 | #set($discard = $entries.addAll($services.query.hql("${query} order by publishDate.value desc").setLimit($itemsPerPage).setOffset($startAt).execute())) | ||
| 355 | #end | ||
| 356 | #** | ||
| 357 | * Return the base query for selecting blog entries. It filters only visible entries, but does not bind to a specific | ||
| 358 | * blog, nor specify a range or an ordering criteria. | ||
| 359 | * | ||
| 360 | * This macro is a duplicate of #getAllBlogPostsQuery($query). Keep it in case it's used outside, in custom code. | ||
| 361 | * | ||
| 362 | * @param query The basic query for selecting blog entries. | ||
| 363 | *# | ||
| 364 | #macro(getBlogEntriesBaseQuery $query) | ||
| 365 | #getAllBlogPostsQuery($query) | ||
| 366 | #end | ||
| 367 | #** | ||
| 368 | * Return the Query for selecting the all wiki blog posts without filtering | ||
| 369 | * | ||
| 370 | * @param query The basic query for selecting blog entries. | ||
| 371 | *# | ||
| 372 | #macro(getAllBlogPostsQuery $query) | ||
| 373 | #set ($query = $NULL) | ||
| 374 | #setVariable("$query" ", BaseObject as obj, IntegerProperty isPublished, | ||
| 375 | IntegerProperty hidden, DateProperty publishDate | ||
| 376 | where doc.fullName <> '$blogPostTemplate' and | ||
| 377 | obj.name=doc.fullName and obj.className='$blogPostClassname' and | ||
| 378 | isPublished.id.id = obj.id and isPublished.id.name = 'published' and | ||
| 379 | hidden.id.id = obj.id and hidden.id.name='hidden' and | ||
| 380 | publishDate.id.id = obj.id and publishDate.id.name='publishDate' and | ||
| 381 | (doc.creator = '$xcontext.user' or (isPublished.value = 1 and hidden.value = 0))") | ||
| 382 | #end | ||
| 383 | ## | ||
| 384 | ## | ||
| 385 | ## | ||
| 386 | ###** | ||
| 387 | * Return the Query for selecting the all wiki blog posts with categories filtering | ||
| 388 | * | ||
| 389 | * @param query The basic query for selecting blog entries. | ||
| 390 | *### | ||
| 391 | #macro(getCategoryAllBlogPostsQuery $query) | ||
| 392 | #set ($query = $NULL) | ||
| 393 | #getAllBlogPostsQuery($baseQuery) | ||
| 394 | #set ($baseQuery = $baseQuery.replace('DateProperty publishDate', 'DateProperty publishDate, DBStringListProperty as category left join category.list catList')) | ||
| 395 | #setVariable("$query" "${baseQuery} and obj.id=category.id.id and category.id.name='category'") | ||
| 396 | #end | ||
| 397 | ## | ||
| 398 | ## | ||
| 399 | ## | ||
| 400 | #** | ||
| 401 | * Determines how is the blog index split into pages: paginated (fixed number of entries), weekly (all entries in a | ||
| 402 | * week), monthly (all entries in a month), or all. | ||
| 403 | * | ||
| 404 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>displayType</tt> | ||
| 405 | * property set. | ||
| 406 | * @param displayType The resulting string. If the blog object does not define anything, it is considered paginated. | ||
| 407 | *### | ||
| 408 | #macro(getBlogDisplayType $blogDoc $displayType) | ||
| 409 | #getBlogProperty($blogDoc 'displayType' 'paginated' $result) | ||
| 410 | #set ($displayType = $NULL) | ||
| 411 | #setVariable ("$displayType" $result) | ||
| 412 | #end | ||
| 413 | ## | ||
| 414 | ## | ||
| 415 | ## | ||
| 416 | #** | ||
| 417 | * Displays a list of entries. | ||
| 418 | * | ||
| 419 | * @param entries The entries to display, a list of XDocument names. | ||
| 420 | * @param displaying What exactly is displayed: blog index, a single blog entry, a blog category, search results, | ||
| 421 | * unpublished entries, etc. This will be used as the classname(s) for the container div (hfeed). Currently | ||
| 422 | * used values: index, single, category, search, unpublished, hidden. | ||
| 423 | * @param onlyExtract If <tt>true</tt>, only display the extract of articles where available, otherwise display the full content. | ||
| 424 | * @param shouldDisplayTitles If <tt>true</tt>, display the blog title (blog posts shouldn't display the title when they're | ||
| 425 | * displayed alone on their page since it's the page title which is used in this case) | ||
| 426 | *### | ||
| 427 | #macro(displayBlog $entries $displaying $onlyExtract $shouldDisplayTitles) | ||
| 428 | #set($blogDay = '') | ||
| 429 | (% class="hfeed $!{displaying}" %)((( | ||
| 430 | (% class="blogDay" %)((( | ||
| 431 | #foreach ($entryDoc in $xwiki.wrapDocs($entries)) | ||
| 432 | #getEntryObject($entryDoc $entryObj) | ||
| 433 | ## Although all entries should have one of the two objects, better check to be sure. | ||
| 434 | #if("$!{entryObj}" != '') | ||
| 435 | #getEntryDate($entryDoc $entryObj $entryDate) | ||
| 436 | ## Display a "calendar sheet" for each day. All entries posted on the same day share one such sheet. | ||
| 437 | #set($entryDateStr = $xwiki.formatDate($entryDate, 'yyyyMMMMdd')) | ||
| 438 | #if($blogDay != $entryDateStr) | ||
| 439 | #if($blogDay != '') | ||
| 440 | ))) | ||
| 441 | (% class="blogDay" %)((( | ||
| 442 | #end | ||
| 443 | #displayBlogDate($entryDate) | ||
| 444 | #set ($blogDay = $entryDateStr) | ||
| 445 | #end | ||
| 446 | ## Finally, display the entry. | ||
| 447 | #displayEntry($entryDoc $entryObj $onlyExtract $shouldDisplayTitles true) | ||
| 448 | #end | ||
| 449 | #end | ||
| 450 | )))## blogDay | ||
| 451 | )))## hfeed | ||
| 452 | #end | ||
| 453 | ## | ||
| 454 | ## | ||
| 455 | ## | ||
| 456 | #** | ||
| 457 | * Get the entry object, either a new BlogPost or an old Article. | ||
| 458 | * | ||
| 459 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 460 | * @param entryObj The resulting xobject of the blog post. | ||
| 461 | *### | ||
| 462 | #macro(getEntryObject $entryDoc $__entryObj) | ||
| 463 | #set($result = $entryDoc.getObject("${blogPostClassname}")) | ||
| 464 | #if(!$result) | ||
| 465 | #set($result = $entryDoc.getObject("${oldArticleClassname}")) | ||
| 466 | #end | ||
| 467 | ## NOTE: The reason we put an underscore in front of the variable name is to prevent the following line from | ||
| 468 | ## overwriting the $entryObj variable that may be defined before this macro is called. Of course, $__entryObj may be | ||
| 469 | ## overwritten in this case but it's less likely to have such a variable defined before. | ||
| 470 | #set ($__entryObj = $NULL) | ||
| 471 | #setVariable ("$__entryObj" $result) | ||
| 472 | #end | ||
| 473 | ## | ||
| 474 | ## | ||
| 475 | ## | ||
| 476 | #** | ||
| 477 | * Gets the date associated with a blog entry. This is the publication date. For unpublished entries, initially this is | ||
| 478 | * the document creation date, but can be edited by the user. | ||
| 479 | * | ||
| 480 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 481 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 482 | * @param result The resulting date, an instance of <tt>java.util.Date</tt>. | ||
| 483 | *### | ||
| 484 | #macro(getEntryDate $entryDoc $entryObj $result) | ||
| 485 | #set ($result = $NULL) | ||
| 486 | #setVariable ("$result" $entryObj.getProperty('publishDate').value) | ||
| 487 | #end | ||
| 488 | ## | ||
| 489 | ## | ||
| 490 | ## | ||
| 491 | #** | ||
| 492 | * Displays a date, nicely formatted as a calendar page. | ||
| 493 | * | ||
| 494 | * @param date The date to display, an instance of <tt>java.util.Date</tt>. | ||
| 495 | *### | ||
| 496 | #macro(displayBlogDate $date) | ||
| 497 | #set($year = $xwiki.formatDate($date, 'yyyy')) | ||
| 498 | ## 3 letter month name, like Jan, Dec. | ||
| 499 | #set($month = $xwiki.formatDate($date, 'MMM')) | ||
| 500 | ## Uncomment to get a full length month name, like January, December. | ||
| 501 | ## TODO: this could be defined somewhere in the blog style. | ||
| 502 | ## #set($month = $xwiki.formatDate($date, 'MMMM')) | ||
| 503 | #set($day = $xwiki.formatDate($date, 'dd')) | ||
| 504 | (% class="blogdate" %) | ||
| 505 | == (% class="month" %)$month(%%) (% class="day" %)$day(%%) (% class="year" %)$year(%%) == | ||
| 506 | #end | ||
| 507 | ## | ||
| 508 | ## | ||
| 509 | ## | ||
| 510 | #** | ||
| 511 | * Displays a blog article: management tools, header, content, footer. | ||
| 512 | * | ||
| 513 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 514 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 515 | * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. | ||
| 516 | * @param shouldDisplayTitle If <tt>true</tt>, display the blog title (blog posts shouldn't display the title | ||
| 517 | * when they're displayed alone on their page since it's the page title which is used in this case) | ||
| 518 | * @param shouldDisplayActions If <tt>true</tt>, display the blog post actions buttons | ||
| 519 | *### | ||
| 520 | #macro(displayEntry $entryDoc $entryObj $onlyExtract $shouldDisplayTitle $shouldDisplayActions) | ||
| 521 | ## Only articles with an explicit hidden setting or an explicit unpublished setting are hidden | ||
| 522 | #isPublished($entryObj $isPublished) | ||
| 523 | #isHidden($entryObj $isHidden) | ||
| 524 | #if($doc.fullName == $entryDoc.fullName) | ||
| 525 | (% class="hentry single-article" %)((( | ||
| 526 | #else | ||
| 527 | (% class="hentry#if(!$isPublished) unpublished-article#elseif($isHidden) hidden-article#end" %)((( | ||
| 528 | #end | ||
| 529 | #if ($shouldDisplayActions) | ||
| 530 | #displayEntryTools($entryDoc $entryObj) | ||
| 531 | #end | ||
| 532 | #if($shouldDisplayTitle) | ||
| 533 | #displayEntryTitle($entryDoc $entryObj) | ||
| 534 | #end | ||
| 535 | #if($doc.fullName == $entryDoc.fullName) | ||
| 536 | #if(!$isPublished) | ||
| 537 | {{warning}}{{translation key='blog.code.published'/}}{{/warning}} | ||
| 538 | #elseif($isHidden) | ||
| 539 | {{warning}}{{translation key='blog.code.hidden'/}}{{/warning}} | ||
| 540 | #end | ||
| 541 | #end | ||
| 542 | #displayEntryContent($entryDoc $entryObj $onlyExtract) | ||
| 543 | #displayEntryFooter($entryDoc $entryObj) | ||
| 544 | )))## hentry | ||
| 545 | #end | ||
| 546 | ## | ||
| 547 | ## | ||
| 548 | ## | ||
| 549 | #** | ||
| 550 | * Checks if the provided blog is published or not. | ||
| 551 | * | ||
| 552 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 553 | * @param isPublished The resulting boolean, true if the entry is considered published. | ||
| 554 | *### | ||
| 555 | #macro(isPublished $entryObj $isPublished) | ||
| 556 | #set ($isPublished = $NULL) | ||
| 557 | ## This should work for both old articles, which don't have the 'published' property at all, and | ||
| 558 | ## are considered published by default, and new entries, that should have 1 if published. | ||
| 559 | #if ("$!{entryObj.getProperty('published').value}" != '0') | ||
| 560 | #setVariable ("$isPublished" true) | ||
| 561 | #else | ||
| 562 | #setVariable ("$isPublished" false) | ||
| 563 | #end | ||
| 564 | #end | ||
| 565 | ## | ||
| 566 | ## | ||
| 567 | ## | ||
| 568 | #** | ||
| 569 | * Checks if the provided blog is hidden or not. | ||
| 570 | * | ||
| 571 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass<tt> xclass. | ||
| 572 | * @param isHiddel The resulting boolean, true if the entry is considered hidden. | ||
| 573 | *### | ||
| 574 | #macro(isHidden $entryObj $isHidden) | ||
| 575 | #set ($isHidden = $NULL) | ||
| 576 | ## This should work for both old articles, which don't have the 'hidden' property at all, and | ||
| 577 | ## are considered visible by default, and new entries, that should have 1 if hidden. | ||
| 578 | #if ("$!{entryObj.getProperty('hidden').value}" == '1') | ||
| 579 | #setVariable ("$isHidden" true) | ||
| 580 | #else | ||
| 581 | #setVariable ("$isHidden" false) | ||
| 582 | #end | ||
| 583 | #end | ||
| 584 | ## | ||
| 585 | ## | ||
| 586 | ## | ||
| 587 | #** | ||
| 588 | * Displays several "tools" for manipulating blog posts: hide/show, publish, edit. | ||
| 589 | * | ||
| 590 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 591 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 592 | *### | ||
| 593 | #macro(displayEntryTools $entryDoc $entryObj) | ||
| 594 | #if($xcontext.action == 'view') | ||
| 595 | (% class="blog-entry-toolbox" %)((( | ||
| 596 | #displayPublishButton($entryDoc $entryObj) | ||
| 597 | #displayHideShowButton($entryDoc $entryObj) | ||
| 598 | #displayEditButton($entryDoc $entryObj) | ||
| 599 | #displayDeleteButton($entryDoc $entryObj) | ||
| 600 | ))) | ||
| 601 | #end | ||
| 602 | #end | ||
| 603 | ## | ||
| 604 | ## | ||
| 605 | ## | ||
| 606 | #** | ||
| 607 | * Displays the publish button to the entry <strong>creator</strong>, if the article is not published yet. | ||
| 608 | * | ||
| 609 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 610 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 611 | * @todo AJAX calls. | ||
| 612 | *### | ||
| 613 | #macro(displayPublishButton $entryDoc $entryObj) | ||
| 614 | #isPublished($entryObj $isPublished) | ||
| 615 | #if(!$isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) | ||
| 616 | [[#toolImage('world')>>path:$blogPublisher.getURL('view', "entryName=${escapetool.url($entryDoc.fullName)}&xredirect=${escapetool.url($thisURL)}&form_token=$!{services.csrf.getToken()}")||title="$services.localization.render('blog.code.notpublished')"]]## | ||
| 617 | #end | ||
| 618 | #end | ||
| 619 | ## | ||
| 620 | ## | ||
| 621 | ## | ||
| 622 | #** | ||
| 623 | * Displays the hide or show button to the entry <strong>creator</strong>, if the article is already published. | ||
| 624 | * | ||
| 625 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 626 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 627 | *### | ||
| 628 | #macro(displayHideShowButton $entryDoc $entryObj) | ||
| 629 | #isPublished($entryObj $isPublished) | ||
| 630 | #isHidden($entryObj $isHidden) | ||
| 631 | ## Only published articles can be hidden. Unpublished articles are considered already hidden. | ||
| 632 | #if($isPublished && $entryDoc.creator == $xcontext.user && $xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) | ||
| 633 | #set ($queryString = { | ||
| 634 | 'xredirect' : $thisURL, | ||
| 635 | 'form_token' : $services.csrf.getToken() | ||
| 636 | }) | ||
| 637 | #if ($isHidden) | ||
| 638 | #set ($discard = $queryString.putAll({ | ||
| 639 | "${entryObj.getxWikiClass().getName()}_${entryObj.number}_hidden" : 0, | ||
| 640 | 'comment' : $services.localization.render('blog.code.madevisible') | ||
| 641 | })) | ||
| 642 | #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) | ||
| 643 | [[#toolImage('unlock')>>path:$lockURL||class="blog-tool-show" title="$services.localization.render('blog.code.makevisible')"]]## | ||
| 644 | #else | ||
| 645 | #set ($discard = $queryString.putAll({ | ||
| 646 | "${entryObj.getxWikiClass().getName()}_${entryObj.number}_hidden" : 1, | ||
| 647 | 'comment' : $services.localization.render('blog.code.hid') | ||
| 648 | })) | ||
| 649 | #set ($lockURL = $entryDoc.getURL('save', $escapetool.url($queryString))) | ||
| 650 | [[#toolImage('lock')>>path:$lockURL||class="blog-tool-hide" title="$services.localization.render('blog.code.hide')"]]## | ||
| 651 | #end | ||
| 652 | #end | ||
| 653 | #end | ||
| 654 | ## | ||
| 655 | ## | ||
| 656 | ## | ||
| 657 | #** | ||
| 658 | * Displays the edit button to those that can edit the article. | ||
| 659 | * | ||
| 660 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 661 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 662 | *### | ||
| 663 | #macro(displayEditButton $entryDoc $entryObj) | ||
| 664 | #if($xwiki.hasAccessLevel('edit', $xcontext.user, $entryDoc.fullName)) | ||
| 665 | ## Call getDefaultEditMode() for backward compatibility with older blog posts. | ||
| 666 | [[#toolImage('pencil')>>path:$entryDoc.getURL('edit')||title="$services.localization.render('blog.code.editpost')"]]## | ||
| 667 | #end | ||
| 668 | #end | ||
| 669 | ## | ||
| 670 | ## | ||
| 671 | ## | ||
| 672 | #** | ||
| 673 | * Displays the delete button to those that can edit the article. | ||
| 674 | * | ||
| 675 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 676 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 677 | * @todo AJAX calls. | ||
| 678 | *### | ||
| 679 | #macro(displayDeleteButton $entryDoc $entryObj) | ||
| 680 | #if($xwiki.hasAccessLevel('delete', $xcontext.user, $entryDoc.fullName)) | ||
| 681 | [[#toolImage('cross')>>path:$entryDoc.getURL('delete')||title="$services.localization.render('blog.code.deletepost')"]]## | ||
| 682 | #end | ||
| 683 | #end | ||
| 684 | ## | ||
| 685 | ## | ||
| 686 | ## | ||
| 687 | #** | ||
| 688 | * Displays the title of the entry. | ||
| 689 | * | ||
| 690 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 691 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 692 | *### | ||
| 693 | #macro(displayEntryTitle $entryDoc $entryObj) | ||
| 694 | #if($doc.fullName == $entryDoc.fullName) | ||
| 695 | (% class="entry-title" %) | ||
| 696 | = $services.rendering.escape($entryDoc.display('title', 'view', $entryObj), $xwiki.getCurrentContentSyntaxId()) = | ||
| 697 | #else | ||
| 698 | (% class="entry-title" %) | ||
| 699 | === [[$services.rendering.escape($entryDoc.display('title', 'view', $entryObj),$xwiki.getCurrentContentSyntaxId())>>doc:$services.rendering.escape($services.model.serialize($entryDoc.getDocumentReference(),'default'),$xwiki.getCurrentContentSyntaxId())]] === | ||
| 700 | #end | ||
| 701 | #end | ||
| 702 | ## | ||
| 703 | ## | ||
| 704 | ## | ||
| 705 | #** | ||
| 706 | * Displays the body of the entry. | ||
| 707 | * | ||
| 708 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 709 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 710 | * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. | ||
| 711 | *### | ||
| 712 | #macro(displayEntryContent $entryDoc $entryObj $onlyExtract) | ||
| 713 | (% class="#if($onlyExtract)entry-summary#{else}entry-content#end" %)((( | ||
| 714 | #getEntryContent($entryDoc $entryObj $onlyExtract $entryContent) | ||
| 715 | ## FIXME: This causes the blog's content to not be annotatable. See http://jira.xwiki.org/browse/XWIKI-6328 | ||
| 716 | ## Should probably be replaced by a display macro call with a reference to the object property holding the post's content | ||
| 717 | {{html wiki="false"}}$entryDoc.getRenderedContent($entryContent, $entryDoc.syntax.toIdString()){{/html}} | ||
| 718 | ))) ## entry-content | ||
| 719 | (% class="clearfloats" %)((())) | ||
| 720 | #end | ||
| 721 | ## | ||
| 722 | ## | ||
| 723 | ## | ||
| 724 | #** | ||
| 725 | * Extracts the body of the entry that should be displayed. If <tt>onlyExtract</tt> is <tt>true</tt>, display the content | ||
| 726 | * of the <tt>extract</tt> field (if not empty). | ||
| 727 | * | ||
| 728 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 729 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 730 | * @param onlyExtract If <tt>true</tt>, try to display only a summary of the entry, instead of the full content. | ||
| 731 | * @param entryContent The resulting content. | ||
| 732 | *### | ||
| 733 | #macro(getEntryContent $entryDoc $entryObj $onlyExtract $entryContent) | ||
| 734 | #if ($onlyExtract) | ||
| 735 | ## Note: We trim the summary so that if there's some white space it won't cause the summary to be used instead | ||
| 736 | ## of the content. | ||
| 737 | #set ($macro.result = $entryObj.getProperty('extract').value.trim()) | ||
| 738 | #end | ||
| 739 | #if("$!macro.result" == '') | ||
| 740 | #set($macro.result = $entryObj.getProperty('content').value) | ||
| 741 | #* Disabled until the content can be cleanly cut. | ||
| 742 | * #if($onlyExtract && $result.length()>$maxchars) | ||
| 743 | * #set($i = $macro.result.lastIndexOf(" ", $maxchars)) | ||
| 744 | * #set($i = $i + 1) | ||
| 745 | * #set($macro.result = "${macro.result.substring(0,$i)} *[...>${entryDoc.fullName}]*") | ||
| 746 | * #end | ||
| 747 | ## *### | ||
| 748 | #else | ||
| 749 | #if($entryDoc.syntax.toIdString() == 'xwiki/1.0') | ||
| 750 | #set($macro.result = "${macro.result} <a href='${entryDoc.getURL()}' title='$services.localization.render('blog.code.readpost')'>...</a>") | ||
| 751 | #elseif($entryDoc.syntax.toIdString() == 'xwiki/2.0' || $entryDoc.syntax.toIdString() == 'xwiki/2.1') | ||
| 752 | #set($macro.result = "${macro.result} [[...>>${services.rendering.escape($entryDoc.getFullName(), $entryDoc.getSyntax())}||title='$services.localization.render('blog.code.readpost')']]") | ||
| 753 | #end | ||
| 754 | #end | ||
| 755 | #set ($entryContent = $NULL) | ||
| 756 | #setVariable ("$entryContent" $macro.result) | ||
| 757 | #end | ||
| 758 | ## | ||
| 759 | ## | ||
| 760 | ## | ||
| 761 | #** | ||
| 762 | * Displays the footer of the entry. | ||
| 763 | * | ||
| 764 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 765 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 766 | *### | ||
| 767 | #macro(displayEntryFooter $entryDoc $entryObj) | ||
| 768 | (% class="entry-footer" %)((( | ||
| 769 | #isPublished($entryObj $isPublished) | ||
| 770 | (% class='entry-author-label' %) | ||
| 771 | #if($isPublished) | ||
| 772 | {{translation key='blog.code.postedby'/}} ## | ||
| 773 | #else | ||
| 774 | {{translation key='blog.code.createdby'/}} ## | ||
| 775 | #end | ||
| 776 | {{html wiki="false" clean="false"}}<span class='author vcard'>#userfn($entryDoc.creator)</span>{{/html}} ## | ||
| 777 | #getEntryDate($entryDoc $entryObj $entryDate) | ||
| 778 | #listCategories($entryObj) #* | ||
| 779 | ## Since the publish date and update date are not set at the exact same time, there could be a small difference that | ||
| 780 | ## we assume cannot be more than 3 seconds. | ||
| 781 | *#(% class="separator" %)·(%%) [[{{translation key='blog.code.permalink'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||rel="bookmark"]] ## | ||
| 782 | #if ($showcomments) | ||
| 783 | (% class="separator" %)·(%%) [[{{translation key='blog.code.comments'/}}>>$services.rendering.escape($entryDoc,'xwiki/2.0')||anchor="Comments"]] (% class="itemCount" %)($entryDoc.comments.size())(%%) ## | ||
| 784 | #end ## | ||
| 785 | #if($entryDoc != $doc) ## | ||
| 786 | #displayEntryBlogLocation($entryDoc $entryObj) ## | ||
| 787 | #end | ||
| 788 | )))## entry-footer | ||
| 789 | #end | ||
| 790 | ## | ||
| 791 | ## | ||
| 792 | #** | ||
| 793 | * Display the blog for the entry (if it is not the currently displayed blog) | ||
| 794 | * | ||
| 795 | * @param entryDoc The xdocument of the blog post. Each post resides in its own document. | ||
| 796 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 797 | *### | ||
| 798 | #macro(displayEntryBlogLocation $entryDoc $entryObj) | ||
| 799 | #getBlogPostsLocation($entryDoc.getSpace() $blogPostsLocation) ## | ||
| 800 | #if("$!blogPostsLocation" != "") ## | ||
| 801 | #set($blogSpaceRef = $services.model.resolveSpace($blogPostsLocation)) ## | ||
| 802 | #set($blogDocRef = $services.model.createDocumentReference($services.model.getEntityReference('DOCUMENT', 'default').getName(), $blogSpaceRef)) ## | ||
| 803 | #if($doc.documentReference != $blogDocRef) ## | ||
| 804 | #set($blogDoc = $xwiki.getDocument($blogDocRef)) ## | ||
| 805 | #set($blogObj = $blogDoc.getObject('Blog.BlogClass')) ## | ||
| 806 | #if($blogObj) (% class="blogrefpath" %)((( ## | ||
| 807 | $services.localization.render('blog.code.postedin') {{html clean="false" wiki="false"}} #hierarchy($blogDocRef, {'selfIsActive' : true, 'local': true}) {{/html}} ## | ||
| 808 | )))(%%)## | ||
| 809 | #end | ||
| 810 | #end | ||
| 811 | #end | ||
| 812 | #end | ||
| 813 | ## | ||
| 814 | ## | ||
| 815 | ## | ||
| 816 | ## | ||
| 817 | #** | ||
| 818 | * List the categories an entry belongs to. Used in the footer. The categories are instances of <tt>Blog.CategoryClass</tt>. | ||
| 819 | * | ||
| 820 | * @param entryObj The xobject of the blog post, an instance of the <tt>Blog.BlogPostClass</tt> xclass. | ||
| 821 | *### | ||
| 822 | #macro(listCategories $entryObj) | ||
| 823 | #if($entryObj.getxWikiClass().getName() == $blogPostClassname) | ||
| 824 | #set($categories = $entryObj.getProperty('category').value) | ||
| 825 | #set($first = true) | ||
| 826 | #if($categories.size() > 0) | ||
| 827 | #foreach($category in $categories) | ||
| 828 | #set($categoryDoc = $!xwiki.getDocument($category)) | ||
| 829 | #if(!$categoryDoc.isNew() && $categoryDoc.getObject(${blogCategoryClassname})) | ||
| 830 | #if($foreach.count == 1) | ||
| 831 | (% class='separator' %)·(%%) $services.localization.render('blog.code.categories') ## | ||
| 832 | #else | ||
| 833 | , ## | ||
| 834 | #end## | ||
| 835 | [[$!{categoryDoc.getObject($blogCategoryClassname).getValue('name')}>>${category}||rel='tag']]## | ||
| 836 | #end## | ||
| 837 | #end## | ||
| 838 | #end | ||
| 839 | #end | ||
| 840 | #end | ||
| 841 | ## | ||
| 842 | ## | ||
| 843 | ## | ||
| 844 | #** | ||
| 845 | * Displays blog pagination links (older and newer entries). | ||
| 846 | * | ||
| 847 | * @param blogDoc the XDocument holding the blog definition object. | ||
| 848 | *### | ||
| 849 | #macro(displayNavigationLinks $blogDoc) | ||
| 850 | (% class="clearfloats" %)((())) | ||
| 851 | #getBlogDisplayType($blogDoc $displayType) | ||
| 852 | #if($displayType == 'weekly') | ||
| 853 | (% class="pagingLinks" %)((( | ||
| 854 | #getRequestedWeek($weekDate) | ||
| 855 | $weekDate.addWeeks(-1)## | ||
| 856 | (% class="prevPage" %)**[[« {{translation key='blog.code.previousweek'/}}>>$doc.name||queryString="year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear" class="button"]]**(%%) | ||
| 857 | #sep() | ||
| 858 | $weekDate.addWeeks(2)## 2 because we already subtracted 1 above | ||
| 859 | (% class="nextPage" %)**[[{{translation key='blog.code.nextweek'/}} »>>$doc.name||queryString="year=$weekDate.weekyear&week=$weekDate.weekOfWeekyear" class="button"]]**(%%) | ||
| 860 | ))) | ||
| 861 | #elseif($displayType == 'monthly') | ||
| 862 | (% class="pagingLinks" %)((( | ||
| 863 | #getRequestedMonth($monthDate) | ||
| 864 | $monthDate.addMonths(-1)## | ||
| 865 | (% class="prevPage" %)**[[« {{translation key='blog.code.previousmonth'/}}>>$services.rendering.escape($doc.name,$doc.syntax)||queryString="year=$monthDate.year&month=$monthDate.monthOfYear" class="button"]]**(%%) | ||
| 866 | #sep() | ||
| 867 | $monthDate.addMonths(2)## 2 because we already subtracted 1 above | ||
| 868 | (% class="nextPage" %)**[[{{translation key='blog.code.nextmonth'/}} »>>$services.rendering.escape($doc.name,$doc.syntax)||queryString="year=$monthDate.year&month=$monthDate.monthOfYear" class="button"]]**(%%) | ||
| 869 | ))) | ||
| 870 | #elseif($displayType == 'all') | ||
| 871 | #else | ||
| 872 | ## Paginated | ||
| 873 | #if(($totalPages > 1)) | ||
| 874 | #set($queryString = '') | ||
| 875 | #foreach($p in $request.getParameterNames()) | ||
| 876 | #if($p != 'page' && $p != 'ipp') | ||
| 877 | #foreach($v in $request.getParameterValues($p)) | ||
| 878 | #set($queryString = "${queryString}&${escapetool.url($p)}=${escapetool.url($v)}") | ||
| 879 | #end | ||
| 880 | #end | ||
| 881 | #end | ||
| 882 | (% class="pagingLinks" %)((( | ||
| 883 | #if ($currentPageNumber < $totalPages) | ||
| 884 | #set($currentPageNumber = $currentPageNumber + 1) | ||
| 885 | (% class="prevPage" %)**[[« {{translation key='blog.code.olderposts'/}}>>$services.rendering.escape($doc.name,$doc.syntax)||queryString="page=${currentPageNumber}&ipp=${itemsPerPage}$queryString" class="button"]]**(%%) | ||
| 886 | #set($currentPageNumber = $currentPageNumber - 1) | ||
| 887 | #end | ||
| 888 | #if ($currentPageNumber > 1) | ||
| 889 | #if ($currentPageNumber < $totalPages) | ||
| 890 | #sep() | ||
| 891 | #end | ||
| 892 | #set($currentPageNumber = $currentPageNumber - 1) | ||
| 893 | (% class="nextPage" %)**[[{{translation key='blog.code.newerposts'/}} »>>$services.rendering.escape($doc.name,$doc.syntax)||queryString="page=${currentPageNumber}&ipp=${itemsPerPage}$queryString" class="button"]]**(%%) | ||
| 894 | #set($currentPageNumber = $currentPageNumber + 1) | ||
| 895 | #end | ||
| 896 | (% class="clear" %)(%%) | ||
| 897 | )))## pagingLinks | ||
| 898 | #end | ||
| 899 | #end | ||
| 900 | #end | ||
| 901 | ## | ||
| 902 | ## | ||
| 903 | ## | ||
| 904 | #** | ||
| 905 | * Displays a message box with "publish" icon. | ||
| 906 | * | ||
| 907 | * @param message A text message concerning blog article publishing | ||
| 908 | *### | ||
| 909 | #macro(publishMessageBox $message) | ||
| 910 | (% class="plainmessage publish-message" %)((($services.icon.render('world') $message))) | ||
| 911 | #end | ||
| 912 | #** | ||
| 913 | * Displays a message box with "show/hide" icon. | ||
| 914 | * | ||
| 915 | * @param message A text message concerning blog article hiding | ||
| 916 | *### | ||
| 917 | #macro(hideMessageBox $message) | ||
| 918 | (% class="plainmessage hide-message" %)((($services.icon.render('unlock') $message))) | ||
| 919 | #end | ||
| 920 | ## | ||
| 921 | ## | ||
| 922 | ## | ||
| 923 | #** | ||
| 924 | * Determine the requested week, for using in a weekly-indexed blog. The relevant request parameters are | ||
| 925 | * <tt>year</tt> and <tt>week</tt>. By default, the current week is used. | ||
| 926 | * | ||
| 927 | * @param monthDate The resulting week, a JODATime MutableDateTime. | ||
| 928 | *### | ||
| 929 | #macro(getRequestedWeek $weekDate) | ||
| 930 | #set ($weekDate = $NULL) | ||
| 931 | #setVariable ("$weekDate" $xwiki.jodatime.mutableDateTime) | ||
| 932 | #if("$!{request.year}" != '') | ||
| 933 | #set ($discard = $weekDate.setYear($numbertool.toNumber($request.year).intValue())) | ||
| 934 | #end | ||
| 935 | #if("$!{request.week}" != '') | ||
| 936 | #set ($discard = $weekDate.setWeekOfWeekyear($numbertool.toNumber($request.week).intValue())) | ||
| 937 | #end | ||
| 938 | #end | ||
| 939 | ## | ||
| 940 | ## | ||
| 941 | ## | ||
| 942 | #** | ||
| 943 | * Determine the requested month, for using in a monthly-indexed blog. The relevant request parameters are | ||
| 944 | * <tt>year</tt> and <tt>month</tt>. By default, the current month is used. | ||
| 945 | * | ||
| 946 | * @param monthDate The resulting month, a JODATime MutableDateTime. | ||
| 947 | *### | ||
| 948 | #macro(getRequestedMonth $monthDate) | ||
| 949 | #set ($monthDate = $NULL) | ||
| 950 | #setVariable ("$monthDate" $xwiki.jodatime.mutableDateTime) | ||
| 951 | #if("$!{request.year}" != '') | ||
| 952 | #set ($discard = $monthDate.setYear($numbertool.toNumber($request.year).intValue())) | ||
| 953 | #end | ||
| 954 | #if("$!{request.month}" != '') | ||
| 955 | #set ($discard = $monthDate.setMonthOfYear($numbertool.toNumber($request.month).intValue())) | ||
| 956 | #end | ||
| 957 | #end | ||
| 958 | ## | ||
| 959 | ## | ||
| 960 | ## | ||
| 961 | #** | ||
| 962 | * Retrieve a blog property (title, display type, etc). | ||
| 963 | * | ||
| 964 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 965 | * @param propertyName The name of the property to be retrieved. One of the <tt>Blog.BlogClass</tt>'s properties. | ||
| 966 | * @param defaultValue The default value to use in case the blog object does not define one. | ||
| 967 | * @param propertyValue The resulting value. | ||
| 968 | *### | ||
| 969 | #macro(getBlogProperty $blogDoc $propertyName $defaultValue $propertyValue) | ||
| 970 | #set($result = "$!{blogDoc.getObject(${blogClassname}).getProperty($propertyName).value}") | ||
| 971 | #if($result == '') | ||
| 972 | #set($result = $defaultValue) | ||
| 973 | #end | ||
| 974 | #set ($propertyValue = $NULL) | ||
| 975 | #setVariable ("$propertyValue" $result) | ||
| 976 | #end | ||
| 977 | |||
| 978 | #** | ||
| 979 | * If an error occurs when executing an action, set a specific response status and display an error message. | ||
| 980 | * | ||
| 981 | * @param status The response status. | ||
| 982 | * @param text The user readable error to be displayed. Can be a translation key. | ||
| 983 | * @param parameters The parameters to use when decoding the translation key. | ||
| 984 | *### | ||
| 985 | #macro(blog__actionResponseError $status $text $parameters) | ||
| 986 | $response.setStatus($status) | ||
| 987 | #if($request.ajax) | ||
| 988 | $services.localization.render($text, $!parameters) | ||
| 989 | #else | ||
| 990 | {{error}}$services.localization.render($text, $!parameters){{/error}} | ||
| 991 | #end | ||
| 992 | #end | ||
| 993 | ## | ||
| 994 | ## | ||
| 995 | ## | ||
| 996 | #** | ||
| 997 | * Check if a blog is the Default blog (The one in the 'Blog' space). | ||
| 998 | * | ||
| 999 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object. | ||
| 1000 | * @param isDefault The resulting boolean. | ||
| 1001 | *### | ||
| 1002 | #macro(isDefaultBlog $blogDoc $isDefault) | ||
| 1003 | #set ($result = false) | ||
| 1004 | #if ($blogDoc.space == 'Blog') | ||
| 1005 | #set ($result = true) | ||
| 1006 | #end | ||
| 1007 | #setVariable("$isDefault" $result) | ||
| 1008 | #end | ||
| 1009 | ## | ||
| 1010 | ## | ||
| 1011 | ## | ||
| 1012 | #** | ||
| 1013 | * Retrieve the blog posts location (space). | ||
| 1014 | * | ||
| 1015 | * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object | ||
| 1016 | * @param postsLocation The resulting location. | ||
| 1017 | *### | ||
| 1018 | #macro(getBlogPostsLocation $blogSpace $postsLocation) | ||
| 1019 | #getBlogDocument($blogSpace $blogDoc) | ||
| 1020 | #getBlogProperty($blogDoc 'postsLocation' $blogDoc.space $result) | ||
| 1021 | #set ($postsLocation = $NULL) | ||
| 1022 | #setVariable ("$postsLocation" $result) | ||
| 1023 | #end | ||
| 1024 | ## | ||
| 1025 | ## | ||
| 1026 | ## | ||
| 1027 | #** | ||
| 1028 | * Retrieve the blog categories location (space). | ||
| 1029 | * | ||
| 1030 | * @param blogSpace The blog space. It should contain a document with a <tt>Blog.BlogClass</tt> object | ||
| 1031 | * @param categoriesLocation The resulting location. | ||
| 1032 | *### | ||
| 1033 | #macro(getBlogCategoriesLocation $blogSpace $categoriesLocation) | ||
| 1034 | #getBlogDocument($blogSpace $blogDoc) | ||
| 1035 | #getBlogProperty($blogDoc 'categoriesLocation' 'Blog' $result) | ||
| 1036 | #set ($postsLocation = $NULL) | ||
| 1037 | #setVariable ("$categoriesLocation" $result) | ||
| 1038 | #end | ||
| 1039 | ###** | ||
| 1040 | * Return the Query for selecting the blog posts based on the context where the posts are displayed. | ||
| 1041 | * for example there is 4 different panel contexts: | ||
| 1042 | * aBlog.aPost or aBlog.WebHome | ||
| 1043 | * aCategorySpace.aCategory | ||
| 1044 | * aCategorySpace.WebHome | ||
| 1045 | * Blog.aPost or Blog.WebHome | ||
| 1046 | * | ||
| 1047 | * @param query The query for selecting blog entries. | ||
| 1048 | * @param queryParams The parameters to bind with the generated query. | ||
| 1049 | * @param targetDoc The document in which the articles will be displayed. | ||
| 1050 | *### | ||
| 1051 | #macro(getAllBlogPostsQueryBasedOnDisplayContext $targetDoc $query $queryParams) | ||
| 1052 | #set ($query = $NULL) | ||
| 1053 | #set ($queryParams = $NULL) | ||
| 1054 | #getCategoryAllBlogPostsQuery($resultQuery) | ||
| 1055 | #set ($resultQueryParams = {}) | ||
| 1056 | #set($sanitizedSpace = $targetDoc.space.replaceAll('([%_!])', '!$1').concat('.%')) | ||
| 1057 | #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) | ||
| 1058 | ## Get all posts that are in the default blog space('Blog') or in category 'Blog.%' | ||
| 1059 | #set ($discard = $resultQueryParams.put('space', $targetDoc.space)) | ||
| 1060 | #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) | ||
| 1061 | #set($resultQuery = "${resultQuery} and (doc.space = :space or catList like :catList escape '!')") | ||
| 1062 | #elseif($targetDoc.getObject($blogCategoryClassname)) | ||
| 1063 | ## Get all posts that are in a category aCategorySpace.aCategory | ||
| 1064 | #set ($discard = $resultQueryParams.put('catList', $targetDoc.fullName)) | ||
| 1065 | #set($resultQuery = "${resultQuery} and (catList=:catList)") | ||
| 1066 | #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') | ||
| 1067 | ## Get all posts that are in a category aCategorySpace.% | ||
| 1068 | #set ($discard = $resultQueryParams.put('catList', $sanitizedSpace)) | ||
| 1069 | ## Exclude incategorized posts | ||
| 1070 | #set ($excludedCategory = "${targetDoc.space}.WebHome") | ||
| 1071 | #if ($targetDoc.space == $defaultBlogSpace) | ||
| 1072 | #set ($excludedCategory = "Blog.Categories.WebHome") | ||
| 1073 | #end | ||
| 1074 | #set ($discard = $resultQueryParams.put('excludedCategory', $excludedCategory)) | ||
| 1075 | #set($resultQuery = "${resultQuery} and (catList<>:excludedCategory) and (catList like :catList escape '!')") | ||
| 1076 | #else | ||
| 1077 | ## Get all posts in blog space aBlog | ||
| 1078 | #getAllBlogPostsQuery($resultQuery) | ||
| 1079 | #getBlogPostsLocation($targetDoc.space $postsLocation) | ||
| 1080 | #set ($discard = $resultQueryParams.put('space', $postsLocation)) | ||
| 1081 | #set($resultQuery = "${resultQuery} and doc.space = :space") | ||
| 1082 | #end | ||
| 1083 | #setVariable("$query" $resultQuery) | ||
| 1084 | #setVariable("$queryParams" $resultQueryParams) | ||
| 1085 | #end | ||
| 1086 | ## | ||
| 1087 | ## | ||
| 1088 | ## | ||
| 1089 | ###** | ||
| 1090 | * Display blog posts based on the context where the posts are displayed. | ||
| 1091 | * for example there is 4 different panel contexts: | ||
| 1092 | * aBlog.aPost or aBlog.WebHome | ||
| 1093 | * aCategorySpace.aCategory | ||
| 1094 | * aCategorySpace.WebHome | ||
| 1095 | * Blog.aPost or Blog.WebHome | ||
| 1096 | * | ||
| 1097 | * @param targetDoc The document in which the articles will be displayed. | ||
| 1098 | * @param postsVisiblity The visibility of the posts to display: recent, unpublished, ... | ||
| 1099 | * @param layout Layout of the the posts to display | ||
| 1100 | * @param layoutParams additional layout parameters, it is a string like 'param1=val1|...|paramN=valueN' | ||
| 1101 | * @param limit the number of posts to display | ||
| 1102 | *### | ||
| 1103 | #macro(displayBlogPostsBasedOnContext $targetDoc $postsVisiblity $layout $layoutParams $limit) | ||
| 1104 | #if ($postLayout == 'full') | ||
| 1105 | #set ($macro.paginated = 'yes') | ||
| 1106 | #end | ||
| 1107 | #if ($targetDoc.space == $defaultBlogSpace && !$targetDoc.getObject($blogCategoryClassname)) | ||
| 1108 | ## Display all posts that are in the default blog space('Blog') or in category 'Blog.%' | ||
| 1109 | #getBlogPostsLayout($xwiki.getDocument("${defaultBlogSpace}.WebHome") $postsLayout) | ||
| 1110 | #if ("$!layout" == '') | ||
| 1111 | #set ($layout = $postsLayout) | ||
| 1112 | #end | ||
| 1113 | #if ($postsVisiblity == 'recent') | ||
| 1114 | {{blogpostlist blog="${defaultBlogSpace.replaceAll('~', '~~').replaceAll('"', '~"')}.WebHome" published='yes' hidden='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" limit="$limit" /}} | ||
| 1115 | #elseif($postsVisiblity == 'unpublished') | ||
| 1116 | {{blogpostlist blog="${defaultBlogSpace.replaceAll('~', '~~').replaceAll('"', '~"')}.WebHome" published='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" paginated="$!macro.paginated" limit="$limit" /}} | ||
| 1117 | #end | ||
| 1118 | #elseif($targetDoc.getObject($blogCategoryClassname)) | ||
| 1119 | ## Display all posts that are in a category aCategorySpace.aCategory | ||
| 1120 | #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) | ||
| 1121 | #getBlogPostsLayout($blogDoc $postsLayout) | ||
| 1122 | #if ("$!layout" == '') | ||
| 1123 | #set ($layout = $postsLayout) | ||
| 1124 | #end | ||
| 1125 | #if ($postsVisiblity == 'recent') | ||
| 1126 | {{blogpostlist category="$targetDoc.fullName.replaceAll('~', '~~').replaceAll('"', '~"')" published='yes' hidden='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" limit="$limit" /}} | ||
| 1127 | #elseif($postsVisiblity == 'unpublished') | ||
| 1128 | {{blogpostlist category="$targetDoc.fullName.replaceAll('~', '~~').replaceAll('"', '~"')" published='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" paginated="$!macro.paginated" limit="$limit" /}} | ||
| 1129 | #end | ||
| 1130 | #elseif($targetDoc.getObject('XWiki.DocumentSheetBinding').sheet == 'Blog.CategoriesSheet') | ||
| 1131 | ## Display all posts that are in a category aCategorySpace.% | ||
| 1132 | #getBlogDocumentForCategoriesSpace($targetDoc.space $blogDoc) | ||
| 1133 | #getBlogPostsLayout($blogDoc $postsLayout) | ||
| 1134 | #if ("$!layout" == '') | ||
| 1135 | #set ($layout = $postsLayout) | ||
| 1136 | #end | ||
| 1137 | #if ($postsVisiblity == 'recent') | ||
| 1138 | {{blogpostlist category="$targetDoc.space.replaceAll('~', '~~').replaceAll('"', '~"')" published='yes' hidden='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" limit="$limit" /}} | ||
| 1139 | #elseif($postsVisiblity == 'unpublished') | ||
| 1140 | {{blogpostlist category="$targetDoc.space.replaceAll('~', '~~').replaceAll('"', '~"')" published='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" paginated="$!macro.paginated" limit="$limit" /}} | ||
| 1141 | #end | ||
| 1142 | #else | ||
| 1143 | ## Display all posts in blog space aBlog | ||
| 1144 | #getBlogDocument($targetDoc.space $blogDoc) | ||
| 1145 | #getBlogPostsLayout($blogDoc $postsLayout) | ||
| 1146 | #if ("$!layout" == '') | ||
| 1147 | #set ($layout = $postsLayout) | ||
| 1148 | #end | ||
| 1149 | #if ($postsVisiblity == 'recent') | ||
| 1150 | {{blogpostlist blog="$blogDoc.fullName.replaceAll('~', '~~').replaceAll('"', '~"')" published='yes' hidden='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" limit="$limit" /}} | ||
| 1151 | #elseif($postsVisiblity == 'unpublished') | ||
| 1152 | {{blogpostlist blog="$blogDoc.fullName.replaceAll('~', '~~').replaceAll('"', '~"')" published='no' layout="$!layout.replaceAll('~', '~~').replaceAll('"', '~"')" layoutParams="$!layoutParams.replaceAll('~', '~~').replaceAll('"', '~"')" paginated="$!macro.paginated" limit="$limit" /}} | ||
| 1153 | #end | ||
| 1154 | #end | ||
| 1155 | #end | ||
| 1156 | ## | ||
| 1157 | ## | ||
| 1158 | ## | ||
| 1159 | #** | ||
| 1160 | * Bind parameters to a query object. | ||
| 1161 | * | ||
| 1162 | * @param queryObj The query object (org.xwiki.query.internal.ScriptQuery object) | ||
| 1163 | * @param queryParams the query parameters. | ||
| 1164 | *### | ||
| 1165 | #macro(bindQueryParameters $queryObj $queryParams) | ||
| 1166 | #set ($output = $queryObj) | ||
| 1167 | #foreach( $key in $queryParams.keySet() ) | ||
| 1168 | #set($output = $queryObj.bindValue($key, $queryParams.get($key))) | ||
| 1169 | #end | ||
| 1170 | #setVariable("$queryObj" $output) | ||
| 1171 | #end | ||
| 1172 | ## | ||
| 1173 | ## | ||
| 1174 | ## | ||
| 1175 | #** | ||
| 1176 | * Determines the blogposts layout: Default layout (Calendar), Image thumbnail | ||
| 1177 | * | ||
| 1178 | * @param blogDoc The blog document. It should contain a <tt>Blog.BlogClass</tt> object with the <tt>postsLayout</tt> | ||
| 1179 | * property set. | ||
| 1180 | * @param postsLayout The resulting string. If the blog object does not define anything, it is considered full (default). | ||
| 1181 | *### | ||
| 1182 | #macro(getBlogPostsLayout $blogDoc $postsLayout) | ||
| 1183 | #getBlogProperty($blogDoc 'postsLayout' 'full' $res) | ||
| 1184 | #set ($postsLayout = $NULL) | ||
| 1185 | #setVariable ("$postsLayout" $res) | ||
| 1186 | #end | ||
| 1187 | ## | ||
| 1188 | ## | ||
| 1189 | ## | ||
| 1190 | #** | ||
| 1191 | * Retrieve the blog document of a categories space, which is the blog descriptor that have its categoriesLocation property set to the categories space | ||
| 1192 | * | ||
| 1193 | * @param categoriesSpace A <tt>String</tt>, the name of the space. | ||
| 1194 | * @param blogDoc The resulting XDocument. | ||
| 1195 | *### | ||
| 1196 | #macro(getBlogDocumentForCategoriesSpace $categoriesSpace $blogDoc) | ||
| 1197 | #set($macro.blogDocs = $services.query.hql(", BaseObject obj, StringProperty as categoriesLocationProp where obj.name = doc.fullName and obj.className = '$blogClassname' and obj.id=categoriesLocationProp.id.id and categoriesLocationProp.id.name='categoriesLocation' and categoriesLocationProp.value=:categoriesLocation order by doc.creationDate").setLimit(1).setOffset(0).bindValue('categoriesLocation', $categoriesSpace).execute()) | ||
| 1198 | #if($macro.blogDocs.size() > 0 && $categoriesSpace != $defaultBlogSpace) | ||
| 1199 | #set($macro.result = $xwiki.getDocument($macro.blogDocs.get(0))) | ||
| 1200 | #else | ||
| 1201 | ## Fallback to Blog.WebHome, the default blog | ||
| 1202 | #set($macro.result = $xwiki.getDocument('Blog.WebHome')) | ||
| 1203 | #end | ||
| 1204 | #set ($blogDoc = $NULL) | ||
| 1205 | #setVariable ("$blogDoc" $macro.result) | ||
| 1206 | #end | ||
| 1207 | {{/velocity}} |