web-dev-qa-db-fra.com

Comment puis-je ajouter des valeurs de champ utilisateur personnalisées à un article?

J'ai créé un champ d'utilisateur personnalisé appelé "Sexe".

Comment puis-je afficher ce champ dans un article?

Je n'arrive qu'à montrer: username, name, email et User Id

Voici mon code actuel de Sourcerer pour accéder au nom d'utilisateur:

{source} <?php $user = JFactory::getUser(); echo $user->get('name'); {/source}
1
Author ivan

Ok, je vais expliquer en utilisant une valeur fictive.

Vous devrez référencer la table #__users Et la table #__fields_values.

En supposant que vous ne traitez qu'avec des utilisateurs connectés, vous devrez acquérir l'identifiant de l'utilisateur via JFactory::getUser()->id.

Ensuite, vous devez connaître le field_id Avec lequel la valeur gender est stockée dans la table #__fields_values. Pour mon exemple ci-dessous, je vais utiliser 28 Comme valeur field_id; Si vous ne savez pas quelle est la valeur field_id correcte pour votre projet, vous pouvez la rechercher dans la table #__fields. L'entier dont vous avez besoin est dans la source id colonne.

En effectuant un INNER JOIN sur les deux tables, en utilisant deux conditions dans la clause WHERE et en appelant une seule valeur dans le résultat défini via loadResult(), vous obtiendrez votre valeur gender.

try {
    $db = JFactory::getDbo();
    $user_id = JFactory::getUser()->id;
    $query = $db->getQuery(true)
        ->select("b.value AS gender")
        ->from("#__users a")
        ->innerJoin("#__fields_values b ON a.id = b.item_id")
        ->where(["b.field_id = 28", "b.item_id = " . (int)$user_id]);  // $user_id should already be an integer, but cast to be extra safe
    $db->setQuery($query);
    // JFactory::getApplication()->enqueueMessage($query->dump(), 'info');
    if (!$gender = $db->loadResult()) {
        echo "<p>No Value Found</p>";
    } else {
        echo "<p>$gender</p>";
    }
} catch (Exception $e) {
    JFactory::getApplication()->enqueueMessage("Query Syntax Error: " . $e->getMessage(), 'error');  // don't show $e->getMessage() to public
}

p.s. si vous ne souhaitez pas coder en dur le "28" dans votre requête, vous pouvez effectuer une recherche dynamique du numéro, mais cela nécessitera une autre JOIN avec la table #__fields - cela ne vaut probablement pas la peine effort dans la plupart des cas.

1
mickmackusa