Configure the News Overview Page - Enterprise Java Content management system - Hippo CMS

Configure the News Overview Page

Previous Step

Configure the Home Page

With the Home page in place, let's move on to the News Overview page.

Take a Look at the Web Design

Load the web design in your browser and browse to the News Overview page. This is what the news listing in your site should look like.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-web-design.png

Note that the main content area contains two colums:

  • left column: news list
  • right column: faceted navigation

The faceted navigation in the right column is out of scope for this sprint, so for now stick to the one column main content area and consider it the left column where the news list goes. You will add the additional column and its contents in the next development iteration.

Apply the Web Design to the News Overview Template

Load the web site in your browser:  http://localhost:8080/site/.

Browse to the News Overview page by clicking on the menu item 'news'. The out-of-the-box news listing is shown in the main content area, but it doesn't look very good: there is no styling whatsoever.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-unstyled.png

Open the file news.html found in the web design. Here you'll find the HTML markup for the news overview that you should use in the template.

Locate the element <div class="body-wrapper"> in news.html. This element contains the news listing.

Open the file repository-data/webfiles/src/main/resources/site/freemarker/hstdefault/newslist-main-newslist.ftl found in your Hippo CMS project. This is the Freemarker template for the news list component.

Note that this template includes another template to take care of the list pagination:

<#include "../include/pagination.ftl">

Apply the HTML markup for the news overview found in news.html to the Freemarker code in  newslist-main-newslist.ftl. Some hints:

  • A news article's image can be retrieved through the item's image property: item.image.
  • The 'large' variant of an image can be retrieved through the image's large property: item.image.large.
  • To get the URL for an image use the <@hst.link> tag just like you do for documents.
  • Make sure the keep the <@hst.manageContent> tag which renders an edit button in the channel preview.
  • Reuse the inclusion of the pagination template: you'll turn your attention to that template in a minute.

You should end up with something similar to this:

<#include "../include/imports.ftl">
<div class="body-wrapper">
  <div class="container">
    <div class="row">
      <div class="col-md-9 col-sm-9">
        <div class="news-overview">
          <#if pageable?? && pageable.items?has_content>
            <#list pageable.items as item>
              <@hst.link var="link" hippobean=item />
                <div class="blog-post has-edit-button">
                  <@hst.manageContent hippobean=item/>
                  <div class="blog-post-type">
                    <i class="icon-news"> </i>
                  </div>
                  <div class="blog-span">
                  <#if item.image?? && item.image.large??>              
                    <@hst.link var="img" hippobean=item.image.large />
                    <div class="blog-post-featured-img">
                      <a href="${link}"><img
                        src="${img}"
                        alt="${item.title?html}" /></a>
                    </div>
                  </#if>                  
                  <h2>
                    <a href="${link}">${item.title?html}</a>
                  </h2>
                  <div class="blog-post-body">
                    <p>${item.introduction?html}</p>
                  </div>
                  <div class="blog-post-details">
                    <div class="blog-post-details-item blog-post-details-item-left icon-calendar">
                      <#if item.date?? && item.date.time??>
                        <p><@fmt.formatDate value=item.date.time type="both" dateStyle="medium" timeStyle="short"/></p>
                      </#if>
                    </div>
                    <div class="blog-post-details-item blog-post-details-item-right">
                      <a href="${link}"> Read more<i class="fa fa-chevron-right"></i></a>
                    </div>
                  </div>
                </div>
              </div>
            </#list>
            <#if cparam.showPagination>
              <#include "../include/pagination.ftl">
            </#if>
          <#elseif editMode>
            <div>
              <img src="<@hst.link path='/images/essentials/catalog-component-icons/news-list.png'/>"> Click to edit News List
              <div class="has-new-content-button">
                <@hst.manageContent templateQuery="new-news-document" rootPath="news" defaultPath="${currentYear}/${currentMonth}"/>
              </div>
            </div>
          </#if>
        </div>
      </div>
    </div>
  </div>
</div>

Apply the Web Design to the Pagination Template

In news.html, locate the element <div class="pagination-container">. This element contains the page navigation for the list.

Open the file  repository-data/webfiles/src/main/resources/site/freemarker/include/pagination.ftl. This is the Freemarker template for the list pagination included from  newslist-main-newslist.ftl.

Apply the HTML markup for the pagination found in news.html to the Freemarker code in pagination.ftl. You should end up with something similar to this:

<#include "../include/imports.ftl">
<#if pageable??>
  <div class="pagination-container">
    <ul class="pagination">
    <#if pageable.totalPages gt 1>
      <#list pageable.pageNumbersArray as pageNr>
        <@hst.renderURL var="pageUrl">
          <@hst.param name="page" value="${pageNr}"/>
          <@hst.param name="pageSize" value="${pageable.pageSize}"/>
        </@hst.renderURL>
        <#if pageNr_index==0>
          <#if pageable.previous>
            <@hst.renderURL var="pageUrlPrevious">
              <@hst.param name="page" value="${pageable.previousPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlPrevious}"><span class="prev">Previous</span></a></li>
          <#else>
            <li class="disabled"><span class="prev">Previous</span></li>
          </#if>
        </#if>
        <#if pageable.currentPage == pageNr>
          <li><span class="current">${pageNr}</span></li>
          <#else >
            <li><a href="${pageUrl}">${pageNr}</a></li>
        </#if>
        <#if !pageNr_has_next>
          <#if pageable.next>
            <@hst.renderURL var="pageUrlNext">
              <@hst.param name="page" value="${pageable.nextPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlNext}"><span class="next">Next</span></a></li>
          <#else>
            <li class="disabled"><span class="next">Next</span></li>
          </#if>
        </#if>
      </#list>
    </#if>     
    </ul>
  </div>
</#if>

Load the site in your browser and browse to the News Overview. It should now look exactly like the web design. To test the pagination add some more news articles in the CMS.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-styled.png

Next Step

Configure the News Detail Page

Full Source Code

newslist-main-newslist.ftl

<#include "../include/imports.ftl">
<div class="body-wrapper">
  <div class="container">
    <div class="row">
      <div class="col-md-9 col-sm-9">
        <div class="news-overview">
          <#if pageable?? && pageable.items?has_content>
            <#list pageable.items as item>
              <@hst.link var="link" hippobean=item />
                <div class="blog-post has-edit-button">
                  <@hst.manageContent hippobean=item/>
                  <div class="blog-post-type">
                    <i class="icon-news"> </i>
                  </div>
                  <div class="blog-span">
                  <#if item.image?? && item.image.large??>              
                    <@hst.link var="img" hippobean=item.image.large />
                    <div class="blog-post-featured-img">
                      <a href="${link}"><img
                        src="${img}"
                        alt="${item.title?html}" /></a>
                    </div>
                  </#if>                  
                  <h2>
                    <a href="${link}">${item.title?html}</a>
                  </h2>
                  <div class="blog-post-body">
                    <p>${item.introduction?html}</p>
                  </div>
                  <div class="blog-post-details">
                    <div class="blog-post-details-item blog-post-details-item-left icon-calendar">
                      <#if item.date?? && item.date.time??>
                        <p><@fmt.formatDate value=item.date.time type="both" dateStyle="medium" timeStyle="short"/></p>
                      </#if>
                    </div>
                    <div class="blog-post-details-item blog-post-details-item-right">
                      <a href="${link}"> Read more<i class="fa fa-chevron-right"></i></a>
                    </div>
                  </div>
                </div>
              </div>
            </#list>
            <#if cparam.showPagination>
              <#include "../include/pagination.ftl">
            </#if>
          <#elseif editMode>
            <div>
              <img src="<@hst.link path='/images/essentials/catalog-component-icons/news-list.png'/>"> Click to edit News List
              <div class="has-new-content-button">
                <@hst.manageContent templateQuery="new-news-document" rootPath="news" defaultPath="${currentYear}/${currentMonth}"/>
              </div>
            </div>
          </#if>
        </div>
      </div>
    </div>
  </div>
</div>

pagination.ftl

<#include "../include/imports.ftl">
<#if pageable??>
  <div class="pagination-container">
    <ul class="pagination">
    <#if pageable.totalPages gt 1>
      <#list pageable.pageNumbersArray as pageNr>
        <@hst.renderURL var="pageUrl">
          <@hst.param name="page" value="${pageNr}"/>
          <@hst.param name="pageSize" value="${pageable.pageSize}"/>
        </@hst.renderURL>
        <#if pageNr_index==0>
          <#if pageable.previous>
            <@hst.renderURL var="pageUrlPrevious">
              <@hst.param name="page" value="${pageable.previousPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlPrevious}"><span class="prev">Previous</span></a></li>
          <#else>
            <li class="disabled"><span class="prev">Previous</span></li>
          </#if>
        </#if>
        <#if pageable.currentPage == pageNr>
          <li><span class="current">${pageNr}</span></li>
          <#else >
            <li><a href="${pageUrl}">${pageNr}</a></li>
        </#if>
        <#if !pageNr_has_next>
          <#if pageable.next>
            <@hst.renderURL var="pageUrlNext">
              <@hst.param name="page" value="${pageable.nextPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlNext}"><span class="next">Next</span></a></li>
          <#else>
            <li class="disabled"><span class="next">Next</span></li>
          </#if>
        </#if>
      </#list>
    </#if>     
    </ul>
  </div>
</#if>

Configure the News Overview Page

Previous Step

Configure the Home Page

With the Home page in place, let's move on to the News Overview page.

Take a Look at the Web Design

Load the web design in your browser and browse to the News Overview page. This is what the news listing in your site should look like.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-web-design.png

Note that the main content area contains two colums:

  • left column: news list
  • right column: faceted navigation

The faceted navigation in the right column is out of scope for this sprint, so for now stick to the one column main content area and consider it the left column where the news list goes. You will add the additional column and its contents in the next development iteration.

Apply the Web Design to the News Overview Template

Load the web site in your browser:  http://localhost:8080/site/.

Browse to the News Overview page by clicking on the menu item 'news'. The out-of-the-box news listing is shown in the main content area, but it doesn't look very good: there is no styling whatsoever.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-unstyled.png

Open the file news.html found in the web design. Here you'll find the HTML markup for the news overview that you should use in the template.

Locate the element <div class="body-wrapper"> in news.html. This element contains the news listing.

Open the file repository-data/webfiles/src/main/resources/site/freemarker/hstdefault/newslist-main-newslist.ftl found in your Hippo CMS project. This is the Freemarker template for the news list component.

Note that this template includes another template to take care of the list pagination:

<#include "../include/pagination.ftl">

Apply the HTML markup for the news overview found in news.html to the Freemarker code in  newslist-main-newslist.ftl. Some hints:

  • A news article's image can be retrieved through the item's image property: item.image.
  • The 'large' variant of an image can be retrieved through the image's large property: item.image.large.
  • To get the URL for an image use the <@hst.link> tag just like you do for documents.
  • Make sure the keep the <@hst.manageContent> tag which renders an edit button in the channel preview.
  • Reuse the inclusion of the pagination template: you'll turn your attention to that template in a minute.

You should end up with something similar to this:

<#include "../include/imports.ftl">
<div class="body-wrapper">
  <div class="container">
    <div class="row">
      <div class="col-md-9 col-sm-9">
        <div class="news-overview">
          <#if pageable?? && pageable.items?has_content>
            <#list pageable.items as item>
              <@hst.link var="link" hippobean=item />
                <div class="blog-post has-edit-button">
                  <@hst.manageContent hippobean=item/>
                  <div class="blog-post-type">
                    <i class="icon-news"> </i>
                  </div>
                  <div class="blog-span">
                  <#if item.image?? && item.image.large??>              
                    <@hst.link var="img" hippobean=item.image.large />
                    <div class="blog-post-featured-img">
                      <a href="${link}"><img
                        src="${img}"
                        alt="${item.title?html}" /></a>
                    </div>
                  </#if>                  
                  <h2>
                    <a href="${link}">${item.title?html}</a>
                  </h2>
                  <div class="blog-post-body">
                    <p>${item.introduction?html}</p>
                  </div>
                  <div class="blog-post-details">
                    <div class="blog-post-details-item blog-post-details-item-left icon-calendar">
                      <#if item.date?? && item.date.time??>
                        <p><@fmt.formatDate value=item.date.time type="both" dateStyle="medium" timeStyle="short"/></p>
                      </#if>
                    </div>
                    <div class="blog-post-details-item blog-post-details-item-right">
                      <a href="${link}"> Read more<i class="fa fa-chevron-right"></i></a>
                    </div>
                  </div>
                </div>
              </div>
            </#list>
            <#if cparam.showPagination>
              <#include "../include/pagination.ftl">
            </#if>
          <#elseif editMode>
            <div>
              <img src="<@hst.link path='/images/essentials/catalog-component-icons/news-list.png'/>"> Click to edit News List
              <div class="has-new-content-button">
                <@hst.manageContent templateQuery="new-news-document" rootPath="news" defaultPath="${currentYear}/${currentMonth}"/>
              </div>
            </div>
          </#if>
        </div>
      </div>
    </div>
  </div>
</div>

Apply the Web Design to the Pagination Template

In news.html, locate the element <div class="pagination-container">. This element contains the page navigation for the list.

Open the file  repository-data/webfiles/src/main/resources/site/freemarker/include/pagination.ftl. This is the Freemarker template for the list pagination included from  newslist-main-newslist.ftl.

Apply the HTML markup for the pagination found in news.html to the Freemarker code in pagination.ftl. You should end up with something similar to this:

<#include "../include/imports.ftl">
<#if pageable??>
  <div class="pagination-container">
    <ul class="pagination">
    <#if pageable.totalPages gt 1>
      <#list pageable.pageNumbersArray as pageNr>
        <@hst.renderURL var="pageUrl">
          <@hst.param name="page" value="${pageNr}"/>
          <@hst.param name="pageSize" value="${pageable.pageSize}"/>
        </@hst.renderURL>
        <#if pageNr_index==0>
          <#if pageable.previous>
            <@hst.renderURL var="pageUrlPrevious">
              <@hst.param name="page" value="${pageable.previousPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlPrevious}"><span class="prev">Previous</span></a></li>
          <#else>
            <li class="disabled"><span class="prev">Previous</span></li>
          </#if>
        </#if>
        <#if pageable.currentPage == pageNr>
          <li><span class="current">${pageNr}</span></li>
          <#else >
            <li><a href="${pageUrl}">${pageNr}</a></li>
        </#if>
        <#if !pageNr_has_next>
          <#if pageable.next>
            <@hst.renderURL var="pageUrlNext">
              <@hst.param name="page" value="${pageable.nextPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlNext}"><span class="next">Next</span></a></li>
          <#else>
            <li class="disabled"><span class="next">Next</span></li>
          </#if>
        </#if>
      </#list>
    </#if>     
    </ul>
  </div>
</#if>

Load the site in your browser and browse to the News Overview. It should now look exactly like the web design. To test the pagination add some more news articles in the CMS.

//onehippo-prod.global.ssl.fastly.net/binaries/ninecolumn/content/gallery/connect/trails/build-a-website/developer-trail-10.0/sprint-1/news-overview/news-overview-styled.png

Next Step

Configure the News Detail Page

Full Source Code

newslist-main-newslist.ftl

<#include "../include/imports.ftl">
<div class="body-wrapper">
  <div class="container">
    <div class="row">
      <div class="col-md-9 col-sm-9">
        <div class="news-overview">
          <#if pageable?? && pageable.items?has_content>
            <#list pageable.items as item>
              <@hst.link var="link" hippobean=item />
                <div class="blog-post has-edit-button">
                  <@hst.manageContent hippobean=item/>
                  <div class="blog-post-type">
                    <i class="icon-news"> </i>
                  </div>
                  <div class="blog-span">
                  <#if item.image?? && item.image.large??>              
                    <@hst.link var="img" hippobean=item.image.large />
                    <div class="blog-post-featured-img">
                      <a href="${link}"><img
                        src="${img}"
                        alt="${item.title?html}" /></a>
                    </div>
                  </#if>                  
                  <h2>
                    <a href="${link}">${item.title?html}</a>
                  </h2>
                  <div class="blog-post-body">
                    <p>${item.introduction?html}</p>
                  </div>
                  <div class="blog-post-details">
                    <div class="blog-post-details-item blog-post-details-item-left icon-calendar">
                      <#if item.date?? && item.date.time??>
                        <p><@fmt.formatDate value=item.date.time type="both" dateStyle="medium" timeStyle="short"/></p>
                      </#if>
                    </div>
                    <div class="blog-post-details-item blog-post-details-item-right">
                      <a href="${link}"> Read more<i class="fa fa-chevron-right"></i></a>
                    </div>
                  </div>
                </div>
              </div>
            </#list>
            <#if cparam.showPagination>
              <#include "../include/pagination.ftl">
            </#if>
          <#elseif editMode>
            <div>
              <img src="<@hst.link path='/images/essentials/catalog-component-icons/news-list.png'/>"> Click to edit News List
              <div class="has-new-content-button">
                <@hst.manageContent templateQuery="new-news-document" rootPath="news" defaultPath="${currentYear}/${currentMonth}"/>
              </div>
            </div>
          </#if>
        </div>
      </div>
    </div>
  </div>
</div>

pagination.ftl

<#include "../include/imports.ftl">
<#if pageable??>
  <div class="pagination-container">
    <ul class="pagination">
    <#if pageable.totalPages gt 1>
      <#list pageable.pageNumbersArray as pageNr>
        <@hst.renderURL var="pageUrl">
          <@hst.param name="page" value="${pageNr}"/>
          <@hst.param name="pageSize" value="${pageable.pageSize}"/>
        </@hst.renderURL>
        <#if pageNr_index==0>
          <#if pageable.previous>
            <@hst.renderURL var="pageUrlPrevious">
              <@hst.param name="page" value="${pageable.previousPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlPrevious}"><span class="prev">Previous</span></a></li>
          <#else>
            <li class="disabled"><span class="prev">Previous</span></li>
          </#if>
        </#if>
        <#if pageable.currentPage == pageNr>
          <li><span class="current">${pageNr}</span></li>
          <#else >
            <li><a href="${pageUrl}">${pageNr}</a></li>
        </#if>
        <#if !pageNr_has_next>
          <#if pageable.next>
            <@hst.renderURL var="pageUrlNext">
              <@hst.param name="page" value="${pageable.nextPage}"/>
              <@hst.param name="pageSize" value="${pageable.pageSize}"/>
            </@hst.renderURL>
            <li><a href="${pageUrlNext}"><span class="next">Next</span></a></li>
          <#else>
            <li class="disabled"><span class="next">Next</span></li>
          </#if>
        </#if>
      </#list>
    </#if>     
    </ul>
  </div>
</#if>