[XenForo] Étendre un controller existant afin de lui ajouter une nouvelle fonction

Kévin 🚀

Administrateur
Administrateur
Inscription
18 Décembre 2012
Messages
4 822
Réactions
5 532
Points
27 882
Salut à tous,

On se retrouve pour un tutoriel qui va vous apprendre à étendre un controller Xenforo pour pouvoir lui ajouter une action.

Qu'est qu'une action ?
Une action est une fonction qui permet d'ajouter des fonctionnalités à XenForo qui ne sont pas présentes de base dans le forum.
Sommaire :
  1. Création d'une addon
  2. Création des dossiers et fichiers
  3. Explication pour étendre le controller.
    1. Création du fichier LoadClassController.php
    2. Création du fichier Account.php
    3. Création de la template
    4. Ajout de l’événement dans l'AdminCP
  4. Essai du système.
Avant de commencer vous devez mettre votre forum en mode Debug pour avoir accès à l'onglet développement pour ce faire vous allez dans votre dossier library, vous ouvrez le fichier config.php et vous ajoutez
PHP:
$config['debug'] = true;
en dessous de la dernière ligne.

1. Création d'un addon :

Pour ajouter une addon à votre forum il faut vous rendre dans votre Admin CP ( ) sur la page d'accueil de l'adminCP dans la sidebar en bas à droite une partie qui s'appelle Extensions installées qui contient les addons présente sur votre site
Extensions.png


Vous allez cliquer sur Gestion des extensions puis vous allez cliquer sur + Créer une extension le bouton est situé en haut à droite de la page

Une nouvelle page va apparaître sur votre écran avec plusieurs paramètres.
Pour le tutoriel j'appelle l'addon RGController
  • ID de l'extension : rg_controller
  • Titre : RealityGaming - Controller
  • Chaîne de la version : 1.0
  • ID de la version : 1
  • URL : Comme vous voulez si vous voulez mettre l'url de votre mettez la sinon cela ne changera rien a l'addon
  • Code d'installation : Pas utilisé pour ce tutoriel
  • Code de désinstallation : Pas utilisé pour ce tutoriel
Une fois les paramètres remplit cliquez sur Sauvegarder l'extension.
Attention les paramètres ci-dessus sont donnés à titre d'exemple vous pouvez les modifier !

Si tout c'est bien passé vous devez voir l'extension dans la liste des addons.
Nous allons donc passer à la création des dossiers.

2. Créations des dossiers
Donc connectez vous à votre FTP ou autres afin de pouvoir accéder aux dossiers de votre forum. Une fois connecté rendez vous dans le dossier Library
A l'intérieur de celui-ci vous allez créer un dossier qui s'appelle comme l'extension que nous venons de créer donc pour le tutoriel le dossier s'appelle RGController

Une fois le dossier créé vous allez dans celui-ci est créer deux nouveaux dossiers :
  1. ControllerPublic (Celui permet d'étendre les controller dit public donc ce que le visiteur peut voir, vous avez aussi ControllerAdmin qui d'étendre les controller de l'AdminCP)
  2. Listener (Celui permettra d'indiquer au forum quelle class nous allons étendre)
Une fois l'architecture de dossier fini nous allons passer a la troisième étape

3. Explication pour étendre le controller.

Donc nous allons étendre dans ce tutoriel le controller account afin de lui ajouter une nouvelle action qui s'appellera RGTutoriel

Pour ce faire vous allez créer un nouveau fichier dans le Listener qui s'appellera LoadClassController.php
Dans ce fichier vous allez ajouter ce code :

Attention vous devrez modifier le RGController en fonction du nom de votre dossier si votre dossier s'appelle Rouki vous devrez Rouki_Listener_LoadClassController pareil pour le RGController_ControllerPublic_Account il devient Rouki_ControllerPublic_Account

PHP:
<?php
class RGController_Listener_LoadClassController {
    public static function extendAccount($class, array &$extend) {
        if ($class == 'XenForo_ControllerPublic_Account') {
            $extend[] = 'RGController_ControllerPublic_Account';
        }
    }
}

Sauvegarder le fichier, maintenant allez dans le dossier ControllerPublic et vous allez créer un nouveau fichier qui s'appellera Account.php

Même remarque que pour le code ci-dessus si votre nom de dossier est différent n'oubliez pas de le changer sinon ça ne fonctionnera pas !

Ajoutez ce code dans le fichier :
PHP:
<?php
class RGController_ControllerPublic_Account extends XFCP_RGController_ControllerPublic_Account {
    public function actionRGTutoriel() {
        //Variables
        $visitor  = XenForo_Visitor::getInstance();
        $username = $visitor->get('username');
        $userId   = $visitor->get('user_id');

        //Permet de récuperer les variables dans la templete (Style)
        $viewParams = array(
            'username' => $username,
            'userId'   => $userId,
        );
        return $this->responseView('', 'RGController_Account_RGTutoriel', $viewParams);
    }
}

Explication du code ci-dessus donc
  • public function actionRGTutoriel() définie la nouvelle action que nous allons ajouter au controller Account.
  • $username et $userId permet de récupérer les informations du membre (Pseudo et Id) qui regarde la page
  • Le $viewParams permet de pouvoir récupérer les informations dans le template de style que nous allons créer.
  • RGController_Account_RGTutoriel est le nom de la template que nous allons créer, pareil c'est modifiable en fonction du nom que vous avez donné a votre addon
Maintenant nous allons créer le template, donc vous allez dans Apparence => Style maître (Important, cela permet au template d'être ajouté dans tout les styles de votre forum !) => Créer un nouveau template.

Trois nouveaux champs à remplir :​
  • Nom : RGController_Account_RGTutoriel (A modifier en fonction de ce que vous avez définie comme nom dans le code)
  • Le textarea : Contient le code de la page (html) le php ne fonctionne pas dans les templates !
  • Extension : Vous mettez l'extension que nous avons créer au début du tutoriel.
Donc dans le textarea afin de tester le bon fonctionnement de la nouvelle action vous allez mettre :
HTML:
Bravo <b>{$username}</b> vous avez réussi a étendre le controller Account, votre Id sur le forum est <b>{$userId}</b>
{$username} et {$userId} va appeler les variables que vous avons mis dans l'array() et les afficher sur la page.

Une fois la template sauvegardée, vous allez dans l'onglet développement => observateur d’événement => créer un nouvel observateur d’événement

6 nouveaux champs sont apparu sur votre écran :​
  • Observer l'événement : load_class_controller
  • Mot clef d'événement : Vous mettez rien
  • Exécuter le callback : Dans la première case vous mettre le nom de la class LoadClassController donc RGController_Listener_LoadClassController et dans l'autre vous mettez le nom de l'action qui est dans le fichier donc extendAccount
  • Ordre d’exécution du callback : Vous laissez comme ça
  • Description : Ajout l'action RGTutoriel au controller Account
  • Extension : L'extension que nous avons crée au début
Sauvegarder l'événement et nous pouvons passer au test.

4. Essai du système

Donc il vous suffit de vous rendre sur votre forum de mettre d'aller sur les paramètres de votre compte donc
rgtutoriel est le nom définie dans la fonction public function actionRGTutoriel()

Si vous avez l'écran :
Account.png


Voilà maintenant vous savez étendre un controller, vous pouvez ajouter de nouvelle fonctionnalité a votre forum.

Si vous avez des soucis ou des questions n'hésitez pas répondre au sujet ;)

A bientôt,
Fara' SEC
 

Rivals

Ancien staff
Inscription
27 Août 2016
Messages
1 705
Réactions
895
Points
13 104
Sympa, mais : l'instance du visitor est disponible dans toutes les templates, donc un simple {$visitor.username} & {$visitor.user_id} aurait suffit pour ce type de situations, ceci c'est un bon entraînement pour passer ses variables en paramètres de template ! :)
 
Haut