Tutoriel Apprenez à créer un add-On CRUD sous le CMS XenForo

Rivals

Ancien staff
Ancien staff
Inscription
27 Août 2016
Messages
617
Réactions
511
Points
2 446
    Réponse de Rivals Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #1
header.png
Bonjour à tous , nous allons aujourd'hui apprendre à créer notre premier add-On CRUD (Create, Read, Update, Delete) sous le CMS XenForo.
SOMMAIRE :

Architecture
Insertion de données
Affichage de données
Modification de données
Suppression de données
Avant toute chose je vais vous demander d'activer le mode debug de votre forum XenForo (créez un environnement de développement, n'utilisez en aucun cas une production).

ACTIVER LE MODE DEBUG
  1. Ouvrez le fichier Config.php que vous trouverez dans le dossier Library de votre FTP.
  2. Ajoutez la ligne suivante : $config['debug'] = true; .
header-archi.png
Dans ce premier chapitre nous allons voir ensemble comment structurer son add-On mais également l'utilité des dossiers qui composeront l'architecture de notre add-On, dans ce tutoriel je vais prendre un exemple particulier : vous êtes lobbyman , vous possédez un forum et vous souhaitez créer un add-On qui permettra à vos membres de demander des lobbys.
  1. Un add-On XenForo se situera toujours dans le dossier library (mais pas que, nous verrons ceci par la suite), créons un dossier Lobbys qui sera le dossier parent de notre add-On.
  2. Dans ce dossier Lobbys nous allons créer un premier dossier Model qui permettra d'effectuer des requêtes de type : je veux récupérer telle demande de lobby, je veux récupérer toutes les demandes de lobby entre telle date et telle date etc.
  3. Créons un autre dossier nommé DataWriter, ce dossier nous permettra de créer, modifier et supprimer des demandes de lobby.
  4. Puis un dossier Route et un sous dossier Prefix, ces dossiers nous permettrons de déclarer notre routing c'est à dire les URLs à utiliser pour notre add-On (exemple:
    Vous devez vous inscrire ou vous connecter pour voir les liens ! (c'est gratuit et rapide 🚀)
    ).
  5. Et enfin, terminons notre architecture avec un dossier ControllerPublic qui contiendra l'algorithme de notre add-On (si le membre soumet le formulaire alors j'enregistre....).
screen1.png
(l'architecture finalisée)
Avant toute chose nous devons créer le routing de notre add-On mais également notre add-On afin que l'on puisse afficher un formulaire de demande de lobbys par exemple.

ROUTING BASIQUE

  • Rendez-vous sur votre panel d'administration à l'onglet Development puis Create Add-on.
Add-on ID : lobbys , c'est tout simplement un identifiant unique correspondant à notre add-on.
Title : Lobbys, explicitement c'est le titre de celui-ci.
Version String :
1.0.0.
Version ID : 1.

URL : (vous pouvez laisser ce champs vide, ça n'a aucune importance)
Installation Code & Uninstallation Code : (laissez également vide pour le moment).
  • Sauvegardez et créez un fichier Public.php dans le dossier Prefix (Route > Prefix) et insérez le code ci-dessous
CODE
PHP:
<?php

class Lobbys_Route_Prefix_Public implements XenForo_Route_Interface
{
    /**
    * Match a specific route for an already matched prefix.
    *
    * @see XenForo_Route_Interface::match()
    */
    public function match($routePath, Zend_Controller_Request_Http $request, XenForo_Router $router)
    {
        //on précise que nos URLs (plus particulièrement nos actions) peuvent prendre un paramètre de base : l'identifiant du lobby
        $action = $router->resolveActionWithIntegerParam($routePath, $request, 'lobby_id');

        //on indique notre ControllerPublic que nous allons créer dans le chapitre suivant
        return $router->getRouteMatch('Lobbys_ControllerPublic_Index', $action, 'lobby');
    }

    /**
    * Method to build a link to the specified page/action with the provided
    * data and params.
    *
    * @see XenForo_Route_BuilderInterface
    */
    public function buildLink($originalPrefix, $outputPrefix, $action, $extension, $data, array &$extraParams)
    {
        return XenForo_Link::buildBasicLinkWithIntegerParam($outputPrefix, $action, $extension, $data, 'lobby_id');
    }
}

?>
  • Rendez-vous sur votre panel d'administration, à l'onglet Development puis Route Prefixes, pour créer un nouveau préfixe de routage.
  • Remplissez & sauvegardez les champs indiqués avec les valeurs suivantes :
Route Prefix : lobby (c'est notre URL de base, exemple : members/{username}.{id}/follow , l'URL de base est members).
Route Type :
Public .
Route Class :
Lobbys_Route_Prefix_Public qui correspond évidemment à la class PHP de notre fichier que nous venons de créer.
Use class to build link : Only when data is provided
Add-on : Lobbys (techniquement nous lions ce préfixe de routage à notre add-On, ainsi à chaque exportation de notre add-On ce préfixe sera inscrit dans le fichier .XML de notre module)

Nous nommons notre fichier "Public" car vous pouvez également créer un add-On qui concernera le panel d'administration dans ce cas vous devrez créer un fichier "Admin", vous devrez également modifier le préfixe de route en change le type de route de Public à Admin Control Panel.

header-insertion.png
Passons au deuxième chapitre qui porte sur l'insertion de données nous allons interagir avec deux dossiers qui sont DataWriter et ControllerPublic.
Dans un premier temps nous allons créer un fichier Index.php dans le dossier ControllerPublic, ce fichier hérite de la classe XenForo_ControllerPublic_Abstract qui est une classe étendue sur tous les controllers.

INDEX.PHP (actionIndex())
PHP:
<?php

class Lobbys_ControllerPublic_Index extends XenForo_ControllerPublic_Abstract
{
  /*
   Action index, affichons "Hello World !"" tout bêtement.
  */
  public function actionIndex()
  {
    echo "Hello World !";
  }

}
Rendez-vous sur l'URL suivante :
Vous devez vous inscrire ou vous connecter pour voir les liens ! (c'est gratuit et rapide 🚀)
! :smile:

screen2.png
(nous avons bien notre Hello World ! d'affiché)
Vous pouvez tout de même voir que nous avons une erreur qui indique qu'aucun retour du controller n'est présent, en effet nous retournons un message brut sans grand intérêt si ce n'est que vous impressionner ( :trollface: ), nous avons la possibilité d'afficher une template grâce au code ci-dessous mais uniquement aux utilisateurs connectés. :stupéfait:

INDEX.PHP (actionIndex())
PHP:
    //on instancie l'utilisateur courant.
    $visitor = XenForo_Visitor::getInstance();

    if(!$visitor['user_id'])
    {
      //si l'utilisateur n'est pas connecté on renvoit une erreur de permissions
      return $this->responseNoPermission();
    }

   return $this->responseView('Lobbys_ViewPublic_Index', 'lobbys_index', $params = []);

Dans ce code nous utilisons une méthode nommée responseView qui provient de notre controller XenForo_ControllerPublic_Abstract , d'où l'importance d'hériter de cette classe, ainsi le premier paramètre correspond à une classe qui n'est pas importante pour la création de notre add-On, vous pouvez laisser ce paramètre vide, le deuxième paramètre est
le nom de notre template et le dernier est un tableau de paramètres qui sera disponible dans notre template lobbys_index.

Rendez-vous sur notre ACP , à l'onglet Appearance puis Templates, créez une template avec le nom que nous lui avons donné précédemment et avec un contenu basique pour essayer le fonctionnement de notre méthode responseView.

screen3.png
Revenez sur la page de nos lobbys, notre template est bien affichée.
screen4.png
Modifions notre template afin d'y incorporer quelques éléments comme un formulaire qui va permettre à nos membres de demander un lobby.

LOBBYS_INDEX
HTML:
<xen:title>{xen:phrase lobbys_index_title}</xen:title>
<xen:description>{xen:phrase lobbys_index_description}</xen:description>

<xen:navigation>
    <xen:breadcrumb source="$nodeBreadCrumbs" />
</xen:navigation>

<form action="{xen:link 'lobby/save'}" method="post" class="xenForm AutoValidator" data-redirect="yes">
 
        <dl class="ctrlUnit">
        <dt><label>{xen:phrase lobbys_index_games_label}:</label></dt>
        <dd><select name="game">
              <option value="BO3">{xen:phrase lobbys_index_games_bo3}</option>
              <option value="BO2">{xen:phrase lobbys_index_games_bo2}</option>
                           <option value="MW3">{xen:phrase lobbys_index_games_mw3}</option>
            </select>
            </dd>
 
    </dl>
 
    <dl class="ctrlUnit">
        <dt><label>{xen:phrase lobbys_index_plateforms_label}:</label></dt>
        <dd><input type="radio" name="plateform" value="PS3"> {xen:phrase lobbys_index_plateforms_ps3}</br>
            <input type="radio" name="plateform" value="XBOX360"> {xen:phrase lobbys_index_plateforms_xbox360}
        </dd>
    </dl>

    <dl class="ctrlUnit">
        <dt><label>{xen:phrase lobbys_index_games_id_label}:</label></dt>
        <dd><input type="text" class="textCtrl" name="game_id">
        </dd>
    </dl>
 
    <dl class="ctrlUnit submitUnit">
        <dt></dt>
        <dd><input type="submit" value="{xen:phrase lobbys_index_submit}" class="button primary" /></dd>
    </dl>

    <input type="hidden" name="_xfToken" value="{$visitor.csrf_token_page}" />
</form>
Il vous faudra phraser votre template vous même.

screen5.png
(résultat après avoir modifié la template)
Nous allons maintenant créer un fichier Lobbys.php dans le dossier DataWriter. Ce fichier va nous permettre de déclarer nos champs afin de pouvoir les modifier, supprimer etc. par la suite et ceci plus facilement grâce aux fonctions ci-dessous. :)

LOBBYS.PHP

PHP:
<?php

class Lobbys_DataWriter_Lobbys extends XenForo_DataWriter
{
  protected function _getFields()
  {
    // nom de la table
    return array('lobbys' => array(

      // identifiant du lobby
      'lobby_id'     => array('type' => self::TYPE_UINT, 'autoIncrement' => true),

      // identifiant du membre qui demande un lobby
      'user_id'      => array('type' => self::TYPE_UINT, 'required' => true),

      // on définit des valeurs autorisées, ainsi impossible de glitcher le jeu sélectionné
      'game'         => array('type' => self::TYPE_STRING, 'required' => true, 'allowedValues' => array('BO3', 'MW3', 'BO2')),
      'plateform'    => array('type' => self::TYPE_STRING, 'required' => true, 'allowedValues' => array('PS3', 'XBOX360')),

      // identifiant IG du membre
      'identifiant'  => array('type' => self::TYPE_STRING, 'required' => true),

      // etat du lobby , par défaut il est en cours
      'lobby_state'   => array('type' => self::TYPE_STRING, 'required' => true, 'default' => 'cours', 'allowedValues' => array('cours', 'termine', 'refuse')),

      // on note la date de demande sous forme de timestamp grâce à la classe XenForo_Application
      'lobby_date' => array('type' => self::TYPE_UINT, 'default' => XenForo_Application::$time)

    ));
  }

  protected function _getExistingData($data)
  {
      if (!$id = $this->_getExistingPrimaryKey($data, 'lobby_id'))
      {
          return false;
      }

      return array('lobbys' => XenForo_Model::create('Lobbys_Model_Lobbys')->getLobbyById($id));
  }

  protected function _getUpdateCondition($table)
  {
      return 'lobby_id = ' . $this->_db->quote($this->getExisting('lobby_id'));
  }
}

La prochaine étape consiste à créer un
Installer, celui-ci va nous permettre d'ajouter ou supprimer des tables & colonnes à notre base de données à chaque installation ou désinstallation (et mise à jour) de notre add-on.

Créez un fichier
Installer.php à la racine de votre dossier parent, il existe différente façon de créer un Installer je vous donne la plus simple.


INSTALLER.PHP

PHP:
<?php

class Lobbys_Installer
{
    protected static $table = array(
         'createQuery' => "CREATE TABLE IF NOT EXISTS `lobbys` (
                    `lobby_id` INT( 10 ) NOT NULL AUTO_INCREMENT,
                    `user_id` INT ( 10 ) NOT NULL,
                    `game` VARCHAR ( 255 ) NOT NULL,
                    `plateform` VARCHAR ( 255 ) NOT NULL,
                    `identifiant` VARCHAR ( 255 ) NOT NULL,
                    `lobby_state` ENUM ( `cours`, `termine`, `refuse` ) NOT NULL,
                    `lobby_date` VARCHAR ( 255 ) NOT NULL UNSIGNED,
                    PRIMARY KEY (`lobby_id`)
        ) ENGINE = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci"',
        'dropQuery' => 'DROP TABLE IF EXISTS `lobbys`'
    );

    /*
      Lors de l'installation c'est cette fonction qui est appelée
    */
    public static function install()
    {
        $db = XenForo_Application::get('db');
        $db->query(self::$table['createQuery']);
    }


    /*
      Lors de la désinstallation c'est cette fonction qui est appelée
    */
    public static function uninstall()
    {
        $db = XenForo_Application::get('db');
        $db->query(self::$table['dropQuery']);
    }
}
Comme je l'ai indiqué, lors de l'installation une fonction est exécutée qui elle même exécute une requête SQL le processus est le même pour la désinstallation.

Je vous invite à modifier votre add-on depuis votre ACP pour renseigner les classes et fonctions d'
installation / désinstallation.

Capture d’e*cran 2016-10-31 a* 17.41.17.png
Exportez l'add-on et mettez le à jour pour procéder à l'installation de notre table, si l'installation se passe correctement vous devriez voir apparaître la page du processus d'installation XF.

Créez un fichier
Lobbys.php dans le dossier Model, ce fichier contiendra pour le moment une fonction qui nous permettra de récupérer un lobby via son identifiant unique .

LOBBYS.PHP

PHP:
<?php

class Lobbys_Model_Lobbys extends XenForo_Model
{
  public function getLobbyById($lobbyId)
  {
    return $this->_getDb()->fetchRow('SELECT * FROM lobbys WHERE lobby_id = ?', $lobbyId);
  }
}
header-insertion.png
Passons à l'insertion de données, pour se faire nous allons utiliser notre DataWriter dans notre ControllerPublic, pour sauvegarder nos données nous allons tout simplement créer une méthode, une action Save qui se chargera de les sauvegarder uniquement lorsque nous l'utilisons avec le type de requête HTTP : POST. :cool:
INDEX.PHP (actionSave())
PHP:
public function actionSave()
  {
    //on instancie l'utilisateur courant.
    $visitor = XenForo_Visitor::getInstance();

    if(!$visitor['user_id'])
    {
      //si l'utilisateur n'est pas connecté on renvoit une erreur de permissions
      return $this->responseNoPermission();
    }

    //on vérifie si la requête est en POST uniquement, dans le cas contraire une erreur automatique sera retournée.
    $this->_assertPostOnly();

    //on récupère nos valeurs de champs
    $game         = $this->_input->filterSingle('game', XenForo_Input::STRING);
    $plateform    = $this->_input->filterSingle('plateform', XenForo_Input::STRING);
    $identifiant  = $this->_input->filterSingle('game_id', XenForo_Input::STRING);

    //on crée une instance de notre DW.
    $dw = XenForo_DataWriter::create('Lobbys_DataWriter_Lobbys');

    //on définit nos champs / valeurs de cette manière.
    $dw->set('user_id', $visitor['user_id']); // on récupère l'identifiant du membre courant.
    $dw->set('game', $game);
    $dw->set('plateform', $plateform);
    $dw->set('identifiant', $identifiant);

    /*
      Une fois que l'on a définit ce dont on a besoin, on sauvegarde nos données.
      Nous n'avons pas besoin de sauvegarder l'état de notre lobby car il y a déjà une valeur par défaut, pareil pour la date.
    */
    $dw->save();

    //on effectue une redirection avec un message de succès.
    return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS,
         XenForo_Link::buildPublicLink('/'),
         new XenForo_Phrase('lobbys_index_success'));
  }
Tentez de remplir le formulaire, sauvegardez le et vous obtiendrez
un message de succès ainsi qu'une redirection vers l'accueil. :)

header-affichage.png
Nous avons déjà parcouru du chemin , passons à l'affichage des demandes de lobby nous allons utiliser notre
ControllerPublic et notre Model pour se faire.
Créez une fonction getAllLobbys qui va nous permettre comme son nom l'indique de récupérer tous les lobbys, cette requête va être particulière puisque nous devons également récupérer les données de chaque demandeur de lobby.

LOBBYS.PHP
PHP:
  /*
  * Il existe des manières bien plus propre de réaliser ceci mais je pars de 0 afin de vous expliquer les bases, inutile pour le moment de vous rendre la tâche trop compliquée.
  */
  public function getAllLobbys()
  {
    return $this->_getDb()->fetchAll('SELECT * FROM lobbys INNER JOIN xf_user ON lobbys.user_id = xf_user.user_id');
  }
Passons au
ControllerPublic nous allons créer une action all qui va nous permettre de lister toutes les demandes de lobby automatiquement, en soit celle-ci ne fait que d'afficher une template avec un tableau de paramètre qui contient nos demandes.

INDEX.PHP (actionAll)
PHP:
  public function actionAll()
  {
    //models, nous instancions notre model afin d'utiliser notre fonction getAllLobbys.
    $lobbysModel = XenForo_Model::create('Lobbys_Model_Lobbys');

    //les demandes
    $lobbys = $lobbysModel->getAllLobbys();

    return $this->responseView('Lobbys_ViewPublic_All', 'lobbys_all', $params = ['lobbys' => $lobbys]);
  }
Enfin, crééons une template lobbys_all qui contiendra un tableau parcouru par chaque demande.

LOBBYS_ALL
HTML:
<xen:title>{xen:phrase lobbys_all_title}</xen:title>
<xen:description>{xen:phrase lobbys_all_description}</xen:description>

<xen:navigation>
    <xen:breadcrumb source="$nodeBreadCrumbs" />
</xen:navigation>

<xen:if is="{$lobbys}">
        <table class="dataTable">
        <tr class="dataRow subtle">
            <th width="20%">{xen:phrase user}</th>
            <th width="38%">{xen:phrase lobbys_all_game}</th>
            <th width="32%">{xen:phrase lobbys_all_plateform}</th>
            <th width="10%">{xen:phrase lobbys_all_state}</th>
            <th width="10%">{xen:phrase lobbys_all_date}</th>
        </tr>
        <xen:foreach loop="$lobbys" value="$lobby">
            <tr class="dataRow">
                <td><xen:username user="{$lobby}" rich="true" /></td>
                <td>{$lobby.game}</td>
                <td>{$lobby.plateform}</td>
                <td><a href="{xen:link 'lobby/update', $lobby}"><xen:if is="{$lobby.lobby_state} == 'cours'">{xen:phrase lobbys_all_state_cours}<xen:elseif is="{$lobby.lobby_state} == 'refuse'" />{xen:phrase lobbys_all_state_refuse}<xen:elseif is="{$lobby.lobby_state} == 'termine'" />{xen:phrase lobbys_all_state_termine}</xen:if></a></td>
                <td><xen:datetime time="{$lobby.lobby_date}"/></td>
            </tr>
        </xen:foreach>
        </table>

<xen:else />

</xen:if>
Rendez-vous sur l'URL suivante :
Vous devez vous inscrire ou vous connecter pour voir les liens ! (c'est gratuit et rapide 🚀)
! :smile:

screen6.png
header-modification.png
Pour cet avant dernier chapitre nous allons créer une fonctionnalité qui va permettre de modifier l'état de la demande du lobby, pour se faire nous allons globalement créer une action dans notre
Controller.

Créez une template avec le titre lobbys_update.

LOBBYS_UPDATE

HTML:
<xen:h1>{xen:phrase lobbys_update}</xen:h1>


<xen:navigation>
    <xen:breadcrumb source="$nodeBreadCrumbs" />
</xen:navigation>

<form action="{xen:link 'lobby/update', $lobby}" method="post" class="xenForm AutoValidator" data-redirect="yes">
 
    <dl class="ctrlUnit">
        <dt><label>{xen:phrase lobbys_all_state}:</label></dt>
         <dd><select name="lobby_state">
              <option {xen:if '{$lobby.lobby_state} == "cours"', 'selected'} value="cours">{xen:phrase lobbys_all_state_cours}</option>
              <option {xen:if '{$lobby.lobby_state} == "termine"', 'selected'} value="termine">{xen:phrase lobbys_all_state_termine}</option>
                           <option {xen:if '{$lobby.lobby_state} == "refuse"', 'selected'} value="refuse">{xen:phrase lobbys_all_state_refuse}</option>
            </select>
         </dd>
    </dl>

    <dl class="ctrlUnit submitUnit">
        <dt></dt>
        <dd>
            <input type="submit" value="{xen:phrase save_changes}" accesskey="s" class="button primary" />
        </dd>
    </dl>

    <input type="hidden" name="_xfToken" value="{$visitor.csrf_token_page}" />
</form>

Puis
créons une action update dans notre Controller, si la requête est de type GET nous affichons simplement notre template pour choisir l'état de notre demande si c'est de type POST nous traitons la requête en utilisant notre DataWriter.

INDEX.PHP (actionUpdate())
PHP:
public function actionUpdate()

  {
    //input
    $lobbyId         = $this->_input->filterSingle('lobby_id', XenForo_Input::UINT);

    $lobbysModel     = XenForo_Model::create('Lobbys_Model_Lobbys');

    $lobby           = $lobbysModel->getLobbyById($lobbyId);

    //on vérifie si la demande existe
    if(!$lobby)
    {
      return $this->responseError(new XenForo_Phrase('requested_lobby_not_found'));
    }

    //si la requête est de type POST, donc soumission du formulaire
    if($this->_request->isPost())
    {
      $lobbyState = $this->_input->filterSingle('lobby_state', XenForo_Input::STRING);

      $dw = XenForo_DataWriter::create('Lobbys_DataWriter_Lobbys');
      $dw->setExistingData($lobbyId);
      $dw->set('lobby_state', $lobbyState);
      $dw->save();

      //on effectue une redirection avec un message de succès.
      return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS,
           XenForo_Link::buildPublicLink('lobby/all'),
           new XenForo_Phrase('lobbys_update_success'));
    }

    return $this->responseView('Lobbys_ViewPublic_Update', 'lobbys_update', $params = ['lobby' => $lobby]);
  }
Revenez sur notre liste de demandes, puis
cliquez sur son état pour être redirigé vers la page d'édition de celui-ci, soumettez et observez ! :)

screen7.png
header-suppression.png
Pour notre dernier chapitre nous allons tout simplement créer la fonctionnalité qui nous permettra de
supprimer notre demande en cochant une case sur la page d'édition de l'état de celui-ci. :neo:
Modifions notre action update qui prendra en compte notre case à cocher pour supprimer notre demande, ainsi à la soumission si nous détectons que cette case a été cochée nous supprimons la demande.

INDEX.PHP (actionUpdate())
PHP:
  public function actionUpdate()
  {
    //input
    $lobbyId         = $this->_input->filterSingle('lobby_id', XenForo_Input::UINT);
    $delete          = $this->_input->filterSingle('delete', XenForo_Input::UINT);

    $lobbysModel     = XenForo_Model::create('Lobbys_Model_Lobbys');

    $lobby           = $lobbysModel->getLobbyById($lobbyId);

    //on vérifie si la demande existe
    if(!$lobby)
    {
      return $this->responseError(new XenForo_Phrase('requested_lobby_not_found'));
    }

    //si la requête est de type POST, donc soumission du formulaire
    if($this->_request->isPost())
    {
      $lobbyState = $this->_input->filterSingle('lobby_state', XenForo_Input::STRING);

      $dw = XenForo_DataWriter::create('Lobbys_DataWriter_Lobbys');
      $dw->setExistingData($lobbyId);
      if($delete)
      {
        $dw->delete();
      }
      else {
        $dw->set('lobby_state', $lobbyState);
      }

      $dw->save();

      //on effectue une redirection avec un message de succès.
      return $this->responseRedirect(XenForo_ControllerResponse_Redirect::SUCCESS,
           XenForo_Link::buildPublicLink('lobby/all'),
           new XenForo_Phrase('lobbys_update_success'));
    }

    return $this->responseView('Lobbys_ViewPublic_Update', 'lobbys_update', $params = ['lobby' => $lobby]);
  }
screen8.png
header-fin.png
 

Snake's 🐍

Administrateur
Administrateur
Inscription
5 Juin 2012
Messages
8 453
Réactions
6 421
Points
14 905
    Réponse de Snake's 🐍 Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #2
Très complet, félicitations ! :smile:
 
D

deleted535977

Invité
    Réponse de deleted535977 Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #3
J'adore merci :)
 

WhiiTe'

Ancien staff
Ancien staff
Inscription
22 Octobre 2011
Messages
14 090
Réactions
7 706
Points
16 005
    Réponse de WhiiTe' Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #4
OMG J'ai tout compris ! :$ Merci pour ce tuto Riri !

Je suis obligé de faire le chieur :trollface:
Pour les inputs on peut faire comme ça aussi :d:
PHP:
$input = $this->_input->filter(array(
    'feedback_edit'     => XenForo_Input::STRING,
    'delete_feedback'   => XenForo_Input::STRING, 
    'feedback_id'       => XenForo_Input::UINT
));
 

Rivals

Ancien staff
Ancien staff
Inscription
27 Août 2016
Messages
617
Réactions
511
Points
2 446
    Réponse de Rivals Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #5
OMG J'ai tout compris ! :$ Merci pour ce tuto Riri !

Je suis obligé de faire le chieur :trollface:
Pour les inputs on peut faire comme ça aussi :d:
PHP:
$input = $this->_input->filter(array(
    'feedback_edit'      => XenForo_Input::STRING,
    'delete_feedback'  => XenForo_Input::STRING,
    'feedback_id'          => XenForo_Input::UINT
));
C'est pas à moi que tu vas apprendre ça :trollface:
 

Walky 🇫🇷

Développeur
Développeur
Inscription
18 Octobre 2012
Messages
1 254
Réactions
1 149
Points
10 840
    Réponse de Walky 🇫🇷 Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #7
Un tuto presque parfait :trollface:

À quoi sert cette ligne HTML :
HTML:
<input type="hidden" name="_xfConfirm" value="1" />
Si dans le PHP tu n'utilises pas cette condition :
PHP:
if ($this->isConfirmedPost())
Oui je fais chier :trollface:

Pense à mettre les balises PHP sur tes codes PHP aussi :p

Good job :membre:
 

Rivals

Ancien staff
Ancien staff
Inscription
27 Août 2016
Messages
617
Réactions
511
Points
2 446
    Réponse de Rivals Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #8
Un tuto presque parfait :trollface:

À quoi sert cette ligne HTML :
HTML:
<input type="hidden" name="_xfConfirm" value="1" />
Si dans le PHP tu n'utilises pas cette condition :
PHP:
if ($this->isConfirmedPost())
Oui je fais chier :trollface:

Pense à mettre les balises PHP sur tes codes PHP aussi :p

Good job :membre:
Je savais qu'on allait me poser cette question, d'ailleurs au départ la première template n'en contenait pas puis je l'ai rajouté :trollface:

Oui j'ai essayé de les mettre un peu partout, je vais éditer, tx :)
 

Paradise'

Donateur
Premium
Inscription
30 Juin 2013
Messages
4 099
Réactions
4 058
Points
9 135
    Réponse de Paradise' Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #9
Cette rédaction de BG omg :o
 

Ste | Graphic & Mod

PC LOBBYMAN GTA V MP
Premium
Inscription
23 Février 2016
Messages
1 101
Réactions
390
Points
2 250
    Réponse de Ste | Graphic & Mod Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #11
:neo:
 

Louki

Ancien staff
Ancien staff
Inscription
8 Juin 2013
Messages
5 296
Réactions
5 155
Points
11 657
    Réponse de Louki Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #12
Good topic! :bave:
 

xM3'

Bienvenue sur RealityGaming.
Premium
Inscription
27 Février 2013
Messages
2 181
Réactions
603
Points
6 183
    Réponse de xM3' Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #13
:o
Merci.
Tuto Propre nette et précis.
Professionnelle.
Good Job.
 

Rivals

Ancien staff
Ancien staff
Inscription
27 Août 2016
Messages
617
Réactions
511
Points
2 446
    Réponse de Rivals Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #14

xM3'

Bienvenue sur RealityGaming.
Premium
Inscription
27 Février 2013
Messages
2 181
Réactions
603
Points
6 183
    Réponse de xM3' Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #15

Insomniaque97

Donateur
Premium
Inscription
21 Juillet 2015
Messages
1 090
Réactions
503
Points
3 775
    Réponse de Insomniaque97 Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #16
Complet et utile. GG ! ;) :ok:
 
M

membre150711

Invité
    Réponse de membre150711 Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #17
Il y a excatement "23352" caractères sur ton sujet, très beau roman :)
 

UAE

Membre
Inscription
17 Juin 2016
Messages
183
Réactions
88
Points
1 826
    Réponse de UAE Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #18
Sympa le tutoriel GG.

Il y a une erreur sur la partie INSTALLER.PHP ne fonctionne pas pense la corriger sur tutoriel.
Tu as oublier ; a la fin de createQuery

Sur la partie suppression, tu n'as pas mis la modifications du Template lobbys_update avec la checkbox.

Code:
<dl class="ctrlUnit">
       <dt>{xen:phrase lobbys_delete_order}:</dt>
        <dd>
        <input type="checkbox" name="delete" value="1">
        </dd>
    </dl>

PS :
Que le membre soit connecter ou pas il aura accès à la page lobby/all et peut éditer le statut des commandes.

Question :

Comment modifier correctement public function actionSave() pour ajouter une conditions que si le lobby_state est cours ne peut pas poster une autre demande ? le temps que son ancien demande soit : termine
 

Rivals

Ancien staff
Ancien staff
Inscription
27 Août 2016
Messages
617
Réactions
511
Points
2 446
    Réponse de Rivals Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #19
PS : Que le membre soit connecter ou pas il aura accès à la page lobby/all et peut éditer le statut des commandes.
Je le sais.

PS : Que le membre soit connecter ou pas il aura accèsQuestion :

Comment modifier correctement public function actionSave() pour ajouter une conditions que si le lobby_state est cours ne peut pas poster une autre demande ? le temps que son ancien demande soit : termine
Tu dois étendre la fonction _preSave() du DW en question et effectuer une condition. ;)

Merci pour les remarques.
 

UAE

Membre
Inscription
17 Juin 2016
Messages
183
Réactions
88
Points
1 826
    Réponse de UAE Forums généraux Informatique ⌨️ Programmation Programmation web : Apprenez à créer un add-On CRUD sous le CMS XenForo
  • #20
Comme sa c'est propre ? ainsi juste les admin peuvent consulter ?

Code:
public function actionAll()
  {
    $lobbysModel = XenForo_Model::create('Lobbys_Model_Lobbys');
    $lobbys = $lobbysModel->getAllLobbys();
    $visitor = XenForo_Visitor::getInstance();
    if(!$visitor['is_admin'])
    {
      return $this->responseNoPermission();
    }
    return $this->responseView('Lobbys_ViewPublic_All', 'lobbys_all', $params = ['lobbys' => $lobbys]);
  }
 


Votre adresse email ne sera pas visible publiquement. Nous ne l'utiliserons que pour confirmer votre message.
Haut