Search Here:

Happy 20th Anniversary

Happy 20th Anniversary

bilal ayadi k8Lp1IOsZt4 unsplashPhoto by Bilal Ayadi on Unsplash

 

Over two decades, the project has embodied three core values: freedom (open licensing and transparent governance), flexibility (a powerful extension ecosystem and robust templating), and innovation (modern architecture, accessibility, and performance improvements across major releases).

Looking Back

  • 2005: The community launches Joomla, establishing a vibrant new chapter for open-source CMS development.
  • 1.x–2.x: Rapid adoption, a growing extension directory, and a strong developer ecosystem.
  • 3.x: Responsive templates, improved UX, and a mature ACL framework become hallmarks of the platform.
  • 4.x–5.x: Accessibility-first design, performance gains, modern PHP standards, and streamlined workflows for administrators and developers.

The Community

Joomla’s success is powered by people—maintainers, extension developers, designers, translators, documentation teams, event organizers, and users worldwide. Their volunteer spirit and shared purpose have sustained the project’s momentum and quality for two decades.

Why Joomla Still Matters

  • Open and sustainable: Community-driven governance and transparent development.
  • Built-in power: Advanced ACL, multilingual support, and content workflows out of the box.
  • Extensible by design: Thousands of extensions and flexible templating for custom solutions.
  • Secure and performant: Ongoing security reviews, modern PHP standards, and performance enhancements.

Looking Ahead

As we celebrate 20 years, we also look to the future: continued improvements in usability, accessibility, and developer experience; deeper integration with modern tooling; and a renewed focus on performance and sustainability. The roadmap remains guided by real-world needs and the open-source ethos that has defined Joomla from the start.

Thank you to everyone who has contributed time, code, documentation, support, and inspiration. Joomla is more than software—it is a community that builds the web together.

Happy 20th Birthday, Joomla! Here’s to the next chapter.

Override Subforms in Joomla 4

In Joomla 4, we were introduced to “subforms”, which are great for creating more user-friendly fields for your articles or page, containing the fields in the subform.


The problem is that when you create a subform, the fields in the subform are divided by a comma. This doesn’t look good on your pages, so to solve this problem, we can override the default subform of Joomla.

To achieve this, you need to create an override for the subform. This can be done by creating a new file in the html folder of your template. Here you can read more about "how do I get a Subform to look better".

Go to System > Site Templates.

Templates Details and Files - Main

Choose your template by selecting it. In this example, we will use the default J4 template “Cassiopeia”, so go into “Cassiopeia Details and Files”.

Select “Create Overrides” > Plugins > fields > subform

Create overrides for Cassiopeia - Main

You need to open the file in the Joomla Editor located in the “html” folder. Navigate to the file “subform.php” in the folder ”/templates/cassiopeia/html/plg_fields_subform”. The file should look like this:

<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Subform
 *
 * @copyright   (C) 2019 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;

defined('_JEXEC') or die;

if (!$context || empty($field->subform_rows))
{
	return;
}

$result = '';

// Iterate over each row that we have
foreach ($field->subform_rows as $subform_row)
{
	// Placeholder array to generate this rows output
	$row_output = array();

	// Iterate over each sub field inside of that row
	foreach ($subform_row as $subfield)
	{
		$class   = trim($subfield->params->get('render_class', ''));
		$layout  = trim($subfield->params->get('layout', 'render'));
		$content = trim(
			FieldsHelper::render(
				$context,
				'field.' . $layout, // normally just 'field.render'
				array('field' => $subfield)
			)
		);

		// Skip empty output
		if ($content === '')
		{
			continue;
		}

		// Generate the output for this sub field and row
		$row_output[] = '<span class="field-entry' . ($class ? (' ' . $class) : '') . '">' . $content . '</span>';
	}

	// Skip empty rows
	if (count($row_output) == 0)
	{
		continue;
	}

	$result .= '<li>' . implode(', ', $row_output) . '</li>';
}
?>

<?php if (trim($result) != '') : ?>
	<ul class="fields-container">
		<?php echo $result; ?>
	</ul>
<?php endif; ?>

 

Now Change the code in line 56 from this:

	$result .= '<li>' . implode(', ', $row_output) . '</li>';

To this:

	$result .= '<li>' . implode('<span class="field-divider">,</span> ', $row_output) . '</li>';

 

Then simply put this in "user.css":

.field-divider { display: none; }

Comments wanted

- LET ME KNOW IF YOU KNOW ANY OTHER WAYS TO DO THIS IN THE COMMENTS BELOW -

No comments

Leave your comment

In reply to Some User

nordvpn