Ajouter un lien de démonstration
aux articles de mon blog

Vous l'avez peut-être remarqué, certains de mes articles sont accompagnés d'une démonstration, j'avais l'habitude de la mentionner dans l'article, mais récemment j'ai eu envie de quelque chose de plus visuel, genre un bouton rose avec « démo » marqué dessus. Pour cela j'avais besoin de pouvoir associer une URL de démonstration à mes articles, et après 20 secondes d'efforts pour arriver à mes fins, je me dis que ça pourrait être intéressant de partager la démarche à suivre, histoire de présenter quelques fonctionnalités de mon framework WdCore et de mon CMS WdPublisher.

Au cours de ce bref mais néanmoins fascinant voyage, nous allons découvrir les évènements, les fonctions de rappel, les classes qui se chargent toutes seules, la modification d'un formulaire d'édition, les métadonnées et plein de choses palpitantes. Commençons donc très vite par un état des lieux.

Il nous faut un nouveau champ !

Qui dit donnée supplémentaire, dit nouveau champ pour saisir cette donnée. En l'état, le module « Articles » propose, entre autre, les champs suivants :

358;before

Nous avons donc besoin d'un nouveau champ de type texte pour pouvoir saisir l'URL de la démonstration associée à l'article. L'URL sera enregistrée dans les métadonnées de mon article. D'ailleurs, avant de poursuivre, j'aimerai juste dire deux mots sur les métadonnées, sinon on risque de se perdre.

Les métadonnées

Les métadonnées sont des données supplémentaires qui peuvent être associées aux objets. Elles sont stockées dans leur propre espace et ne demandent pas de modifier la structure de l'objet auquel elles sont associées. Elles sont ensuite accessibles par la propriété metas de l'objet. C'est simple, et c'est pratique, alors passons sans plus attendre à l'ajout d'un champ supplémentaire à notre formulaire d'édition.

Ajouter un champ supplémentaire au formulaire d'édition

Le formulaire d'édition est une instance de la classe WdSectionedForm, qui est une sous-classe de la classe WdForm. Cette classe permet entre autre de définir des groupes d'éléments, on peut donc définir les éléments du formulaire dans l'ordre que l'on veut et arranger tout cela avec les attributs WdElement::T_GROUP et WdElement::T_WEIGHT. Notre nouvel élément fera partie du groupe primaire, alors pas la peine de s'ennuyer avec l'attribut T_GROUP, par contre on le placera avant le champ « Date » grâce à l'attribut T_WEIGHT, pour que ce soit plus joli.

Le formulaire d'édition est donc un objet et les éléments qui le composent se trouvent dans un arbre d'objet. C'est lorsque l'objet est transformé en chaine de caractères que la magie opère : les éléments sont ordonnés, les groupes sont formés et tout ce beau monde s'assemble pour terminer en fabuleux code HTML. Avant cette étape finale, l'évènement alter.block.edit est déclenché, donnant ainsi la possibilité à ceux qui le désirent de modifier les éléments et les attributs (tags) du formulaire. À nous de créer une fonction de rappel pour cet évènement, qui nous permettra de modifier les attributs du formulaire pour y ajouter notre élément.

Une fonction de rappel pour l'évènement alter.block.edit

En guise de fonction de rappel pour l'évènement alter.block.edit nous ajoutons une méthode statique publique à la classe weirdog_WdHooks. Cela à deux avantages : nous ne polluons pas l'espace public avec un énième fonction et nous pouvons utiliser la fonctionnalité de chargement automatique des classes du framework WdCore, pour charger à la demande la classe et la fonction de rappel.

Éditons à présent le fichier « /protected/includes/hooks.php » pour y ajouter notre classe et notre fonction de rappel :

<?php

class weirdog_WdHooks
{
    static public function event_alter_block_edit(WdEvent $event)
    {
        $event->tags = wd_array_merge_recursive
        (
            $event->tags, array
            (
                WdElement::T_CHILDREN => array
                (
                    'metas[demo_url]' => new WdElement
                    (
                        WdElement::E_TEXT, array
                        (
                            WdForm::T_LABEL => 'URL de démonstration',
                            WdElement::T_WEIGHT => 'subtitle'
                        )
                    )
                )
            )
        );
    }
}

Comme vous pouvez le voir, ce n'est pas bien compliqué. Les attributs du formulaire se trouvent dans la propriété tags de l'évènement, donc tout ce que l'on a à faire c'est d'y mélanger nos propres attributs. Comme nous l'avons vu plus haut, on utilise l'attribut T_WEIGHT pour placer notre élément après l'élément « Soustitre ».

Maintenant que la classe est prête, modifions la configuration pour déclarer la classe weirdog_WdHooks et la fonction de rappel pour l'évènement alter.block.edit.

Ajouter une classe aux classes à charger automatiquement

Le framework WdCore offre le chargement automatique des classes déclarées dans le tableau autoload de la configuration core. Celui de notre application se trouve dans le fichier « /protected/config/core.php » :

<?php

return array
(
    'autoload' => array
    (
        'weirdog_WdHooks' => $root . '/includes/hooks.php',
        ...
    ),

    ...
);

Enregistrons maintenant notre fonction de rappel pour l'évènement.

Ajouter une fonction de rappel à un évènement

Pour ajouter une fonction de rappel à un évènement, il suffit de l'ajouter à la configuration events. Celle de notre application se trouve dans le fichier « /protected/config/events.php » :

<?php

return array
(
    'alter.block.edit' => array
    (
        array('weirdog_WdHooks''event_alter_block_edit'),

        'instanceof' => 'contents_articles_WdModule'
    )
);

À noter que l'appel à notre fonction de rappel peut-être filtré. Pour éviter de coller notre nouvel élément à tous les formulaires d'édition, on utilise le paramètre instanceof qui nous permet de limiter la modification aux instances de la classe contents_articles_WdModule, en gros le module qui gère les articles.

L'élément « URL de démonstration » est maintenant disponible :

360;after

Passons à la création du lien dans notre article.

Afficher un lien vers l'URL de démonstration

Pour afficher un lien vers l'URL de démonstration il nous faut modifier le patron de l'article et y ajouter quelques lignes. À noter que lorsque le patron est évalué, l'article se trouve dans le this du contexte, on peut donc utiliser son synonyme @ pour accéder à l'objet :

@html DÉMO html@

Et voici le stupéfiant résultat :

361;result

Laisser un commentaire

Pas de commentaire