web-dev-qa-db-fra.com

Comment afficher les champs personnalisés de l'article dans l'en-tête de la page?

J'utilise le modèle Protostar par défaut de Jommla. J'ai des champs personnalisés pour les articles et je souhaite afficher ce champ personnalisé dans l'en-tête de la page, pas à l'intérieur de l'article. Comment puis-je y arriver?

2
Rahman Sharif

Vous devez obtenir l'article en utilisant le modèle d'article. Puis obtenez ses champs en utilisant FieldsHelper. Un inconvénient ici est que cet article n'est pas mis en cache ici, donc nous obtenons une requête en double.

// Check that we are on article view.
if ($option === 'com_content' && $view === 'article')
{
    $context = 'com_content.article';

    // Get the article.
    $article = JModelLegacy::getInstance('Article', 'ContentModel')->getItem();

    // Get article fields.
    JLoader::register('FieldsHelper', JPATH_ADMINISTRATOR . '/components/com_fields/helpers/fields.php');
    $fields = FieldsHelper::getFields($context, $article);

    // We have the fields, do something, e.g.
    echo FieldsHelper::render($context, 'fields.render', array('context' => $context, 'item' => $article, 'fields' => $fields));
}
2
Sharky

1. Désactiver l'affichage automatique

Vous souhaitez définir l'affichage automatique dans l'onglet Options du champ sur "Ne pas afficher automatiquement". Cela fera en sorte qu'il n'apparaisse pas dans le corps HTML dans le cadre de l'article.

2. Créer un article de remplacement.

Ensuite, vous devrez créer un remplacement de la vue d'article, si elle n'existe pas déjà. Copiez default.php et default_links.php à partir des composants/com_content/views/article/tmpl/et collez-les dans templates/YOUR_TEMPLATE/html/com_content/article /.

Ces fichiers remplaceront les fichiers de vue d'article de composant par défaut.

. Ajouter un champ personnalisé à l'en-tête HTML

Pour ajouter le contenu du champ personnalisé au <head> de la page, vous devrez éditer le fichier default.php que vous venez de créer.

Si vous ajoutiez une balise canonique, cela ressemblerait un peu à ceci.

//Insert custom field into HTML head if not empty
foreach ($this->item->jcfields as $field) {
    //Replace X with the field ID number
    if ($field->id === 'X') {
        //Makes sure the field is not empty
        if (!empty($field->rawvalue)) {
            //Inserts the field content with markup into the HTML head
            $customField = '<link href="' . $field->rawvalue . '" rel="canonical" />';
            $document = JFactory::getDocument();
            $document->addCustomTag($customField);
        }
        continue;
    }
};

Vous devrez fournir le balisage HTML correct dans votre code. Vous devrez remplacer $customField = '<link href="' . $field->rawvalue . '" rel="canonical" />'; avec le balisage correct.

Par exemple, si vous souhaitez inclure un auteur de carte Twitter, vous utiliserez quelque chose comme ceci: $ customField = 'rawvalue. '"/>';`

Notez également que vous devrez remplacer le X par l'ID de votre champ personnalisé.

Enfin, je renommerais $customField à quelque chose d'un peu plus relavent.

2
D. Morell