Avec l'article Joomla 3.7.x, les champs personnalisés d'articles ont enfin obtenu une partie du contenu de Joomla.
Cependant, je voudrais demander comment je peux rendre ces champs personnalisés dans la liste des catégories Joomla?
L'ajout de champs personnalisés à la liste de catégories Joomla ne fait toujours pas partie de Joomla (j'espère que cela arrivera un jour aussi).
Donc, afin d’ajouter les champs personnalisés à la liste des catégories Joomla, j’ai créé un remplacement de modèle de ' com_content/category/default_articles.php ' à ajoutez deux colonnes que je veux utiliser pour afficher deux champs personnalisés:
Mon remplacement actuel de default_articles.php ressemble à ceci:
<?php /**--- Enable direct access by name to custom fields (Top) ----*/ ?>
<?php foreach($item->jcfields as $jcfield)
{
$item->jcFields[$jcfield->name] = $jcfield;
}
?>
<?php /**--------- Custom Fields Header (Around line 120) -----------*/ ?>
<?php if ($this->params->get('list_show_votes')) : ?>
<th id="categorylist_header_dato">
<?php echo JHtml::_('grid.sort', 'LIST_GILDISKOMA', 'gildiskoma', $listDirn, $listOrder); ?>
</th>
<?php endif; ?>
<?php if ($this->params->get('list_show_votes')) : ?>
<th id="categorylist_header_type">
<?php echo JHtml::_('grid.sort', 'LIST_SLAG', 'slag', $listDirn, $listOrder); ?>
</th>
<?php endif; ?>
<?php /**--- Custom Category List Fields Content (Around line 250) ---*/ ?>
<?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?>
<td headers="categorylist_header_date" class="list-gildiskoma">
<?php echo $item->jcFields['gildiskoma']->value; ?>
</td>
<?php endif; ?>
<?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?>
<td headers="categorylist_header_type" class="list-slag">
<?php echo $item->jcFields['slag']->value; ?>
</td>
<?php endif; ?>
Nous n'utilisons pas la fonctionnalité de vote par article. J'ai donc choisi d'utiliser les champs personnalisés à sa place, comme vous le remarquerez peut-être dans le code ci-dessus, ce qui me donne deux colonnes personnalisées.
J'ai consulté la documentation de J3.x: Ajout de champs personnalisés/Remplacements et j'ai également trouvé cet article sur Comment récupérer des champs personnalisés d'article Joomla dans un autre composant?
La documentation comporte une section expliquant comment ajouter des champs individuels avec substitution. Mais mon code ci-dessus n'affiche pas la valeur des champs personnalisés.
Donc, je ne suis pas sûr de ce qui me manque pour obtenir la valeur des champs à afficher dans la liste?
Ci-dessous également une capture d'écran qui illustre ce que j'essaie de faire.
Il est très facile d’utiliser les champs personnalisés dans article-list-view. Cela fonctionne hors de la boîte. Vous n'êtes pas obligé d'utiliser JLoader, etc. Et vous n'avez pas besoin de définir un autre argument "foreach".
Regardez simplement comment le "foreach" dans default-articles.php est appelé pour chaque ligne de la table:
<?php foreach ($this->items as $i => $article) : ?>
Il suffit donc de changer $ this-> item en $ article
Par exemple, regardez comment les hits seront créés:
<?php echo JText::sprintf('JGLOBAL_HITS_COUNT', $article->hits); ?>
Donc, vous pouvez voir qu'il y a
$ article-> hits
au lieu de
$ this-> item-> hits
Maintenant, pour insérer des champs personnalisés, il suffit de modifier le code standard des champs personnalisés à partir de cette page.
<?php echo $this->item->jcfields[id]->value; ?>
à
<?php echo $article->jcfields[id]->value; ?>
Ainsi, vous pouvez afficher chaque champ personnalisé avec chaque ID de votre choix dans des colonnes pour chaque ligne de la table.
Dans votre exemple:
<?php /**--------- Custom Fields Header (Around line 120) -----------*/ ?>
<?php if ($this->params->get('list_show_votes')) : ?>
<th id="categorylist_header_dato">
<?php echo JHtml::_('grid.sort', 'LIST_GILDISKOMA', 'gildiskoma', $listDirn, $listOrder); ?>
</th>
<?php endif; ?>
<?php if ($this->params->get('list_show_votes')) : ?>
<th id="categorylist_header_type">
<?php echo JHtml::_('grid.sort', 'LIST_SLAG', 'slag', $listDirn, $listOrder); ?>
</th>
<?php endif; ?>
<?php /**--- Custom Category List Fields Content (Around line 250) ---*/ ?>
<?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?>
<td headers="categorylist_header_date" class="list-gildiskoma">
<?php echo $article->jcfields['gildiskoma']->value; ?>
</td>
<?php endif; ?>
<?php if ($this->params->get('list_show_votes', 0) && $this->vote) : ?>
<td headers="categorylist_header_type" class="list-slag">
<?php echo $article->jcfields['slag']->value; ?>
</td>
<?php endif; ?>
Mes solutions pour obtenir 2 nouvelles colonnes dans mon remplacement de modèle com_content/category/default_articles.php. Ces docs.joomla et les réponses ci-dessus m'ont beaucoup aidé.
Dans la boucle <?php foreach ($this->items as $i => $article) : ?>
. Où toutes les informations sur les articles sont collectées
<!-- this code to grab the fields by use of the fieldshelper -->
<?php JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); ?>
<?php foreach($article->jcfields as $jcfield)
{
$article->jcFields[$jcfield->name] = $jcfield;
}
?>
Placez les informations d'en-tête de colonnes supplémentaires dans les en-têtes de table
<!-- table header -->
<th>
your field 1:
</th>
<th>
your field 2:
</th>
Et enfin, placez les informations de champ personnalisé par élément dans le tbody. Comme ça:
<td><?php echo $article->jcFields['your-field-1']->value; ?></td>
<td><?php echo $article->jcFields['your-field-2']->value; ?></td>
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
$customFields = FieldsHelper::getFields('com_content.article', $articleitem, true);
$fields = array();
foreach ($customFields as $field)
{
$fields[$field->name] = $field->value ? $field->rawvalue : $field->default_value;
}
Yay!