J'ai commencé à travailler sur la prochaine version 3.7 d'un projet en utilisant le com_fields
.
J'ai créé un article et un groupe de champs au niveau catégorie. L'idée est que je souhaite utiliser les champs de niveau de catégorie pour "globaliser" par catégorie les valeurs supplémentaires qui doivent être utilisées/affichées par défaut sur chacun des articles de cette catégorie, à moins qu'elles ne soient écrasées au niveau de l'article.
Maintenant, dans la vue de l'article, j'ai accès aux champs personnalisés de l'article et j'essaie également d'accéder aux champs personnalisés de la catégorie de l'article, ce que j'ai fait de la manière suivante:
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
$catFields = FieldsHelper::getFields('com_content.categories', $currentCat, true);
La courte documentation pour le FieldsHelper::getFields
mentions:
- Renvoie les champs pour le contexte donné.
- Si l'élément est un objet, les champs renvoyés ont un champ supplémentaire "valeur" qui représente la valeur de l'élément donné.
Mais le problème est que je reçois le tableau de champs personnalisés de la catégorie contenant les objets de champs et leurs propriétés, mais sans leurs valeurs réelles.
Comment je pourrais y arriver?
La clé ici (que j'ai mal comprise/négligée) est que pour le FieldsHelper::getFields
méthode, pour renvoyer également le value
& rawvalue
des champs personnalisés, le $item
doit être un objet de contenu.
Je ne faisais que passer l'id de la catégorie, au lieu d'un objet de cette catégorie, c'est pourquoi je n'ai pas obtenu la valeur du champ.
Juste pour la clarté, je poste ici la déclaration de la méthode et ses paramètres, tels que définis dans la classe FieldsHelper
.
public static function getFields($context, $item = null, $prepareValue = false, array $valuesToOverride = null)
Donc, dans mon cas (en mode d'affichage d'article), pour obtenir les champs personnalisés et leurs valeurs de la catégorie de l'article, je dois passer la catégorie ($ item) en tant qu'objet de catégorie, comme suit:
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
$jcategories = JCategories::getInstance('Content');
$category = $jcategories->get($article->catid);
$currentCatFields = FieldsHelper::getFields('com_content.categories', $category, true);
Comme alternative, si nous connaissons les identifiants des champs personnalisés pour lesquels nous voulons obtenir leurs valeurs, nous pouvons utiliser le modèle com_fields comme suit:
$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true));
//$categoryFieldsIds = array();
$currentCatFields = $model->getFieldValues($categoryFieldsIds, $currentCatID);
Pour obtenir des champs et des valeurs personnalisés pour les articles Joomla, vous pouvez utiliser le code suivant:
<?php
JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php'); //load fields helper
$customFieldnames = FieldsHelper::getFields('com_content.article', $artile_id, true); // get custom field names by article id
$customFieldIds = array_map(create_function('$o', 'return $o->id;'), $customFieldnames); //get custom field Ids by custom field names
$model = JModelLegacy::getInstance('Field', 'FieldsModel', array('ignore_request' => true)); //load fields model
$customFieldTitles = array_map(create_function('$o', 'return $o->name;'), $customFieldnames); //Fetch names for custom fields
$customFieldValues = $model->getFieldValues($customFieldIds , $item->content_item_id); //Fetch values for custom field Ids
?>
J'espère que ça aide!