Templatejoomla.com, tout ce qu'il faut savoir sur ce projet

Templatejoomla.com, tout ce qu'il faut savoir sur ce projet

Vous en avez peut-être déjà entendu parlé, le projet templatejoomla.com est en ligne depuis quelques semaines maintenant. A ce jour, c'est de loin le plus grand annuaire de templates pour Joomla 4, puisque plus de 1500 templates y sont déjà répertoriés. Cela demontre que l'éco-système de Joomla est très dynamique !

Au delà des nombres, je vais vous expliquer pourquoi ce projet a vu le jour, quels choix techniques ont été faits et comment nous avons créé cet annuaire de templates pour Joomla de cette manière. Et parce que le partage est une valeur essentielle à mes yeux, vous pourrez télécharger une copie du site si vous souhaitez le répliquer pour n'importe quel type de projet (personnel ou professionnel) :)

Pour vous expliquer en détail tous les aspects de ce projet, j'ai répertorié 10 questions intéressantes que nous avons reçu à propos de templatejoomla.com
Si vous avez d'autres questions, la section des commentaires en bas d'article vous attend.

Il y a déjà des annuaires de ce genre, aussi pourquoi avoir créé celui-ci?

La première réponse à cette question pourrait être: pourquoi pas?

Après tout, il y a déjà des annuaires de thèmes et de templates sur Internet mais nous avons pensé qu'un nouveau qui ne serait dédié qu'à Joomla 4 serait une bonne nouvelle pour Joomla, pour son écosystème et pour toute la Communauté.

A templatejoomla.com, nous ne craignons pas la concurrence et nous croyons fermement en la complémentarité des projets. Plus il y aura des projets comme celui-ci en ligne, plus ce sera le signe d'un écosystème dynamique et d'un CMS vivant.
Naturellement, vous pouvez avoir une opinion différente.

De plus, de nombreuses personnes au sein de la Communauté souhaitaient disposer d'un répertoire officiel de templates Joomla, mais cela ne s'est jamais produit. Ce site est une modeste réponse à cette demande car il s'agit d'un projet purement personnel et non soutenu par l'OSM.

Mais il y a d'autres raisons, comme par exemple:

  • Il y a des tonnes de sites en Joomla 3 a migrer en Joomla 4 et beaucoup vont devoir / vouloir changer leur template.
    La migration est toujours une période délicate pour les propriétaires de sites et certains d'entre eux pourraient être tentés de passer à une autre plate-forme s'ils ne trouvaient pas le template parfait pour leur site Web Joomla 4. Ce projet a principalement été construit et pensé pour tous ces sites à migrer.
  • Pour mettre en avant l'incroyable pro-activité et l'infinie créativité des templaters Joomla listés ici.
    Un an seulement après la sortie de Joomla 4, il y a déjà plus de 1300 templates Joomla, gratuits et premium. Chers templaters Joomla, vous démontrez que vous êtes les meilleurs. Bravo les gars !
  • Parce que Joomla 4 est une fantastique version majeure et que nous devons être fiers et le dire haut et fort
    Nous sommes convaincus que cette excellente version apportera de nouveaux utilisateurs à Joomla. Nous avons construit templateJoomla.com pour offrir une belle vitrine à Joomla 4 et pour aider ces nouveaux arrivants à trouver le meilleur template pour leurs projets.
  • pour soutenir l'écosystème Joomla car nous avons tous besoin les uns des autres.
    Les développeurs ont besoin des créateurs de sites qui ont besoin de la Communauté, etc. Nous sommes tous du même côté, avec la même passion pour Joomla. Chacun de nous peut faire beaucoup pour Joomla, c'est juste une question de temps et de volonté. Comme le colibri, nous faisons notre part pour Joomla avec templateJoomla.com :)

Prévoyez-vous d'afficher le score Core Vitals Web pour chaque template?

Non principalement pour une bonne raison très logique.

Pour afficher le scores Core Vitals Web d'un template, il faut installer le template sur un serveur et le tester en conséquence. Et si vous voulez obtenir des scores pertinents et valides, vous devez tester tous les templates sur le même serveur. Si vous testez le template affiché sur le site d'un développeur ou sur une très grosse marketplace, les scores ne seront pas pertinents car tous les serveurs n'ont pas la même configuration.

L'affichage d'informations est une excellente chose pour les utilisateurs finaux, tant que ces informations sont valides, pertinentes et réelles.

Quelles sont les conditions requises pour qu'un templater soit répertorié sur templatejoomla.com?

Sauf si ce templater a été banni de la communauté Joomla, nous acceptons tous les templates Joomla 4 de chaque templater. Il peut s'agir d'un template frontend ou backend, tant que c'est pour Joomla 4. Donc, en gros, nous acceptons tous les templates de tous les templaters.

Si vous proposez des templates Joomla 4 qui ne sont pas encore répertoriés sur templatejoomla.com, nous serions ravis d'échanger avec vous dès que possible.

Si vous connaissez un templater qui pourrait être intéressé pour afficher ses créations dans l'annuaire des templates Joomla 4, contactez-nous s'il vous plaît.

Pouvez-vous nous détailler le processus que vous utilisez pour ajouter un nouveau template?

Bien sur, voyons cela en détail.
D'abord, nous créons un nouvel article dans le panneau d'administration et nous ajoutons les informations suivantes:

  • le titre de l'article: le nom du template
  • le contenu de l'article: une brève description du template
  • les tags: la version du template (J4 et J3)
  • La note: le nom du templater (sert uniquement pour filtrer les articles en backend)
Adding a new item in the Joomla templates directory
  • l'image d'intro: la capture d'écran du template - c'est la partie la plus longue du processus car nous redimensionnons chaque image aux bonnes dimensions avant de les charger sur le site.
  • Le lien A: l'URL de la page du template
  • le texte URL A: le nom du template
Adding a new item in templatejoomla.com
  • le modèle économique du template
  • le framework du template
  • la categorie
  • le templater
Adding a new item in the Joomla templates directory
  • la date de publication: nous ajoutons ici la dernière date connue du template (création ou mise à jour). Dans certains cas, nous avons indiqué la dernière date de mise à jour du framework.

Lorsque nous disposons de toutes les informations, il ne faut que quelques minutes pour ajouter une nouveau template dans l'annuaire.

Comment est géré le filtrage des templates?

Pour cela, nous avons choisi d'utiliser le module gratuit JL Content Fields Filter de Joomline.

Concrétement, les informations sont saisies dans des champs personnalisés dans le backend et le module permet au visiter de filtrer les articles sur le frontend. Le module fonctionne parfaitement et il est très simple à configurer.
C'est simple, c'est gratuit et c'est parfait!

Cependant, il y a un point à améliorer. En effet, les ARIA ID des labels générées par le module ne sont pas uniques, ce qui pénalise l'accessibilité. J'ai envoyé cette information à l'équipe de Joomline et on peut espérer une mise à jour de leur module.

Accessibility templatejoomla.com

Quelles extensions avez-vous installé pour créer le site?

Parce que "light is right", nous voulions utiliser les fonctions natives de Joomla 4 autant que possible. Ainsi, le site est construit avec Joomla 4 et Cassiopeia.
Nous avons seulement ajouté les extensions suivantes:

  • JL Content Fileds Filter: pour le filtrage des templates
  • AJAX Infinity: ajout du scroll infini sur la page des templates
  • JCH Optimize
  • Akeeba Backup
  • JSitemap Pro
  • itcs Matomo

Pour résumer, le site n'utilise que 5 modules (dont 4 natifs) et nous n'avons ajouté que 20 lignes de CSS. Comme vous pouvez le constater, il n'y a pas besoin d'installer de nombreuses extensions pour créer un (super) site web car Joomla 4 est nativement très puissant.

Dans quel ordre les templates Joomla sont-ils affichés?

La page d'accueil du site est un simple élément de menu de type Blog d'une catégorie.

Très logiquement, nous avons décidé de privilégier les templaters qui maintiennent à jour leurs templates. Ainsi, les templates Joomla 4 récemment créés ou mis à jour sont affichés en premier.

Quelles overrides avez-vous créés pour cet annuaire de templates Joomla 4?

Bien sûr, pour coller le plus possible au noyau et parce que Joomla est très puissant, nous avons créé quelques overrides, comme d'habitude.

Les premières concernent l'en-tête du site. Nous voulions rendre l'en-tête aussi mince et aussi simple que possible. Voici les overrides créés avec quelques explications.

Pour afficher le nom du site et son slogan, nous avons utilisé un module mod_custom affiché en position menu:

<!-- Desktop Tablette -->
<div class="ps-5 ms-5 navbar-brand navbar-brand d-none d-md-block">
	<a class="brand-logo text-decoration-none" href="/">
    	<span class="fw-bold" title="TemplateJoomla">TemplateJoomla</span>
  	</a>
  <div class="site-description small fst-italic">Joomla Template Directory</div>
</div>

<!-- Mobile -->
<div class="ms-4 navbar-brand  d-md-none">
 	<div class="ms-2">
     	<div>
          	<a class="fs-2 text-decoration-none" href="/"> 
      		<span class="fw-bold" title="web-eau.net">TemplateJoomla</span>
      		</a>
      	</div>
    </div>  
</div>

Ensuite, le menu principal est affiché avec un module mod_menu en position menu.

le dernier module affiche les textes au dessus des filtres et pour cela, nous avons utilisé un module mod_articles_latest où le code a été totalement supprimé et remplacé par celui-ci:

<?php
/**
 * @package     Joomla.Site
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/mod_articles_latest/header-homepage.php
 */

defined('_JEXEC') or die;

$model = JModelLegacy::getInstance('Articles', 'ContentModel', array( 'ignore_request' => true )); // add ignore_request
$params = JFactory::getApplication()->getParams();
$model->setState('params', $params); 
$model->setState('filter.category_id', 2); 
$num_articles = $model->getTotal();
?>

<div class="p-5 bleu bg-white text-center">
  <h1 class="display-6 lh-base">You need a new template for your Joomla site?</h1>
<h2 class="display-6 lh-base pb-4">There are  <span class="fw-bolder"><?php echo $num_articles; ?></span> Joomla 4 templates listed here for you!
  <br /><span class="fs-4">Recently created or updated templates are displayed first</span>
</div>

Puis, nous avons créé les overrides pour l'affichage du blog. Parce qu'une image vaut 1000 mots, voici les codes de ces overrides:

<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/com_content/category/blog_item.php
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
use Joomla\Component\Content\Site\Helper\RouteHelper;

// Create a shortcut for params.
$params = $this->item->params;
$canEdit = $this->item->params->get('access-edit');
$info    = $params->get('info_block_position', 2);

// Check if associations are implemented. If they are, define the parameter.
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));

$currentDate   = Factory::getDate()->format('d M Y H:i:s');
$isUnpublished = ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED || $this->item->publish_up > $currentDate)
	|| ($this->item->publish_down < $currentDate && $this->item->publish_down !== null);
?> 

<!-- Intro image -->
<?php if($this->item->catid == 2){?>   
<?php $images  = json_decode($this->item->images);?>
<?php $urls = json_decode($this->item->urls, true);?>
<div class="w-100 text-center rounded-top item-image">
	<a target="_blank" href="<?php echo $urls['urla'];?>" itemprop="url" title="<?php echo $urls['urlatext'];?> Joomla template">
		<img class="img-fluid" src="<?php echo $images->image_intro;?>" itemprop="thumbnailUrl" width="100%" height="211" loading="lazy" alt="<?php echo $urls['urlatext'];?> Joomla template"/>
		</a>
</div>
<?php }else{ echo LayoutHelper::render('joomla.content.intro_image', $this->item); }?>


<!-- Title + tags + hits + intro text -->
<div class="rounded-bottom item-content py-3 ps-3 bg-white">
	<?php if ($isUnpublished) : ?>
		<div class="system-unpublished">
	<?php endif; ?>

	<!-- title -->
    <?php if($this->item->catid == 2){?> 
       <div class="d-flex flex-row">
         <div class="">
			<h3 class="fs-3" itemprop="name">
 				<a target="_blank" href="<?php echo $urls['urla'];?>" itemprop="url" title="<?php echo $urls['urlatext'];?>"><?php echo $urls['urlatext'];?></a>
			</h3>
         </div>
         
      	<!-- tags -->
      	<div class=" ps-1">
        	<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
       	</div>
      </div>
          
    <?php }else{ echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item);  }?>

	<?php if ($canEdit) : ?>
		<?php #echo LayoutHelper::render('joomla.content.icons', array('params' => $params, 'item' => $this->item)); ?>
	<?php endif; ?>

	<?php // @todo Not that elegant would be nice to group the params ?>
	<?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
		|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?>

	<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
		<?php #echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?>
	<?php endif; ?>
	
    <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
		<?php #echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
	<?php endif; ?>

	<?php if (!$params->get('show_intro')) : ?>
		<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
		<?php echo $this->item->event->afterDisplayTitle; ?>
	<?php endif; ?>

	<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
	<?php echo $this->item->event->beforeDisplayContent; ?>
          
          
    <!-- Introtext -->       
    <div class="small pb-3 pe-5"><?php echo $this->item->introtext; ?> </div>         

	<?php if ($info == 1 || $info == 2) : ?>
		<?php if ($useDefList) : ?>
			<?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?>
		<?php endif; ?>
		
		<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
			<?php #echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
		<?php endif; ?>
	<?php endif; ?>

	<?php if ($params->get('show_readmore') && $this->item->readmore) :
		if ($params->get('access-view')) :
			$link = Route::_(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language));
		else :
			$menu = Factory::getApplication()->getMenu();
			$active = $menu->getActive();
			$itemId = $active->id;
			$link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false));
			$link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)));
		endif; ?>

		<?php echo LayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?>

	<?php endif; ?>

	<?php if ($isUnpublished) : ?>
		</div>
	<?php endif; ?>

	<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
	<?php echo $this->item->event->afterDisplayContent; ?>
</div>
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/com_content/category/blog.php
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
use Joomla\Component\Content\Site\Helper\RouteHelper;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;

$app = Factory::getApplication();

$this->category->text = $this->category->description;
$app->triggerEvent('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$this->category->description = $this->category->text;

$results = $app->triggerEvent('onContentAfterTitle', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$afterDisplayTitle = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentBeforeDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$beforeDisplayContent = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentAfterDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$afterDisplayContent = trim(implode("\n", $results));

$htag    = $this->params->get('show_page_heading') ? 'h2' : 'h1';

?>
<div class="com-content-category-blog blog" itemscope itemtype="https://schema.org/Blog">
	<?php if ($this->params->get('show_page_heading')) : ?>
		<div class="page-header text-center">
			<h1 class="text-center display-6 bleu lh-base py-5"> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1>
		</div>
	<?php endif; ?>

	<?php if ($this->params->get('show_category_title', 1)) : ?>
	<<?php echo $htag; ?>>
		<?php echo $this->category->title; ?>
	</<?php echo $htag; ?>>
	<?php endif; ?>
	<?php echo $afterDisplayTitle; ?>

	<?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?>
		<?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?>
		<?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?>
	<?php endif; ?>

	<?php if ($beforeDisplayContent || $afterDisplayContent || $this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?>
		<div class="category-desc clearfix">
			<?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?>
				<?php echo LayoutHelper::render(
					'joomla.html.image',
					[
						'src' => $this->category->getParams()->get('image'),
						'alt' => empty($this->category->getParams()->get('image_alt')) && empty($this->category->getParams()->get('image_alt_empty')) ? false : $this->category->getParams()->get('image_alt'),
					]
				); ?>
			<?php endif; ?>
			<?php echo $beforeDisplayContent; ?>
			<?php if ($this->params->get('show_description') && $this->category->description) : ?>
				<?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_content.category'); ?>
			<?php endif; ?>
			<?php echo $afterDisplayContent; ?>
		</div>
	<?php endif; ?>

	<?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?>
		<?php if ($this->params->get('show_no_articles', 1)) : ?>
			<div class="alert alert-info">
				<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
					<?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?>
			</div>
		<?php endif; ?>
	<?php endif; ?>

	<?php $leadingcount = 0; ?>
	<?php if (!empty($this->lead_items)) : ?>
		<div class="com-content-category-blog__items blog-items items-leading <?php echo $this->params->get('blog_class_leading'); ?>">
			<?php foreach ($this->lead_items as &$item) : ?>
				<div class="com-content-category-blog__item blog-item" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
					<?php
					$this->item = &$item;
					echo $this->loadTemplate('item');
					?>
				</div>
				<?php $leadingcount++; ?>
			<?php endforeach; ?>
		</div>
	<?php endif; ?>

	<?php
	$introcount = count($this->intro_items);
	$counter = 0;
	?>

	<?php if (!empty($this->intro_items)) : ?>
		<?php $blogClass = $this->params->get('blog_class', ''); ?>
		<?php if ((int) $this->params->get('num_columns') > 1) : ?>
			<?php $blogClass .= (int) $this->params->get('multi_column_order', 0) === 0 ? ' masonry-' : ' columns-'; ?>
			<?php $blogClass .= (int) $this->params->get('num_columns'); ?>
		<?php endif; ?>
		<div class="com-content-category-blog__items blog-items <?php echo $blogClass; ?>">
		<?php foreach ($this->intro_items as $key => &$item) : ?>
			<div class="shadow com-content-category-blog__item blog-item mb-4 bg-white"
				itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
					<?php
					$this->item = & $item;
					echo $this->loadTemplate('item');
					?>
			</div>
		<?php endforeach; ?>
		</div>
	<?php endif; ?>

	<?php if (!empty($this->link_items)) : ?>
		<div class="items-more">
			<?php echo $this->loadTemplate('links'); ?>
		</div>
	<?php endif; ?>

	<?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?>
		<div class="com-content-category-blog__children cat-children">
			<?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?>
				<h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3>
			<?php endif; ?>
			<?php echo $this->loadTemplate('children'); ?> </div>
	<?php endif; ?>
	<?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?>
		<div class="com-content-category-blog__navigation mx-auto text-center w-100">
			<?php if ($this->params->def('show_pagination_results', 1)) : ?>
				<p class="com-content-category-blog__counter counter float-end pt-3 pe-2">
					<?php echo $this->pagination->getPagesCounter(); ?>
				</p>
			<?php endif; ?>
			<div class="com-content-category-blog__pagination mx-auto text-center">
				<?php echo $this->pagination->getPagesLinks(); ?>
			</div>
		</div>
	<?php endif; ?>
</div>

Nous avons également légèrement modifié l'affichage frontend du module JL Content Fields Filter, comme vous pouvez le voir ici:

<?php
/**
 * JL Content Fields Filter
 *
 * @version 	2.0.0
 * @author		Joomline
 * @copyright	(C) 2017-2019 Arkadiy Sedelnikov, Joomline. All rights reserved.
 * @license 	GNU General Public License version 2 or later; see	LICENSE.txt
 */

defined('_JEXEC') or die;
$doc = JFactory::getDocument();
if ($params->get('enable_no_jq', 0)) {
	JHtml::_('jquery.framework');
	$doc->addScript(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/javascript/jlcontentfilter.js', array('version' => 'auto'));
} else {
	$doc->addScript(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/javascript/nojq_jlcontentfilter.js', array('version' => 'auto'));
}

$doc->addScriptDeclaration('
	JlContentFieldsFilter.init({
		"autho_send" : '.$autho_send.',
		"form_identifier" : "mod-finder-searchform-'.$module->id.'",
		"ajax" : '.$ajax.',
		"ajax_selector" : "'.$ajax_selector.'",
		"ajax_loader" : "'.$ajax_loader.'",
		"ajax_loader_width" : '.$ajax_loader_width.'
	});
');

if ($params->get('enable_css', 1)) {
	$doc->addStyleSheet(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/css/jlcontentfilter.css', array('version' => 'auto'));
}

use Joomla\CMS\Factory; // necessary bc we use herafter Factory::getApplication() and Factory::getDocument()

$app = Factory::getApplication(); // JFactory is indeed deprecated in J!4

$view = $app->input->getCMD('view', ''); // "view" would output "article" or "category" for example

if ('category' !== $view) {return; }

?>

<!-- Version Desktop - tablettes -->
<div class="mx-auto w-75 px-5 d-sm-none d-md-block d-none d-sm-block pb-4 mt-3 mb-4 shadow rounded bleu-bg">
<form id="mod-finder-searchform-<?php echo $module->id; ?>" action="<?php echo $action; ?>" method="<?php echo $form_method; ?>" class="form-search">
	<div class="row jlcontentfieldsfilter<?php echo $moduleclass_sfx; ?>">
		
		<?php foreach($fields as $v) : ?>
			<?php if($v):?>
				<div class="col-md-3 jlmf-section">
					<?php echo $v; ?>
				</div>	
			<?php endif;?>
		<?php endforeach; ?>
		
		<?php if($enableOrdering) : ?>
		<div class="jlmf-section">
            <?php echo $orderingSelect; ?>
		</div>	
        <?php endif; ?>

	</div>
    <?php if($option == 'com_tags'){ ?>
    <input type="hidden" name="tag_category_id" value="<?php echo $catid; ?>">
    <?php } ?>
    <input type="hidden" name="jlcontentfieldsfilter[is_filter]" value="1">
</form>
</div>


<!-- Version mobile -->
<div class="mx-auto px-5 d-block d-sm-none pb-4 mt-3 mb-4 shadow rounded bleu-bg">
<form id="mod-finder-searchform-<?php echo $module->id; ?>" action="<?php echo $action; ?>" method="<?php echo $form_method; ?>" class="form-search">
	<div class="row jlcontentfieldsfilter<?php echo $moduleclass_sfx; ?>">
		
		<?php foreach($fields as $v) : ?>
			<?php if($v):?>
				<div class="col-md-3 jlmf-section">
					<?php echo $v; ?>
				</div>	
			<?php endif;?>
		<?php endforeach; ?>
		
		<?php if($enableOrdering) : ?>
		<div class="jlmf-section">
            <?php echo $orderingSelect; ?>
		</div>	
        <?php endif; ?>
		
	</div>
    <?php if($option == 'com_tags'){ ?>
    <input type="hidden" name="tag_category_id" value="<?php echo $catid; ?>">
    <?php } ?>
    <input type="hidden" name="jlcontentfieldsfilter[is_filter]" value="1">
</form>
</div>

Enfin, le cide du module mod_footer a lui aussi été modifié pour afficher le disclamer de Joomla:

<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_footer
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 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\Language\Text;

?>
<!-- Copyright desktop -->
<div class="mod-footer mx-auto text-center px-5 d-sm-none d-md-block d-none d-sm-block">
  <div class="pt-2 footer2"><?php echo $lineone; ?> - <?php echo Text::_('MOD_FOOTER_LINE2'); ?> - The Joomla name and logo are used under<br />a limited license granted by Open Source Matters in the United States and other countries. TemplateJoomla is not affiliated with or endorsed by the Joomla project or by Open Source Matters.</div>
</div>

<!-- Copyright mobile -->
<div class="d-block d-sm-none mod-footer">
  <div class="pt-2 footer2 pe-5"><?php echo $lineone; ?></div>
</div>

Naturellement, vous pouvez copier et utiliser tous ces codes sur votre site sans limites ou restrictions. Profitez-en!

Où puis-je télécharger une copie de votre site pour le reproduire?

Certains fanatiques de Joomla nous ont déjà demandé de leur fournir un package d'installation de notre site.

Donc et parce qu'il n'y a pas de droit d'auteur sur ces ressources gratuites, nous sommes heureux de partager ce package avec tous ceux qui en ont besoin:

Télécharger le Quickstart Package

Votre projet templatejoomla.com est vraiment très utile, comment puis-je le soutenir?

Merci beaucoup, nous apprécions vraiment votre aide si vous souhaitez soutenir ce projet.
Contrairement à d'autres projets similaires, nous maintiendrons templatejoomla.com en vie aussi longtemps que possible car la cohérence est la clé. Bien sûr, cela dépend principalement de notre équipe mais aussi de toute la Communauté Joomla. Comme dit, nous avons besoin les uns des autres.
Il existe différentes manières d'aider gratuitement templatejoomla.com :

  • si vous avez des sites à migrer vers Joomla 4 pour vos clients, indiquez-leur le lien de templatejoomla.com pour les aider à trouver l'inspiration.
  • partagez le lien autour de vous, sur les réseaux sociaux, sur vos forums, sur vos newsletters, partout où c'est possible.
  • écrivez des articles sur les templates Joomla sur votre blog et ajoutez un lien vers templatejoomla.com serait une idée géniale et conviviale.
  • privilégiez l'achat de templates Joomla 4 via cet annuaire car templatejoomla.com contient quelques traces d'affiliation. Ne vous inquiétez pas, c'est sécurisé et 100% transparent pour vous et le site recevra quelques euros en remerciement si vous ou vos clients achetez vos templates Joomla 4 en venant sur ce site.
  • invitez les templaters qui ne sont pas encore répertoriés dans l'annuaire à nous contacter afin que nous puissions ajouter leurs templates Joomla 4.
  • signalez-nous toute erreur / amélioration / conseil que vous pourriez avoir à propos de cet annuaire de templates Joomla 4: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
  • et parce que le nom de domaine et l'hébergement ne sont pas des services gratuits, nous accepterons également vos dons (bien sûr) !
Merci à templatejoomla.com

Vous en avez peut-être déjà entendu parlé, le projet templatejoomla.com est en ligne depuis quelques semaines maintenant. A ce jour, c'est de loin le plus grand annuaire de templates pour Joomla 4, puisque plus de 1500 templates y sont déjà répertoriés. Cela demontre que l'éco-système de Joomla est très dynamique !

Au delà des nombres, je vais vous expliquer pourquoi ce projet a vu le jour, quels choix techniques ont été faits et comment nous avons créé cet annuaire de templates pour Joomla de cette manière. Et parce que le partage est une valeur essentielle à mes yeux, vous pourrez télécharger une copie du site si vous souhaitez le répliquer pour n'importe quel type de projet (personnel ou professionnel) :)

Pour vous expliquer en détail tous les aspects de ce projet, j'ai répertorié 10 questions intéressantes que nous avons reçu à propos de templatejoomla.com
Si vous avez d'autres questions, la section des commentaires en bas d'article vous attend.

Il y a déjà des annuaires de ce genre, aussi pourquoi avoir créé celui-ci?

La première réponse à cette question pourrait être: pourquoi pas?

Après tout, il y a déjà des annuaires de thèmes et de templates sur Internet mais nous avons pensé qu'un nouveau qui ne serait dédié qu'à Joomla 4 serait une bonne nouvelle pour Joomla, pour son écosystème et pour toute la Communauté.

A templatejoomla.com, nous ne craignons pas la concurrence et nous croyons fermement en la complémentarité des projets. Plus il y aura des projets comme celui-ci en ligne, plus ce sera le signe d'un écosystème dynamique et d'un CMS vivant.
Naturellement, vous pouvez avoir une opinion différente.

De plus, de nombreuses personnes au sein de la Communauté souhaitaient disposer d'un répertoire officiel de templates Joomla, mais cela ne s'est jamais produit. Ce site est une modeste réponse à cette demande car il s'agit d'un projet purement personnel et non soutenu par l'OSM.

Mais il y a d'autres raisons, comme par exemple:

  • Il y a des tonnes de sites en Joomla 3 a migrer en Joomla 4 et beaucoup vont devoir / vouloir changer leur template.
    La migration est toujours une période délicate pour les propriétaires de sites et certains d'entre eux pourraient être tentés de passer à une autre plate-forme s'ils ne trouvaient pas le template parfait pour leur site Web Joomla 4. Ce projet a principalement été construit et pensé pour tous ces sites à migrer.
  • Pour mettre en avant l'incroyable pro-activité et l'infinie créativité des templaters Joomla listés ici.
    Un an seulement après la sortie de Joomla 4, il y a déjà plus de 1300 templates Joomla, gratuits et premium. Chers templaters Joomla, vous démontrez que vous êtes les meilleurs. Bravo les gars !
  • Parce que Joomla 4 est une fantastique version majeure et que nous devons être fiers et le dire haut et fort
    Nous sommes convaincus que cette excellente version apportera de nouveaux utilisateurs à Joomla. Nous avons construit templateJoomla.com pour offrir une belle vitrine à Joomla 4 et pour aider ces nouveaux arrivants à trouver le meilleur template pour leurs projets.
  • pour soutenir l'écosystème Joomla car nous avons tous besoin les uns des autres.
    Les développeurs ont besoin des créateurs de sites qui ont besoin de la Communauté, etc. Nous sommes tous du même côté, avec la même passion pour Joomla. Chacun de nous peut faire beaucoup pour Joomla, c'est juste une question de temps et de volonté. Comme le colibri, nous faisons notre part pour Joomla avec templateJoomla.com :)

Prévoyez-vous d'afficher le score Core Vitals Web pour chaque template?

Non principalement pour une bonne raison très logique.

Pour afficher le scores Core Vitals Web d'un template, il faut installer le template sur un serveur et le tester en conséquence. Et si vous voulez obtenir des scores pertinents et valides, vous devez tester tous les templates sur le même serveur. Si vous testez le template affiché sur le site d'un développeur ou sur une très grosse marketplace, les scores ne seront pas pertinents car tous les serveurs n'ont pas la même configuration.

L'affichage d'informations est une excellente chose pour les utilisateurs finaux, tant que ces informations sont valides, pertinentes et réelles.

Quelles sont les conditions requises pour qu'un templater soit répertorié sur templatejoomla.com?

Sauf si ce templater a été banni de la communauté Joomla, nous acceptons tous les templates Joomla 4 de chaque templater. Il peut s'agir d'un template frontend ou backend, tant que c'est pour Joomla 4. Donc, en gros, nous acceptons tous les templates de tous les templaters.

Si vous proposez des templates Joomla 4 qui ne sont pas encore répertoriés sur templatejoomla.com, nous serions ravis d'échanger avec vous dès que possible.

Si vous connaissez un templater qui pourrait être intéressé pour afficher ses créations dans l'annuaire des templates Joomla 4, contactez-nous s'il vous plaît.

Pouvez-vous nous détailler le processus que vous utilisez pour ajouter un nouveau template?

Bien sur, voyons cela en détail.
D'abord, nous créons un nouvel article dans le panneau d'administration et nous ajoutons les informations suivantes:

  • le titre de l'article: le nom du template
  • le contenu de l'article: une brève description du template
  • les tags: la version du template (J4 et J3)
  • La note: le nom du templater (sert uniquement pour filtrer les articles en backend)
Adding a new item in the Joomla templates directory
  • l'image d'intro: la capture d'écran du template - c'est la partie la plus longue du processus car nous redimensionnons chaque image aux bonnes dimensions avant de les charger sur le site.
  • Le lien A: l'URL de la page du template
  • le texte URL A: le nom du template
Adding a new item in templatejoomla.com
  • le modèle économique du template
  • le framework du template
  • la categorie
  • le templater
Adding a new item in the Joomla templates directory
  • la date de publication: nous ajoutons ici la dernière date connue du template (création ou mise à jour). Dans certains cas, nous avons indiqué la dernière date de mise à jour du framework.

Lorsque nous disposons de toutes les informations, il ne faut que quelques minutes pour ajouter une nouveau template dans l'annuaire.

Comment est géré le filtrage des templates?

Pour cela, nous avons choisi d'utiliser le module gratuit JL Content Fields Filter de Joomline.

Concrétement, les informations sont saisies dans des champs personnalisés dans le backend et le module permet au visiter de filtrer les articles sur le frontend. Le module fonctionne parfaitement et il est très simple à configurer.
C'est simple, c'est gratuit et c'est parfait!

Cependant, il y a un point à améliorer. En effet, les ARIA ID des labels générées par le module ne sont pas uniques, ce qui pénalise l'accessibilité. J'ai envoyé cette information à l'équipe de Joomline et on peut espérer une mise à jour de leur module.

Accessibility templatejoomla.com

Quelles extensions avez-vous installé pour créer le site?

Parce que "light is right", nous voulions utiliser les fonctions natives de Joomla 4 autant que possible. Ainsi, le site est construit avec Joomla 4 et Cassiopeia.
Nous avons seulement ajouté les extensions suivantes:

  • JL Content Fileds Filter: pour le filtrage des templates
  • AJAX Infinity: ajout du scroll infini sur la page des templates
  • JCH Optimize
  • Akeeba Backup
  • JSitemap Pro
  • itcs Matomo

Pour résumer, le site n'utilise que 5 modules (dont 4 natifs) et nous n'avons ajouté que 20 lignes de CSS. Comme vous pouvez le constater, il n'y a pas besoin d'installer de nombreuses extensions pour créer un (super) site web car Joomla 4 est nativement très puissant.

Dans quel ordre les templates Joomla sont-ils affichés?

La page d'accueil du site est un simple élément de menu de type Blog d'une catégorie.

Très logiquement, nous avons décidé de privilégier les templaters qui maintiennent à jour leurs templates. Ainsi, les templates Joomla 4 récemment créés ou mis à jour sont affichés en premier.

Quelles overrides avez-vous créés pour cet annuaire de templates Joomla 4?

Bien sûr, pour coller le plus possible au noyau et parce que Joomla est très puissant, nous avons créé quelques overrides, comme d'habitude.

Les premières concernent l'en-tête du site. Nous voulions rendre l'en-tête aussi mince et aussi simple que possible. Voici les overrides créés avec quelques explications.

Pour afficher le nom du site et son slogan, nous avons utilisé un module mod_custom affiché en position menu:

<!-- Desktop Tablette -->
<div class="ps-5 ms-5 navbar-brand navbar-brand d-none d-md-block">
	<a class="brand-logo text-decoration-none" href="/">
    	<span class="fw-bold" title="TemplateJoomla">TemplateJoomla</span>
  	</a>
  <div class="site-description small fst-italic">Joomla Template Directory</div>
</div>

<!-- Mobile -->
<div class="ms-4 navbar-brand  d-md-none">
 	<div class="ms-2">
     	<div>
          	<a class="fs-2 text-decoration-none" href="/"> 
      		<span class="fw-bold" title="web-eau.net">TemplateJoomla</span>
      		</a>
      	</div>
    </div>  
</div>

Ensuite, le menu principal est affiché avec un module mod_menu en position menu.

le dernier module affiche les textes au dessus des filtres et pour cela, nous avons utilisé un module mod_articles_latest où le code a été totalement supprimé et remplacé par celui-ci:

<?php
/**
 * @package     Joomla.Site
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/mod_articles_latest/header-homepage.php
 */

defined('_JEXEC') or die;

$model = JModelLegacy::getInstance('Articles', 'ContentModel', array( 'ignore_request' => true )); // add ignore_request
$params = JFactory::getApplication()->getParams();
$model->setState('params', $params); 
$model->setState('filter.category_id', 2); 
$num_articles = $model->getTotal();
?>

<div class="p-5 bleu bg-white text-center">
  <h1 class="display-6 lh-base">You need a new template for your Joomla site?</h1>
<h2 class="display-6 lh-base pb-4">There are  <span class="fw-bolder"><?php echo $num_articles; ?></span> Joomla 4 templates listed here for you!
  <br /><span class="fs-4">Recently created or updated templates are displayed first</span>
</div>

Puis, nous avons créé les overrides pour l'affichage du blog. Parce qu'une image vaut 1000 mots, voici les codes de ces overrides:

<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/com_content/category/blog_item.php
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
use Joomla\Component\Content\Site\Helper\RouteHelper;

// Create a shortcut for params.
$params = $this->item->params;
$canEdit = $this->item->params->get('access-edit');
$info    = $params->get('info_block_position', 2);

// Check if associations are implemented. If they are, define the parameter.
$assocParam = (Associations::isEnabled() && $params->get('show_associations'));

$currentDate   = Factory::getDate()->format('d M Y H:i:s');
$isUnpublished = ($this->item->state == ContentComponent::CONDITION_UNPUBLISHED || $this->item->publish_up > $currentDate)
	|| ($this->item->publish_down < $currentDate && $this->item->publish_down !== null);
?> 

<!-- Intro image -->
<?php if($this->item->catid == 2){?>   
<?php $images  = json_decode($this->item->images);?>
<?php $urls = json_decode($this->item->urls, true);?>
<div class="w-100 text-center rounded-top item-image">
	<a target="_blank" href="<?php echo $urls['urla'];?>" itemprop="url" title="<?php echo $urls['urlatext'];?> Joomla template">
		<img class="img-fluid" src="<?php echo $images->image_intro;?>" itemprop="thumbnailUrl" width="100%" height="211" loading="lazy" alt="<?php echo $urls['urlatext'];?> Joomla template"/>
		</a>
</div>
<?php }else{ echo LayoutHelper::render('joomla.content.intro_image', $this->item); }?>


<!-- Title + tags + hits + intro text -->
<div class="rounded-bottom item-content py-3 ps-3 bg-white">
	<?php if ($isUnpublished) : ?>
		<div class="system-unpublished">
	<?php endif; ?>

	<!-- title -->
    <?php if($this->item->catid == 2){?> 
       <div class="d-flex flex-row">
         <div class="">
			<h3 class="fs-3" itemprop="name">
 				<a target="_blank" href="<?php echo $urls['urla'];?>" itemprop="url" title="<?php echo $urls['urlatext'];?>"><?php echo $urls['urlatext'];?></a>
			</h3>
         </div>
         
      	<!-- tags -->
      	<div class=" ps-1">
        	<?php echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
       	</div>
      </div>
          
    <?php }else{ echo LayoutHelper::render('joomla.content.blog_style_default_item_title', $this->item);  }?>

	<?php if ($canEdit) : ?>
		<?php #echo LayoutHelper::render('joomla.content.icons', array('params' => $params, 'item' => $this->item)); ?>
	<?php endif; ?>

	<?php // @todo Not that elegant would be nice to group the params ?>
	<?php $useDefList = ($params->get('show_modify_date') || $params->get('show_publish_date') || $params->get('show_create_date')
		|| $params->get('show_hits') || $params->get('show_category') || $params->get('show_parent_category') || $params->get('show_author') || $assocParam); ?>

	<?php if ($useDefList && ($info == 0 || $info == 2)) : ?>
		<?php #echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'above')); ?>
	<?php endif; ?>
	
    <?php if ($info == 0 && $params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
		<?php #echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
	<?php endif; ?>

	<?php if (!$params->get('show_intro')) : ?>
		<?php // Content is generated by content plugin event "onContentAfterTitle" ?>
		<?php echo $this->item->event->afterDisplayTitle; ?>
	<?php endif; ?>

	<?php // Content is generated by content plugin event "onContentBeforeDisplay" ?>
	<?php echo $this->item->event->beforeDisplayContent; ?>
          
          
    <!-- Introtext -->       
    <div class="small pb-3 pe-5"><?php echo $this->item->introtext; ?> </div>         

	<?php if ($info == 1 || $info == 2) : ?>
		<?php if ($useDefList) : ?>
			<?php echo LayoutHelper::render('joomla.content.info_block', array('item' => $this->item, 'params' => $params, 'position' => 'below')); ?>
		<?php endif; ?>
		
		<?php if ($params->get('show_tags', 1) && !empty($this->item->tags->itemTags)) : ?>
			<?php #echo LayoutHelper::render('joomla.content.tags', $this->item->tags->itemTags); ?>
		<?php endif; ?>
	<?php endif; ?>

	<?php if ($params->get('show_readmore') && $this->item->readmore) :
		if ($params->get('access-view')) :
			$link = Route::_(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language));
		else :
			$menu = Factory::getApplication()->getMenu();
			$active = $menu->getActive();
			$itemId = $active->id;
			$link = new Uri(Route::_('index.php?option=com_users&view=login&Itemid=' . $itemId, false));
			$link->setVar('return', base64_encode(RouteHelper::getArticleRoute($this->item->slug, $this->item->catid, $this->item->language)));
		endif; ?>

		<?php echo LayoutHelper::render('joomla.content.readmore', array('item' => $this->item, 'params' => $params, 'link' => $link)); ?>

	<?php endif; ?>

	<?php if ($isUnpublished) : ?>
		</div>
	<?php endif; ?>

	<?php // Content is generated by content plugin event "onContentAfterDisplay" ?>
	<?php echo $this->item->event->afterDisplayContent; ?>
</div>
<?php
/**
 * @package     Joomla.Site
 * @subpackage  com_content
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 * @file		/templates/cassiopeia/html/com_content/category/blog.php
 */

defined('_JEXEC') or die;

use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Associations;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Uri\Uri;
use Joomla\Component\Content\Administrator\Extension\ContentComponent;
use Joomla\Component\Content\Site\Helper\RouteHelper;
use Joomla\Component\Fields\Administrator\Helper\FieldsHelper;

$app = Factory::getApplication();

$this->category->text = $this->category->description;
$app->triggerEvent('onContentPrepare', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$this->category->description = $this->category->text;

$results = $app->triggerEvent('onContentAfterTitle', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$afterDisplayTitle = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentBeforeDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$beforeDisplayContent = trim(implode("\n", $results));

$results = $app->triggerEvent('onContentAfterDisplay', array($this->category->extension . '.categories', &$this->category, &$this->params, 0));
$afterDisplayContent = trim(implode("\n", $results));

$htag    = $this->params->get('show_page_heading') ? 'h2' : 'h1';

?>
<div class="com-content-category-blog blog" itemscope itemtype="https://schema.org/Blog">
	<?php if ($this->params->get('show_page_heading')) : ?>
		<div class="page-header text-center">
			<h1 class="text-center display-6 bleu lh-base py-5"> <?php echo $this->escape($this->params->get('page_heading')); ?> </h1>
		</div>
	<?php endif; ?>

	<?php if ($this->params->get('show_category_title', 1)) : ?>
	<<?php echo $htag; ?>>
		<?php echo $this->category->title; ?>
	</<?php echo $htag; ?>>
	<?php endif; ?>
	<?php echo $afterDisplayTitle; ?>

	<?php if ($this->params->get('show_cat_tags', 1) && !empty($this->category->tags->itemTags)) : ?>
		<?php $this->category->tagLayout = new FileLayout('joomla.content.tags'); ?>
		<?php echo $this->category->tagLayout->render($this->category->tags->itemTags); ?>
	<?php endif; ?>

	<?php if ($beforeDisplayContent || $afterDisplayContent || $this->params->get('show_description', 1) || $this->params->def('show_description_image', 1)) : ?>
		<div class="category-desc clearfix">
			<?php if ($this->params->get('show_description_image') && $this->category->getParams()->get('image')) : ?>
				<?php echo LayoutHelper::render(
					'joomla.html.image',
					[
						'src' => $this->category->getParams()->get('image'),
						'alt' => empty($this->category->getParams()->get('image_alt')) && empty($this->category->getParams()->get('image_alt_empty')) ? false : $this->category->getParams()->get('image_alt'),
					]
				); ?>
			<?php endif; ?>
			<?php echo $beforeDisplayContent; ?>
			<?php if ($this->params->get('show_description') && $this->category->description) : ?>
				<?php echo HTMLHelper::_('content.prepare', $this->category->description, '', 'com_content.category'); ?>
			<?php endif; ?>
			<?php echo $afterDisplayContent; ?>
		</div>
	<?php endif; ?>

	<?php if (empty($this->lead_items) && empty($this->link_items) && empty($this->intro_items)) : ?>
		<?php if ($this->params->get('show_no_articles', 1)) : ?>
			<div class="alert alert-info">
				<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden"><?php echo Text::_('INFO'); ?></span>
					<?php echo Text::_('COM_CONTENT_NO_ARTICLES'); ?>
			</div>
		<?php endif; ?>
	<?php endif; ?>

	<?php $leadingcount = 0; ?>
	<?php if (!empty($this->lead_items)) : ?>
		<div class="com-content-category-blog__items blog-items items-leading <?php echo $this->params->get('blog_class_leading'); ?>">
			<?php foreach ($this->lead_items as &$item) : ?>
				<div class="com-content-category-blog__item blog-item" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
					<?php
					$this->item = &$item;
					echo $this->loadTemplate('item');
					?>
				</div>
				<?php $leadingcount++; ?>
			<?php endforeach; ?>
		</div>
	<?php endif; ?>

	<?php
	$introcount = count($this->intro_items);
	$counter = 0;
	?>

	<?php if (!empty($this->intro_items)) : ?>
		<?php $blogClass = $this->params->get('blog_class', ''); ?>
		<?php if ((int) $this->params->get('num_columns') > 1) : ?>
			<?php $blogClass .= (int) $this->params->get('multi_column_order', 0) === 0 ? ' masonry-' : ' columns-'; ?>
			<?php $blogClass .= (int) $this->params->get('num_columns'); ?>
		<?php endif; ?>
		<div class="com-content-category-blog__items blog-items <?php echo $blogClass; ?>">
		<?php foreach ($this->intro_items as $key => &$item) : ?>
			<div class="shadow com-content-category-blog__item blog-item mb-4 bg-white"
				itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
					<?php
					$this->item = & $item;
					echo $this->loadTemplate('item');
					?>
			</div>
		<?php endforeach; ?>
		</div>
	<?php endif; ?>

	<?php if (!empty($this->link_items)) : ?>
		<div class="items-more">
			<?php echo $this->loadTemplate('links'); ?>
		</div>
	<?php endif; ?>

	<?php if ($this->maxLevel != 0 && !empty($this->children[$this->category->id])) : ?>
		<div class="com-content-category-blog__children cat-children">
			<?php if ($this->params->get('show_category_heading_title_text', 1) == 1) : ?>
				<h3> <?php echo Text::_('JGLOBAL_SUBCATEGORIES'); ?> </h3>
			<?php endif; ?>
			<?php echo $this->loadTemplate('children'); ?> </div>
	<?php endif; ?>
	<?php if (($this->params->def('show_pagination', 1) == 1 || ($this->params->get('show_pagination') == 2)) && ($this->pagination->pagesTotal > 1)) : ?>
		<div class="com-content-category-blog__navigation mx-auto text-center w-100">
			<?php if ($this->params->def('show_pagination_results', 1)) : ?>
				<p class="com-content-category-blog__counter counter float-end pt-3 pe-2">
					<?php echo $this->pagination->getPagesCounter(); ?>
				</p>
			<?php endif; ?>
			<div class="com-content-category-blog__pagination mx-auto text-center">
				<?php echo $this->pagination->getPagesLinks(); ?>
			</div>
		</div>
	<?php endif; ?>
</div>

Nous avons également légèrement modifié l'affichage frontend du module JL Content Fields Filter, comme vous pouvez le voir ici:

<?php
/**
 * JL Content Fields Filter
 *
 * @version 	2.0.0
 * @author		Joomline
 * @copyright	(C) 2017-2019 Arkadiy Sedelnikov, Joomline. All rights reserved.
 * @license 	GNU General Public License version 2 or later; see	LICENSE.txt
 */

defined('_JEXEC') or die;
$doc = JFactory::getDocument();
if ($params->get('enable_no_jq', 0)) {
	JHtml::_('jquery.framework');
	$doc->addScript(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/javascript/jlcontentfilter.js', array('version' => 'auto'));
} else {
	$doc->addScript(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/javascript/nojq_jlcontentfilter.js', array('version' => 'auto'));
}

$doc->addScriptDeclaration('
	JlContentFieldsFilter.init({
		"autho_send" : '.$autho_send.',
		"form_identifier" : "mod-finder-searchform-'.$module->id.'",
		"ajax" : '.$ajax.',
		"ajax_selector" : "'.$ajax_selector.'",
		"ajax_loader" : "'.$ajax_loader.'",
		"ajax_loader_width" : '.$ajax_loader_width.'
	});
');

if ($params->get('enable_css', 1)) {
	$doc->addStyleSheet(JUri::root().'modules/mod_jlcontentfieldsfilter/assets/css/jlcontentfilter.css', array('version' => 'auto'));
}

use Joomla\CMS\Factory; // necessary bc we use herafter Factory::getApplication() and Factory::getDocument()

$app = Factory::getApplication(); // JFactory is indeed deprecated in J!4

$view = $app->input->getCMD('view', ''); // "view" would output "article" or "category" for example

if ('category' !== $view) {return; }

?>

<!-- Version Desktop - tablettes -->
<div class="mx-auto w-75 px-5 d-sm-none d-md-block d-none d-sm-block pb-4 mt-3 mb-4 shadow rounded bleu-bg">
<form id="mod-finder-searchform-<?php echo $module->id; ?>" action="<?php echo $action; ?>" method="<?php echo $form_method; ?>" class="form-search">
	<div class="row jlcontentfieldsfilter<?php echo $moduleclass_sfx; ?>">
		
		<?php foreach($fields as $v) : ?>
			<?php if($v):?>
				<div class="col-md-3 jlmf-section">
					<?php echo $v; ?>
				</div>	
			<?php endif;?>
		<?php endforeach; ?>
		
		<?php if($enableOrdering) : ?>
		<div class="jlmf-section">
            <?php echo $orderingSelect; ?>
		</div>	
        <?php endif; ?>

	</div>
    <?php if($option == 'com_tags'){ ?>
    <input type="hidden" name="tag_category_id" value="<?php echo $catid; ?>">
    <?php } ?>
    <input type="hidden" name="jlcontentfieldsfilter[is_filter]" value="1">
</form>
</div>


<!-- Version mobile -->
<div class="mx-auto px-5 d-block d-sm-none pb-4 mt-3 mb-4 shadow rounded bleu-bg">
<form id="mod-finder-searchform-<?php echo $module->id; ?>" action="<?php echo $action; ?>" method="<?php echo $form_method; ?>" class="form-search">
	<div class="row jlcontentfieldsfilter<?php echo $moduleclass_sfx; ?>">
		
		<?php foreach($fields as $v) : ?>
			<?php if($v):?>
				<div class="col-md-3 jlmf-section">
					<?php echo $v; ?>
				</div>	
			<?php endif;?>
		<?php endforeach; ?>
		
		<?php if($enableOrdering) : ?>
		<div class="jlmf-section">
            <?php echo $orderingSelect; ?>
		</div>	
        <?php endif; ?>
		
	</div>
    <?php if($option == 'com_tags'){ ?>
    <input type="hidden" name="tag_category_id" value="<?php echo $catid; ?>">
    <?php } ?>
    <input type="hidden" name="jlcontentfieldsfilter[is_filter]" value="1">
</form>
</div>

Enfin, le cide du module mod_footer a lui aussi été modifié pour afficher le disclamer de Joomla:

<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_footer
 * @author		web-eau.net - Annuaire de templates Joomla 4
 * @copyright   (C) 2006 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\Language\Text;

?>
<!-- Copyright desktop -->
<div class="mod-footer mx-auto text-center px-5 d-sm-none d-md-block d-none d-sm-block">
  <div class="pt-2 footer2"><?php echo $lineone; ?> - <?php echo Text::_('MOD_FOOTER_LINE2'); ?> - The Joomla name and logo are used under<br />a limited license granted by Open Source Matters in the United States and other countries. TemplateJoomla is not affiliated with or endorsed by the Joomla project or by Open Source Matters.</div>
</div>

<!-- Copyright mobile -->
<div class="d-block d-sm-none mod-footer">
  <div class="pt-2 footer2 pe-5"><?php echo $lineone; ?></div>
</div>

Naturellement, vous pouvez copier et utiliser tous ces codes sur votre site sans limites ou restrictions. Profitez-en!

Où puis-je télécharger une copie de votre site pour le reproduire?

Certains fanatiques de Joomla nous ont déjà demandé de leur fournir un package d'installation de notre site.

Donc et parce qu'il n'y a pas de droit d'auteur sur ces ressources gratuites, nous sommes heureux de partager ce package avec tous ceux qui en ont besoin:

Télécharger le Quickstart Package

Votre projet templatejoomla.com est vraiment très utile, comment puis-je le soutenir?

Merci beaucoup, nous apprécions vraiment votre aide si vous souhaitez soutenir ce projet.
Contrairement à d'autres projets similaires, nous maintiendrons templatejoomla.com en vie aussi longtemps que possible car la cohérence est la clé. Bien sûr, cela dépend principalement de notre équipe mais aussi de toute la Communauté Joomla. Comme dit, nous avons besoin les uns des autres.
Il existe différentes manières d'aider gratuitement templatejoomla.com :

  • si vous avez des sites à migrer vers Joomla 4 pour vos clients, indiquez-leur le lien de templatejoomla.com pour les aider à trouver l'inspiration.
  • partagez le lien autour de vous, sur les réseaux sociaux, sur vos forums, sur vos newsletters, partout où c'est possible.
  • écrivez des articles sur les templates Joomla sur votre blog et ajoutez un lien vers templatejoomla.com serait une idée géniale et conviviale.
  • privilégiez l'achat de templates Joomla 4 via cet annuaire car templatejoomla.com contient quelques traces d'affiliation. Ne vous inquiétez pas, c'est sécurisé et 100% transparent pour vous et le site recevra quelques euros en remerciement si vous ou vos clients achetez vos templates Joomla 4 en venant sur ce site.
  • invitez les templaters qui ne sont pas encore répertoriés dans l'annuaire à nous contacter afin que nous puissions ajouter leurs templates Joomla 4.
  • signalez-nous toute erreur / amélioration / conseil que vous pourriez avoir à propos de cet annuaire de templates Joomla 4: Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.
  • et parce que le nom de domaine et l'hébergement ne sont pas des services gratuits, nous accepterons également vos dons (bien sûr) !
Merci à templatejoomla.com
Daniel Dubois - auteur à web-eau.net

A propos de Daniel

Passionné par le Web depuis 2007, Daniel défend la veuve et l'orphelin du web en créant des sites respectueux du W3C. Fort de son expérience, il partage ses connaissances dans un état d'esprit open source. Très impliqué en faveur du CMS Joomla depuis 2014, il est également conférencier et fondateur du Joomla User Group Breizh.

Site Web Facebook LinkedIn Twitter Joomla Courriel

web-eau.net

29800 Landerneau

06 74 50 27 99

daniel@web-eau.net

Liens rapides