mon 1er plugin de contenu pour ajouter des MetaData - vos retours

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] mon 1er plugin de contenu pour ajouter des MetaData - vos retours

    Bonjour à tous,

    Vous savez mon attachement aux Custom Fields

    Et pour un site, j'avais besoin de créer des MetaData un peu particulières, au format "DublinCore".
    En particulier, c'est même pas que un Custom Field correspond à une Meta DublinCore... car en fait c'est souvent la concaténation de plusieurs champs qui est nécessaire.

    Autant dire qu'il n'y avait pas d'extensions permettant de faire exactement ça.
    Bref, c'était l'occasion de me lancer : je viens d'écrire mon tout premier plugin de contenu

    Ci-dessous, mon code...
    Mais je suis sûr que les codeurs parmi vous seront contents de me faire des suggestions (surtout que maintenant que je suis lancé, je veux m'améliorer ).

    Pour visualiser le résultat, ce que ça va générer c'est p ex ceci :

    Code HTML:
    <link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />
    <meta name="DC.title" content="Maclotte" />
    <meta name="DC.subject" content="instrumental | maclotte | accordéon" />
    <meta name="DC.creator" content="Elisabeth XXX | Françoise YYY" />
    <meta name="DC.coverage" content="Liège | Walk (Malmedy) | Hautes-Fagnes" />
    <meta name="DC.date" content="" />
    <meta name="DC.rights.holder" content="Françoise YYY" />
    <meta name="DC.identifier" content="FL-14" />
    <meta name="DC.format" content="bande magnétique" />
    <meta name="DC.source" content="C B C D C A G E C B" />
    Déjà, merci pour vos retours...

    Code PHP:
    <?php

    // no direct access
    defined'_JEXEC' ) or die;

    jimport'joomla.plugin.plugin' );
    jimport'joomla.environment.uri' );

    class 
    plgContentDublincoreMeta extends JPlugin
    {
    public function 
    onContentPrepare($context, &$row, &$params$page 0)
    {
    $document JFactory::getDocument();

    // !!! the 2 following IF come from hotometa. I don't know if they are still useful in our case and phrased correctly.

    // is this an article that is displayed
    if ( JRequest::getVar'view' ) == 'article' )
    // does the article have custom fields
    if ( is_array$row->jcfields ) || is_object$row->jcfields ) ) {

    // Our Dublin Core are only for Articles of Category ID = 11 (Séquences)
    if ($row->catid == 11) {

    // DublinCore Schema
    $dublincoreschema '<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />';
    // Output the custom tag to the html header as html safe
    $document->addCustomTag($dublincoreschema);

    // DublinCore Title: Article Title
    $dublincoremeta ='<meta name="DC.title" content="' $row->title '" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Subject: Genre + Type + Thématiques + Instruments
    $dublincoremeta ='<meta name="DC.subject" content="' rtrim(html_entity_decode($row->jcfields[1]->value) . ' | ' html_entity_decode($row->jcfields[2]->value) . ' | ' html_entity_decode($row->jcfields[3]->value) . ' | ' html_entity_decode($row->jcfields[4]->value), ' |') .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Creator: Interprètes, Collecteurs

    // sometimes the Custom Field only contains one Article ID (like 8) but not if there are multiple Article IDs (an array with 8 and 9)

    $article JTable::getInstance("content");

    $articletitles '';

    $ids $row->jcfields[24]->rawvalue// interprètes

    if (!is_array($ids))
    {
    $ids = [$ids]; // we transform it into an array. So we can simplify the code instead of having to manage a value if one ID and an array if multiple IDs
    }

    foreach (
    $ids as $id) {
    $article->load($id);
    $articletitles .= $article->get("title") . ' | ';
    }

    $ids $row->jcfields[25]->rawvalue// collecteurs

    if (!is_array($ids))
    {
    $ids = [$ids]; // we transform it into an array. So we can simplify the code instead of having to manage a value if one ID and an array if multiple IDs
    }

    foreach (
    $ids as $id) {
    $article->load($id);
    $articletitles .= $article->get("title") . ' | ';
    }

    $dublincoremeta ='<meta name="DC.creator" content="' rtrim($articletitles' |') . '" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Coverage: Province, Lieu, Aire Culturelle
    $dublincoremeta ='<meta name="DC.coverage" content="' html_entity_decode($row->jcfields[17]->value) . ' | ' html_entity_decode($row->jcfields[7]->value) . ' | ' html_entity_decode($row->jcfields[18]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Date: Date
    $dublincoremeta ='<meta name="DC.date" content="' html_entity_decode($row->jcfields[9]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Rights holder: Propriétaire
    $dublincoremeta ='<meta name="DC.rights.holder" content="' html_entity_decode($row->jcfields[19]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Identifier: N° d'inventaire
    $dublincoremeta ='<meta name="DC.identifier" content="' html_entity_decode($row->jcfields[11]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore Format: Support
    $dublincoremeta ='<meta name="DC.format" content="' html_entity_decode($row->jcfields[20]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    // DublinCore HasVersion: Autres versions

    $articletitles '';

    $ids $row->jcfields[26]->rawvalue// other versions of the music

    if(!empty($ids)) // need to check this otherwise we could have the Title of last used article while this Custom Field was empty
    {
    if (!
    is_array($ids))
    {
    $ids = [$ids]; // we transform it into an array. So we can simplify the code instead of having to manage a value if one ID and an array if multiple IDs
    }

    foreach (
    $ids as $id) {
    $article->load($id);
    $articletitles .= $article->get("title") . ' | ';
    }

    $dublincoremeta ='<meta name="DC.hasversion" content="' rtrim($articletitles' |') . '" />';
    $document->addCustomTag($dublincoremeta);
    }

    // DublinCore Source: Incipit
    $dublincoremeta ='<meta name="DC.source" content="' html_entity_decode($row->jcfields[14]->value) .'" />';
    $document->addCustomTag($dublincoremeta);

    }

    }
    return;
    }
    }
    Dernière édition par cavo789 à 09/04/2020, 15h07
    Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

    Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

    Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

  • #2
    Bonjour l'ami

    Top top top. Bravo pour ton premier plugin.

    Alors, je me lâche

    0. Declare strict_types ; oh yeah! Autant être propre sur soi

    1. die est un alias en php vers la fonction exit(). Cette fonction accepte un paramètre comme un code ou un texte (p.ex. exit('fin')). Logiquement donc die() devrait être suivi de parenthèses.

    2. Le code que tu proposes est un code PHP écrit à l'ancienne. Comme tu le sais, je ne suis (du verbe suivre) plus la programmation sous Joomla mais, en PHP 7, il est plus que recommandé de définir les types. Dans le meilleur des mondes, il faudrait écrire quelque chose comme "public function onContentPrepare(string $context, \stdClass &$row, array &$params, int $page = 0)" (j'ai mis ce qui me paraît être le bon type de données). Peut-être ne rien faire ici ou, si tu es tatilon comme je le suis, voir avec un développeur Joomla confirmé s'il est possible de "typer" les données.

    3. Tu as écris "if ( JRequest::getVar( 'view' ) == 'article' )" alors que c'est mieux d'opter pour la manière dont s'exprime maître Yoda (décidément, il est partout notre maître Jedi). En Yoda style, c'est " if (18 == $age) " et pas "if ($age == 18) ". Pourquoi ? Pour éviter des erreurs stupides du style "if ($age = 18) " (je te laisse deviner le souci). Donc, toujours mettre à gauche la valeur "hardcodé" et à droite la variable. Dans le meilleur des mondes opter aussi pour le triple égal : si tu sais que JRequest::getVar( 'view' ) retourne une chaîne de caractères, il est meilleur de comparer avec ... une chaîne de caractères et donc "if ('article' === JRequest::getVar('view')) "

    4. MAIS On peut alléger le code en retournant vite... Tu as imbriqué deux IF et cela complexifie la lecture. En fait, il faut faire la comparaison inverse. Si ce n'est pas un article, ouste!. Cela réduit ce qu'on nomme la "complexité" d'un code

    5. Le code de hotometa n'est pas bon: ta variable $row->jcfields est un array, pas un objet. On peut le voir au fait que tu accèdes à ses éléments en utilisant des indices d'un tableau. Ce n'est pas un objet et il n'y a donc pas lieu de tester si c'est un objet.

    6. Tu as hardcodé le chiffre 11. Bonne chance dans quelques mois de retrouver ce chiffre dans ton code. Si tu optes pour une constante, ce serait mieux. TU verras que j'ai créé une constante DUBLIN_CATEGORY. (==> ce type de syntaxe est pour PHP 7)

    7. " if ($row->catid == 11) " en Yoda style, constante et en triple égal devient "if (self:: DUBLIN_CATEGORY === $row->catid)" (!!! j'ai mis un espace entre self: et DUBLIN pour éviter le smiley)

    8. Ici encore je simplifie les nombreux "nested if". Si ce n'est pas la DUBLIN_CATEGORY, ouste une fois encore

    9. Je supprimerais ta variable " $dublincoreschema " car elle ne sert qu'une seule fois et en écrivant sur trois lignes comme je le propose ci-dessous, la lisibilité reste quand même excellente

    10. Idem pour " $dublincoremeta " que je supprime aussi et pour l'injection des variables, j'opte pour sprintf() qui permet d'écrire ta phrase (qu'on pourra alors mettre dans un fichier pour traduction p.ex.) avec des "placeholders". "%s" est pour une chaîne de caractères. D'autres placeholders existent.

    11. Je remplace " 24 " par une constante. Tu seras heureux de retrouver toutes tes constantes en un seul lieu dans le futur.

    12. Pour les lignes, on tente généralement d'éviter qu'elles soient trop longues (perso max 120 caractères). Du coup, je scinde les commentaires sur plusieurs lignes.

    13. Tu as un "copié/collé" dans ton code. Pour les interprêtes et les collecteurs, le code est strictement le même (excepté l'ID). Du coup, je propose de n'avoir qu'une seule fois le code PHP en utilisant un foreach et j'ai donc créé une variable temporarion $categories.

    14. Je ne comprends pas la ligne où tu réinitialises " $articletitles = ''; ". C'est la ligne après " // DublinCore HasVersion: Autres versions ". Tu as donc initialisé $articletitles plus haut dans ton code et tu n'as pas fait usage de ta variable et tu les réinitialises... Quelque chose doit m'échapper.

    15. Perso, quand j'ai déjà expliqué quelque chose dans mon code quelques lignes plus haut, je ne l'explique plus une fois encore ou alors je simplifie. Je propose donc de n'écrire plus que " // Create a single item array. "

    16. Afin que ton code soit "bullet-proof", j'ai ajouté un " if (isset($row->jcfields[self::OWNER_ID])) { " pour la ligne sur le propriétaire; je te laisse le faire pour les autres. L'idée est donc de ne pas planter ton programme si jamais tu n'as pas ce champs-là dans tes custom fields.

    17. J'ai ajouté un "doc block" à ta fonction

    18. Toutes fonctions est supposées retourner une valeur (sinon ce n'est pas sémantiquement une fonction). Quand une fonction ne retourne rien (rien étant une valeur (t'ai-je perdu?)), on écrit un simple "return;". Dans un code PHP qui sera plus tard documentaté, c'est équivalent à "@return void".

    19. Pfiou... je ne pensais pas que j'y passerais autant de temps mais faut que je mérite d'être sur une marche plus haute que la tienne sur le podium, jeune padawan :-D

    Code PHP:
    <?php

    declare(strict_types 1);

    /**
     * Woluweb bla bla bla
     * php version 7.0
     *
     * Bla bla bla bla
     *
     * @package   plugin_woluweb
     * @author    "Marc Dechèvre <marc@woluweb.be>"
     * @copyright 2020-2020 (c)Woluweb
     * @license   MIT
     *
     * @link https://TONSITE(ou lien vers un repo sur github)
     * @wiki https://TONSITE/DOC (ou lien vers un wiki sur github)
     */

    defined('_JEXEC') or die();

    jimport('joomla.plugin.plugin');
    jimport('joomla.environment.uri');

    class 
    plgContentDublincoreMeta extends JPlugin
    {
        
    // Our Dublin Core are only for Articles of Category ID = 11 (Séquences)
        
    const DUBLIN_CATEGORY 11;

        
    // Other categories used for Dublin core meta
        
    const AIRE_CULTURELLE_ID 18;
        const 
    COLLECTEURS_ID     25;
        const 
    DATE_ID            9;
        const 
    GENRE_ID           1;
        const 
    INCIPIT_ID         14;
        const 
    INSTRUMENTS_ID     4;
        const 
    INTERPRETES_ID     24;
        const 
    INVENTORY_ID       11;
        const 
    LIEU_ID            7;
        const 
    MUSIC_ID           26;
        const 
    OWNER_ID           19;
        const 
    PROVINCE_ID        17;
        const 
    SUPPORT_ID         20;
        const 
    THEME_ID           3;
        const 
    TYPE_ID            2;

        
    /**
         * Modifies the HTML content of the page (not the article)
         * being finalized by Joomla! and inserts meta tags for
         * Dublin Core Meta by retrieving data from the custom fields
         * of the article.
         *
         * @param [type] $context   HTML content of the page. Unused
         * @param [type] $row       Article being displayed
         * @param [type] $params    Parameters of the plugin. Unused
         * @param integer $page     Paginatiopn of Joomla. Unused
         *
         * @return void
         */
        
    public function onContentPrepare($context, &$row, &$params$page 0)
        {
            
    $document JFactory::getDocument();

            
    // Not an article? Nothing to do
            
    if ('article' !== JRequest::getVar('view')) {
                return;
            }

            
    // Well an article but no custom fields? Nothing to do
            
    if (!is_array($row->jcfields)) {
                return;
            }

            
    // Not Dublin? Ok, nothing to do
            
    if (self::DUBLIN_CATEGORY !== $row->catid) {
                return;
            }

            
    // Output the custom tag to the html header as html safe
            // DublinCode Schema
            
    $document->addCustomTag(
                
    '<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />'
            
    );

            
    // DublinCore Title: Article Title
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.title" content="%s" />',
                    
    $row->title
                
    )
            );

            
    // DublinCore Subject: Genre + Type + Thématiques + Instruments
            
    $document->addCustomTag(
                
    '<meta name="DC.subject" content="%s | %s | %s | %s" />',
                
    html_entity_decode($row->jcfields[self::GENRE_ID]->value),
                
    html_entity_decode($row->jcfields[self::TYPE_ID]->value),
                
    html_entity_decode($row->jcfields[self::THEME_ID]->value),
                
    html_entity_decode($row->jcfields[self::INSTRUMENTS_ID]->value)
            );

            
    // DublinCore Creator: Interprètes, Collecteurs
            // sometimes the Custom Field only contains one Article ID (like 8)
            // but not if there are multiple Article IDs (an array with 8 and 9)

            
    $article JTable::getInstance('content');

            
    $articletitles '';

            
    $categories = [self::INTERPRETES_IDself::COLLECTEURS_ID];
            foreach (
    $categories as $category) {
                
    $ids $row->jcfields[$category]->rawvalue;

                
    // we transform it into an array. So we can simplify the code instead of
                // having to manage a value if one ID and an array if multiple IDs
                
    if (!is_array($ids)) {
                    
    $ids = [$ids];
                }

                foreach (
    $ids as $id) {
                    
    $article->load($id);
                    
    $articletitles .= $article->get('title') . ' | ';
                }
            }

            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.creator" content="%s" />',
                    
    rtrim($articletitles' |')
                )
            );

            
    // DublinCore Coverage: Province, Lieu, Aire Culturelle
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.coverage" content="%s | %s | %s" />',
                    
    html_entity_decode($row->jcfields[self::PROVINCE_ID]->value),
                    
    html_entity_decode($row->jcfields[self::LIEU_ID]->value),
                    
    html_entity_decode($row->jcfields[self::AIRE_CULTURELLE_ID]->value)
                )
            );

            
    // DublinCore Date: Date
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.date" content="%s" />',
                    
    html_entity_decode($row->jcfields[self::DATE_ID]->value)
                )
            );

            
    // DublinCore Rights holder: Propriétaire
            
    if (isset($row->jcfields[self::OWNER_ID])) {
                
    $document->addCustomTag(
                    
    sprintf(
                        
    '<meta name="DC.rights.holder" content="%s" />',
                        
    html_entity_decode($row->jcfields[self::OWNER_ID]->value)
                    )
                );
            }        

            
    // DublinCore Identifier: N° d'inventaire
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.identifier" content="%s" />',
                    
    html_entity_decode($row->jcfields[self::INVENTORY_ID]->value)
                )
            );

            
    // DublinCore Format: Support
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.format" content="%s" />',
                    
    html_entity_decode($row->jcfields[self::SUPPORT_ID]->value)
                )
            );

            
    // DublinCore HasVersion: Autres versions
            
    $articletitles '';

            
    // other versions of the music
            
    $ids $row->jcfields[self::MUSIC_ID]->rawvalue;

            
    // need to check this otherwise we could have the Title
            // of last used article while this Custom Field was empty
            
    if (!empty($ids)) {
                
    // Create a single item array.
                
    if (!is_array($ids)) {
                    
    $ids = [$ids];
                }

                foreach (
    $ids as $id) {
                    
    $article->load($id);
                    
    $articletitles .= $article->get('title') . ' | ';
                }

                
    $document->addCustomTag(
                    
    sprintf(
                        
    '<meta name="DC.hasversion" content="%s" />',
                        
    rtrim($articletitles' |')
                    )
                );
            }

            
    // DublinCore Source: Incipit
            
    $document->addCustomTag(
                
    sprintf(
                    
    '<meta name="DC.source" content="%s" />',
                    
    html_entity_decode($row->jcfields[self::INCIPIT_ID]->value)
                )
            );

            return;
        }
    }
    Dernière édition par cavo789 à 09/04/2020, 16h42
    woluweb aime ceci.
    Christophe (cavo789)
    Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
    Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

    Commentaire


    • #3
      Mazette !

      17000+ réponses... et si chaque réponse prend 90 minutes. aaargh

      Merci cher (très cher !) Christophe (y)
      Présentations : slides.woluweb.be | Coordonnées complètes : www.woluweb.be

      Un message d’erreur sur votre site Joomla... ayez le reflexe de consulter la base de connaissance : https://kb.joomla.fr

      Ce forum, vous l'aimez ? Il vous a sauvé la vie ? Vous y apprenez régulièrement ? Alors adhérer à l'AFUJ, l'Association Francophone des Utilisateurs de Joomla : https://www.joomla.fr/association/adherer

      Commentaire


      • #4
        Bonjour

        Voici le code final (tiens, le forum ne prend pas mon indentation...)
        Si mais il faut veiller à utiliser une indentation faite avec des espaces et non des tabulations qui sont en effet supprimées sur vBulletin.
        Christophe (cavo789)
        Mon blog, on y parle Docker, PHP, WSL, Markdown et plein d'autres choses : https://www.avonture.be
        Logiciel gratuit de scan antivirus : https://github.com/cavo789/aesecure_quickscan (plus de 45.000 virus détectés, 700.000 fichiers sur liste blanche)​

        Commentaire


        • #5
          Envoyé par woluweb
          Merci aussi à Emmanuel Danan pour son retour.

          Voici le code final (tiens, le forum ne prend pas mon indentation...)

          Code PHP:
          <?php
          declare(strict_types 1);
          /**
          * Woluweb
          * php version 7.0
          *
          * @package Plugin DublinCore for Joomla! 3
          * @author "Marc Dechèvre <marc@woluweb.be>"
          * @copyright 2020-2020 (c)Woluweb
          * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
          *
          * @link https://www.woluweb.be
          */
          defined('_JEXEC') or die();
          jimport('joomla.plugin.plugin');
          jimport('joomla.environment.uri');
          class 
          plgContentDublincoreMeta extends JPlugin
          {
          // Our Dublin Core are only for Articles of Category ID = 11 (Séquences)
          const MY_DUBLIN_CATEGORY 11;
          // Other categories used for Dublin core meta
          const AIRE_CULTURELLE_ID 18;
          const 
          COLLECTEURS_ID 25;
          const 
          DATE_ID 9;
          const 
          GENRE_ID 1;
          const 
          INCIPIT_ID 14;
          const 
          INSTRUMENTS_ID 4;
          const 
          INTERPRETES_ID 24;
          const 
          INVENTORY_ID 11;
          const 
          LIEU_ID 7;
          const 
          MUSIC_ID 26;
          const 
          OWNER_ID 19;
          const 
          PROVINCE_ID 17;
          const 
          SUPPORT_ID 20;
          const 
          THEME_ID 3;
          const 
          TYPE_ID 2;
          /**
          * Modifies the HTML content of the page (not the article)
          * being finalized by Joomla! and inserts meta tags for
          * Dublin Core Meta by retrieving data from the custom fields
          * of the article.
          *
          * @param [type] $context HTML content of the page. Unused
          * @param [type] $row Article being displayed
          * @param [type] $params Parameters of the plugin. Unused
          * @param integer $page Paginatiopn of Joomla. Unused
          *
          * @return void
          */
          public function onContentPrepare($context, &$row, &$params$page 0)
          {
          $document JFactory::getDocument();
          $jinput JFactory::getApplication()->input;
          // Not an article? Nothing to do
          if ($jinput->get('view') != 'article') {
          return;
          }
          // Well an article but no custom fields? Nothing to do
          if (!is_array($row->jcfields)) {
          return;
          }
          // Not Dublin? Ok, nothing to do
          if (self::MY_DUBLIN_CATEGORY != $row->catid) {
          // if ($row->catid != 11) {
          // var_dump($row->catid);
          // exit();
          return;
          }
          // Output the custom tag to the html header as html safe
          // DublinCode Schema
          $document->addCustomTag(
          '<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" />'
          );
          // DublinCore Title: Article Title
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.title" content="%s" />',
          $row->title
          )
          );
          // DublinCore Subject: Genre + Type + Thématiques + Instruments
          if (isset($row->jcfields[self::GENRE_ID]) && !empty($row->jcfields[self::GENRE_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.subject" content="%s | %s | %s | %s" />',
          html_entity_decode($row->jcfields[self::GENRE_ID]->value),
          html_entity_decode($row->jcfields[self::TYPE_ID]->value),
          html_entity_decode($row->jcfields[self::THEME_ID]->value),
          html_entity_decode($row->jcfields[self::INSTRUMENTS_ID]->value)
          )
          );
          }
          // DublinCore Creator: Interprètes, Collecteurs
          // sometimes the Custom Field only contains one Article ID (like 8)
          // but not if there are multiple Article IDs (an array with 8 and 9)
          $article JTable::getInstance('content');
          $articletitles '';
          if (isset(
          $row->jcfields[self::INTERPRETES_ID]) && !empty($row->jcfields[self::INTERPRETES_ID]->value)) {
          $categories = [self::INTERPRETES_IDself::COLLECTEURS_ID];
          foreach (
          $categories as $category) {
          // for this Regular Labs Articles Field, the VALUE is the
          // real html link, while the RAWVALUE is either an array if
          // multiple values, but simply a number if there is just one article linked
          $ids $row->jcfields[$category]->rawvalue;
          // we transform it into an array. So we can simplify the code instead of
          // having to manage a value if one ID and an array if multiple IDs
          if (!is_array($ids)) {
          $ids = [$ids];
          }
          foreach (
          $ids as $id) {
          $article->load($id);
          $articletitles .= $article->get('title') . ' | ';
          }
          }
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.creator" content="%s" />',
          rtrim($articletitles' |')
          )
          );
          }
          // DublinCore Coverage: Province, Lieu, Aire Culturelle
          if (isset($row->jcfields[self::PROVINCE_ID]) && !empty($row->jcfields[self::PROVINCE_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.coverage" content="%s | %s | %s" />',
          html_entity_decode($row->jcfields[self::PROVINCE_ID]->value),
          html_entity_decode($row->jcfields[self::LIEU_ID]->value),
          html_entity_decode($row->jcfields[self::AIRE_CULTURELLE_ID]->value)
          )
          );
          }
          // DublinCore Date: Date
          if (isset($row->jcfields[self:ATE_ID]) && !empty($row->jcfields[self:ATE_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.date" content="%s" />',
          html_entity_decode($row->jcfields[self:ATE_ID]->value)
          )
          );
          }
          // DublinCore Rights holder: Propriétaire
          if (isset($row->jcfields[self::OWNER_ID]) && !empty($row->jcfields[self::OWNER_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.rights.holder" content="%s" />',
          html_entity_decode($row->jcfields[self::OWNER_ID]->value)
          )
          );
          }
          // DublinCore Identifier: N° d'inventaire
          if (isset($row->jcfields[self::INVENTORY_ID]) && !empty($row->jcfields[self::INVENTORY_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.identifier" content="%s" />',
          html_entity_decode($row->jcfields[self::INVENTORY_ID]->value)
          )
          );
          }
          // DublinCore Format: Support
          if (isset($row->jcfields[self::SUPPORT_ID]) && !empty($row->jcfields[self::SUPPORT_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.format" content="%s" />',
          html_entity_decode($row->jcfields[self::SUPPORT_ID]->value)
          )
          );
          }
          if (isset(
          $row->jcfields[self::MUSIC_ID]) && !empty($row->jcfields[self::MUSIC_ID]->value)) {
          // DublinCore HasVersion: Autres versions
          $articletitles '';
          // other versions of the music
          $ids $row->jcfields[self::MUSIC_ID]->rawvalue;
          // need to check this otherwise we could have the Title
          // of last used article while this Custom Field was empty
          if (!empty($ids)) {
          // Create a single item array.
          if (!is_array($ids)) {
          $ids = [$ids];
          }
          foreach (
          $ids as $id) {
          $article->load($id);
          $articletitles .= $article->get('title') . ' | ';
          }
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.hasversion" content="%s" />',
          rtrim($articletitles' |')
          )
          );
          }
          }
          // DublinCore Source: Incipit
          if (isset($row->jcfields[self::INCIPIT_ID]) && !empty($row->jcfields[self::INCIPIT_ID]->value)) {
          $document->addCustomTag(
          sprintf(
          '<meta name="DC.source" content="%s" />',
          html_entity_decode($row->jcfields[self::INCIPIT_ID]->value)
          )
          );
          }
          return;
          }
          }
          // instead of
          // $article = JTable::getInstance('content');
          // $article->load($id);
          // which is perfect here, if JTable was not available we could simply make a query as follows
          // $db = JFactory::getDbo();
          // $query = $db->getQuery(true);
          // $query
          // ->select('*')
          // ->from('#__content')
          // ->where('id = ' . $id);
          // $db->setQuery($query);
          // $article = $db->loadObject();
          // $articletitles .= $article->title . ' | ';
          Intéressant
          https://www.annuaire.rn.tn
          https://www.techno.rn.tn

          Commentaire

          Annonce

          Réduire
          Aucune annonce pour le moment.

          Partenaire de l'association

          Réduire

          Hébergeur Web PlanetHoster
          Travaille ...
          X