Brian's Blog Homepage
Wearing a filter in the lab

Showcasing the power of Joomla 4 out of the box with no additional extensions I produced this website (https://brianstest.site). One of the features I created was a masonry style view (https://brianstest.site/trips) with no javascript or css edits - just some simple template overrides.

The tutorial below is for creating a simpler version of that view using tags instead of custom fields. A custom fields version will follow.

 

Setup

  • Create a single category called Holiday

  • Create the tags you need to filter the content eg Beach, Nature, City, Historic

  • Create multiple articles in the Holiday category

    • Add Tags to each article
    • Add Readmore to each article
  • Create a menu item of type Articles->Category Blog

    • Set the Blog Layout as follows

      • 0 Leading Articles
      • 9 Intro Articles
      • 3 Columns
      • Multi Column Direction - Across
    • Set the Options as follows

      • Intro Text - Show
      • Category - Hide
      • Author - Hide
      • Create Date (etc) - Hide
      • Tags - Show
  • Edit the Holiday category and add all the tags

Template Override 1

  • Create overrides for Layouts->joomla->content

  • Create a new file called filters.php in the folder /templates/template_name/html/layouts/joomla/content

  • Paste the code below into that file and save

    <?php
    
    defined('_JEXEC') or die;
    
    ?>
    <?php if (!empty($displayData)) : ?>
        <?php foreach ($displayData as $i => $tag) : ?>
            <input type="checkbox" class="btn-check" name="CheckBox" id="<?php echo $tag->alias; ?>" value="<?php echo $tag->alias; ?>">
            <label class="btn btn-outline-primary btn-sm" for="<?php echo $tag->alias; ?>"><?php echo $tag->title; ?></label>
        <?php endforeach; ?>
    <?php endif; ?>

Template Override 2

  • Create overrides for Components->com_content->category

  • Open the override for /templates/template_name/html/com_content/category/blog.php

  • Insert the code below before line 36

    $tags = $this->category->tags->itemTags;
    $filter = implode(
        ',',
        array_map(
           fn(object $tag): string => '[value="' . $tag->alias . '"]:checked ~ .blog-items .blog-item:not([data-category~="' . $tag->alias . '"])',
           ($this->category?->tags?->itemTags ?? []) ?: []
        )
     );
    /** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
    $wa = Factory::getApplication()->getDocument()->getWebAssetManager();
    $wa->addInlineStyle($filter . '{display: none; opacity: none;}');
    
    

     

  • On new line 63 replace joomla.content.tags with joomla.content.filters

    Around line 105 delete the highlighted code below

  • Save & Close the file.

Template Override 3

  • Open the override for /templates/template_name/html/com_content/category/blog_item.php

  • Before line 35 insert the following code

    <div class="com-content-category-blog__item blog-item"
        itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting"
            data-category="
                <?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
                    <?php foreach ($this->item->tags->itemTags as $tag) { echo $tag->alias . ' '; }; ?>
                <?php endif; ?>
            ">
    
  • At the very end of the file insert the following code

    </div>
    

     

  •  

    animation of the masonry layout 

J o o m l a !

Brian Teeman

Brian Teeman wearing glasses and clean shaven

Who is Brian?

As a co-founder of Joomla! and OpenSourceMatters Inc I've never been known to be lacking an opinion or being too afraid to express it.

Despite what some people might think I'm a shy and modest man who doesn't like to blow his own trumpet or boast about achievements.

Where is Brian?

custom converse sneakers in the joomla colour scheme with the text joomla rocks embroidered on the heel