Joomla! World Conference 2026

6 minutes reading time (1118 words)

How to create a conference website with Joomla Core

February-Conference-1

Building a conference (or any other) website doesn’t begin with design; it starts with a clear plan for content and functionality. As developers and organizers, we know a beautiful site is useless without a strategically organized approach. In this article we'll explore how to make the most of Joomla Core to build a conference website that delivers.

Step 1: Define the structure

Our conference website should consist of the following menu items:

  • Startpage
  • News
  • Location and Accomodation
  • Tickets
  • Speakers
  • Program
  • Sponsors
  • Legal notes, Terms & Conditions, Privacy Policy

Step 2: Define functionality

  • Speakers should be able to register, submit talks and edit a profile with photo and bio
  • The team should be able to review and publish accepted talks / speakers

Step 3: Define content types

Defining content types is helpful to decide if there is a need for an extension or if Core is enough.

Startpage

Banner with logo, date and location: Custom Module

Welcoming text: Article as main content

News: Articles Module

News

Articles as category blog

Location

Single article

Tickets

Extension or external service

Speakers

Contacts component: offers connection between articles (talks) and users (speakers)

Program

Articles as category blog (override) or Articles Module

Sponsors

Articles Module

General information

(Legal notes, Terms & Conditions, Privacy Policy)

Single articles

After checking some event extensions, we decided to go with just Core.

In this article I will go into the details for the “Call for Speakers”.

Step 4: Preparatives

  • Create a user group “Speakers” as a child from “Registered”
  • Allow user registration with activation by the user
  • Create a category “Talks” and give the user group “Speakers” permission to create and edit own articles
  • Create a contact category “Speakers” and give the user group “Speakers” permission to edit own
  • Activate the plugin “User - Contact Creator” setting category “Speakers” as default and “Automatically Publish the Contact” to No. The plugin will automatically create a contact when a user register into the website
  • Create a menu item for registration
  • Create menu items for login and logout
  • Create an article “Thank you” with information about the next steps and link to it in a menu item (hidden)
  • Create an article “My page” and the corresponding menu item, here we will publish specific information for the logged in speaker
  • Create a menu item to submit an article, in the options specify the category “Talks” and redirect the user to the “Thank you” page after submission
  • For a better overview put the menu items related to Speakers into an own menu (Speakers Menu) with following access levels:
    • “Register” -> guest access
    • “Submit talk” -> registered access
    • “My page” -> registered access
    •  “Logout” -> registered access
    • “Thank you” -> registered access and hidden

Registration and login

The Joomla core functions are fine and don't need further work.

Submit article (talk)

A talk is a Joomla article and the submission should be as easy as possible. A talk needs a title and a description. Since our conference will offer talks in English and in German, we want to ask the preference of the speaker. For that we create a custom field of type radio with the options: English, German and No preferences. Furthermore we offer the possibility to give the talk from remote. Here we need also a radio custom field with the options: Live, Online and I don’t know yet.

To make the submission of a talk easy we will create an override of com_content/form/edit.php. In the override we remove the tabs layout and all (for our usecase) unnecessary elements and render the custom field manually:

<?php

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

defined('_JEXEC') or die;

use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Multilanguage;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;

/** @var \Joomla\Component\Content\Site\View\Form\HtmlView $this */
/** @var Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $this->getDocument()->getWebAssetManager();
$wa->useScript('keepalive')
    ->useScript('form.validate')
    ->useScript('com_content.form-edit');

$this->tab_name = 'com-content-form';
$this->ignore_fieldsets = ['image-intro', 'image-full', 'jmetadata', 'item_associations'];
$this->useCoreUI = true;

// Create shortcut to parameters.
$params = $this->state->get('params');

// This checks if the editor config options have ever been saved. If they haven't they will fall back to the original settings
if (!$params->exists('show_publishing_options')) {
    $params->set('show_urls_images_frontend', '0');
}
?>
<div class="edit item-page">
    <?php if ($params->get('show_page_heading')) : ?>
    <div class="page-header">
        <h1>
            <?php echo $this->escape($params->get('page_heading')); ?>
        </h1>
    </div>
    <?php endif; ?>

    <form action="<?php echo Route::_('index.php'); ?>" method="post" name="adminForm" id="adminForm" class="form-validate form-vertical">
        <fieldset>

            <?php echo $this->form->renderField('catid'); ?>

            <?php echo $this->form->renderField('title'); ?>

            <?php if (is_null($this->item->id)) : ?>
                <?php $this->form->setFieldAttribute('alias', 'type', 'hidden'); ?>
                <?php echo $this->form->renderField('alias'); ?>
            <?php endif; ?>

            <?php echo $this->form->renderField('language', 'com_fields'); ?>

            <?php echo $this->form->renderField('typ', 'com_fields'); ?>

            <?php echo $this->form->renderField('articletext'); ?>

            <?php if ($this->captchaEnabled) : ?>
                <?php echo $this->form->renderField('captcha'); ?>
            <?php endif; ?>

            <?php if ($this->item->params->get('access-change')) : ?>
                <?php echo $this->form->renderField('featured'); ?>
                <?php if ($params->get('show_publishing_options', 1) == 1) : ?>
                    <?php echo $this->form->renderField('featured_up'); ?>
                    <?php echo $this->form->renderField('featured_down'); ?>
                    <?php echo $this->form->renderField('publish_up'); ?>
                    <?php echo $this->form->renderField('publish_down'); ?>
                <?php endif; ?>
            <?php endif; ?>

             <?php if (Multilanguage::isEnabled()) : ?>
                <?php $this->form->setFieldAttribute('language', 'type', 'hidden'); ?>
                <?php echo $this->form->renderField('language'); ?>
            <?php endif; ?>

            <?php echo $this->form->renderControlFields(); ?>
        </fieldset>
        <div class="d-grid gap-2 d-sm-block mb-2">
            <button type="button" class="btn btn-primary" data-submit-task="article.apply">
                <span class="icon-check" aria-hidden="true"></span>
                <?php echo Text::_('JSAVE'); ?>
            </button>
            <button type="button" class="btn btn-primary" data-submit-task="article.save">
                <span class="icon-check" aria-hidden="true"></span>
                <?php echo Text::_('JSAVEANDCLOSE'); ?>
            </button>
            <?php if ($this->showSaveAsCopy) : ?>
                <button type="button" class="btn btn-primary" data-submit-task="article.save2copy">
                    <span class="icon-copy" aria-hidden="true"></span>
                    <?php echo Text::_('JSAVEASCOPY'); ?>
                </button>
            <?php endif; ?>
            <button type="button" class="btn btn-danger" data-submit-task="article.cancel">
                <span class="icon-times" aria-hidden="true"></span>
                <?php echo Text::_('JCANCEL'); ?>
            </button>
            <?php if ($params->get('save_history', 0) && $this->item->id) : ?>
                <?php echo $this->form->getInput('contenthistory'); ?>
            <?php endif; ?>
        </div>
    </form>
</div>

The form looks like this:

Edit form in frontend

Fields

The website will be at least bilingual (English and German). In order to get the custom fields in the two languages we use language strings and language overrides for the labels and the values:

Screenshot of the a field in backend

Screenshot of the language strings

Editor

As you can see in the submit form above the editor field offers very little formatting options. That is on purpose and we achieve that modifying the sets in the TinyMCE plugin:

Screenshot of TinyMCE's configuration

The button “CMS content” can be removed changing the access level of the editor buttons plugins:

Button plugins in backend

After submission

After submitting a talk the speaker will be redirected to the “Thank you” page:

Screenshot of the thank you page

What happens next? I will show you that in the next article ;-) Stay tuned!

The development of the Joomla World Conference 2026 website (conference.joomla.org) is nearing completion, and we’re thrilled to announce that ticket sales will be opening shortly! This article has showcased the strategic planning behind this exciting initiative. Now it’s your turn to get involved. Submit your talk proposals and prepare to join us on October 16-18, in Potsdam, Germany, for an exceptional Joomla experience.


Read this in Italian: https://www.joomlaitalia.it/guide-e-tutorial/traduzioni-joomla-magazine/come-creare-un-sito-web-per-conferenze-con-joomla-core 

Some articles published on the Joomla Community Magazine represent the personal opinion or experience of the Author on the specific topic and might not be aligned to the official position of the Joomla Project

3
The February Issue
 

Comments 1

Already Registered? Login Here
Eoin on Tuesday, 10 March 2026 11:10
What a fantastic example of what can be achieved with the core.

This is such a great example of how to use the core! I really like the ignore_fieldsets part as I had no idea that was possible. Most of this I would have overlooked and not realised could be achieved like this. What a great example.

0
This is such a great example of how to use the core! I really like the ignore_fieldsets part as I had no idea that was possible. Most of this I would have overlooked and not realised could be achieved like this. What a great example.

By accepting you will be accessing a service provided by a third-party external to https://magazine.joomla.org/