[Doc] Intro à la création de MOD

Découvrez ici une liste de documents concernant phpBB: son installation, sa mise à jour et enfin son utilisation.
En bref, apprenez ici à vous servir de phpBB2!

Modérateur: Equipe

Règles du forum
A lire impérativement sur notre page : Règlement

[Doc] Intro à la création de MOD

Messagepar and1hotsauce » 14 Avr 2006 à 16:26

» Sommaire

I) Intro

II) Les requêtes
    II.1 Que fait donc ce fameux fichier ?
    II.2 Quel est l'avantage ?
    II.3 Comment utiliser tout ce brol ?
      II.3.1 Creation de l'objet
      II.3.2 Test de connexion
      II.3.3 Fermer la connexion
      II.3.4 Exécuter une requête
      II.3.5 Récupération du résultat de la requête
      II.3.6 Récupération du nombre de résultats d'une requête
      II.3.7 Libérer la mémoire inutile
      II.3.8 Récupérer le nombre de champs de la requête
      II.3.9 Récupérer le nombre de colonnes affectée par une requête
      II.3.10 Récupérer l' id du dernier enregistrement
      II.3.11 D'autres méthodes
      II.3.12 Correspondance fonction mysql et méthodes class sql_db
    III) Les templates
    III.1 A quoi sert un template ?
    III.2 Comment cela fonctionne-il ?
    III.3 Comment utilser ce sytème de template ?
      III.3.1 Création de l' objet
      III.3.2 suppimer l' objet
      III.3.3 Assigner un fichier .tpl
      III.3.4 Les variables templates
      III.3.5 Les blocks simples
      III.3.6 Les blocks imbriqués
      III.3.7 Inclusion d' un template dans un autre template
      III.3.8 Switch/Conditions
      III.3.9 Parser le code et afficher la page
    IV) Exemple : : Création d'une page affichant les rangs

    IV.1 Code nécessaire à la création d'une nouvelle page
    IV.2 Remarques
    IV.3 Création de la page ranks.php
    IV.4 Mise à jour du fichier de langue
    IV.5 Création de la page ranks_body.tpl


    » Mises A Jour
Modifié en dernier par and1hotsauce le 14 Mai 2006 à 00:44, modifié 4 fois.
Avatar de l’utilisateur
and1hotsauce
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3517
Enregistré le: 19 Oct 2003 à 14:58
Localisation: belgique, mons

Messagepar and1hotsauce » 16 Avr 2006 à 17:19

I) Intro

Ce tutorial explique les notions indispensables à la création de MOD's.

  • Les requêtes & tout ce qui touche la base de donnée.
  • Les templates


Pour comprendre ce tutorial vous devez connaitre un minimum le php.
Donc si vous n' avez pas encore appris le php, commencez d' abord par cela ;-)
Avatar de l’utilisateur
and1hotsauce
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3517
Enregistré le: 19 Oct 2003 à 14:58
Localisation: belgique, mons

Messagepar and1hotsauce » 16 Avr 2006 à 17:19

II) Les requêtes

Si vous avez déjà chipoté un petit peu au code de phpBB vous avez sûrement remarqué que la manière de gérer les requêtes n'est pas comme expliqué sur la plupart des sites de programmation php (c'est a dire avec les fonctions habituelles de PHP : mysql_query, mysql_select_db, mysql_connect, ....)

En effet PHP a codé son propre système de requête.
Le but de ce chapitre n'est pas d'explorer la manière dont cela a été codé mais comment s'en servir pour vos MOD's.
Donc si vous voulez voir comment phpBB à procédé rendez-vous dans le fichier :
\db\db2.php

    II.1 Que fait donc ce fameux fichier ?

    Ce fichier utilise les classes et la programmation orientée objet (POO)
    La POO n'étant pas quelque chose qui s'apprend en 3 phrases je vous invite à vous informer d'abord sur ce que c'est réellement (si vous avez de bons liens à me proposer, envoyez-les moi par MP) :

    Image http://www.phpdebutant.org/article42.php

    Ce fichier permet donc de créer et d'utiliser un objet qui permet de faire une connexion à MySQL & à une base de données, d'exécuter des requêtes, de récupérer le résultat de ces requêtes, de compter le nombre de résultats, etc...


    II.2 Quel est l'avantage ?
    Cet objet va gérer tout seul le type de base.
    Cela permet de gérer l'installation de phpBB sur plusieurs types de base de données (l'utilisation des fonctions telles que mysql_connect ne peuvent servir qu'à des bases de données de type mMySQL, et pareillement pour les fonctions commencants par ODBC, OCI, etc).

    Cela permet donc de faire des actions sur divers types de base de données en utilisant les même fonctions (méthodes en POO).
    Plus besoin dans le code de se soucier du type de base :)

    II.3 Comment utiliser tout ce brol

      II.3.1 Création de l'objet
      Code: Tout sélectionner
      // Connexion avec la base de donnée
      $db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false);

      Normalement vous n'avez pas à le créer de vous même ! Il est créé dès le départ par le fichier "includes/common.php" qui le fait en incluant "includes/db.php"
      La création de l'objet provoque la connexion au serveur MySQL et à la base de données concernée.
      Lors de la création de l'objet certains champs d'instances (variables) sont accessibles notamment db_connect_id qui est un boolean qui contient true si la connexion s'est affectuée, false sinon une erreur a été rencontrée.

      II.3.2 Test de connexion
      Même remarque, ceci est dans le fichier db.php et vous ne devez donc pas le faire vous même (dans la plupart des cas).

      Pour tester la connexion il suffit d' évaluer db_connect_id :

      Code: Tout sélectionner
      //Teste si la connexion s' est correctement passée, sinon arrête le script et affiche qu' il n' a pu se conneceter a la bd
      if(!$db->db_connect_id)
      {
      	message_die(CRITICAL_ERROR, "Impossible de se connecter à la base de données<br />Could not connect to the database");
      }


      => Ces deux actions sont simplement la fin du fichier "includes/db.php"

      II.3.3 Fermer la connexion
      Code: Tout sélectionner
      // Ferme la connexion
      $db-> sql_close();


      II.3.4 Exécuter une requête
      Voici la méthode qui permet d' effectuer des requêtes SQL.
      l' objet $db contient une méthode : sql_query( $sql ) qui permet dd'exécuter la requête passée en paramètre.
      Code: Tout sélectionner
      $sql = "requete SQL";
      
      //Exécute la requête sql et retourne arrête le script la requête s' est mal passée
      if( !($result = $db->sql_query($sql)) )
      {
      	message_die(GENERAL_ERROR, 'message d\' erreur', '', __LINE__, __FILE__, $sql);
      }
      


      Si la requête n'a pas été effectuée correctement, alors arrêt du script avec le message d'erreur, la ligne, le fichier et la requête SQL.

      Pour la requête SQL :
        Image Ne mettez pas les noms des tables directement mais utilisez les Constantes définies par phpBB dans "includes/constants.php" simplement pour le fait qu'on a pu, non seulement changer le préfixe phpbb_(assez courant) mais aussi le nom des tables (pour ceux qui chipotent de trop :-p).

        Exemple :
        Code: Tout sélectionner
        $sql = "SELECT *
        	FROM " . CONFIG_TABLE;


        Image Essayer d'utiliser les requêtes qui va avec tout type de base de données. (par exemple mysql possède certaines fonctions qui n' existent pas sous Oracle).

      II.3.5 Récupération du résultat de la requête
      Pour récupérer le résultat, la manière de faire est comme avec la fonction
      mysql_fetch_array() de php :

      Code: Tout sélectionner
      //Récupération du résultat de la requête dans le tableau $row et parcourt de ce tableau
      while ( $row = $db->sql_fetchrow($result) )
      {
      	//traitement des éléments de $row
      }


      II.3.6 Récupération du nombre de résultats d'une requête
      Ca se passe également d'une manière proche des fonctions de PHP (e.g mysql_num_rows()) :
      Code: Tout sélectionner
      // Nombre d' élements du résultat de la rquête.
      $numrows = $db->sql_numrows($result);


      II.3.7 Libérer la mémoire inutile
      Code: Tout sélectionner
      //Libération de la mémoire inutile
      $db->sql_freeresult($result);


      II.3.8 Récupérer le nombre de champs de la requête
      Code: Tout sélectionner
      //Nombre de champs de la requete
      $numfields = $db->sql_numfields($result);

      Cette méthode donne le nombre de champs de la requête.
      Si la requête a échoué alors elle retourne false

      II.3.9 Récupérer le nombre de colonnes affectées par une requête
      Code: Tout sélectionner
      // Nombre de colonnes affectée par $result
      $num = $db-> sql_affectedrows($result);

      Cette méthode donne le nombre de colonnes affectées par une requête.
      Si la requête a échoué alors elle retourne false

      II.3.10 Récupérer l' id du dernier enregistrement
      Code: Tout sélectionner
      // Id du dernier enregistrement.
      $id = $db->sql_nextid(result);


      II.3.11 D'autres méthodes
      D'autres méthodes existent mais sont moins utilisées que celles ci-dessus.
      Pour prendre connaissance de celles-ci rendez vous dans le fichier "\db\db2.php"
      J'essayerai de mettre une description de ces autres méthodes ;-)

      II.3.12 Correspondance fonction mysql et méthodes class sql_db
      Code: Tout sélectionner
      mysql_num_rows($query_id = 0) =  $db->sql_numrows($query_id) 
      
      mysql_affected_rows()  =  $db->sql_affectedrows() 
      
      mysql_num_fields($query_id = 0)  =  $db->sql_numfields($query_id) 
      
      mysql_field_name($query_id, $offset)  =  $db->sql_fieldname($offset, $query_id = 0) 
      
      mysql_field_type($query_id, $offset)  =  $db->sql_fieldtype($offset, $query_id = 0) 
      
      mysql_fetch_array($query_id, MYSQL_ASSOC)  =  $db->sql_fetchrow($query_id = 0) 
      
      mysql_data_seek($query_id, $rownum)  =  $db->sql_rowseek($rownum, $query_id = 0) 
      
      mysql_insert_id($this->db_connect_id)  =  $db->sql_nextid() 
      
      mysql_free_result($query_id)  =  $db->sql_freeresult($query_id = 0)

Modifié en dernier par and1hotsauce le 06 Juin 2006 à 01:59, modifié 3 fois.
Avatar de l’utilisateur
and1hotsauce
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3517
Enregistré le: 19 Oct 2003 à 14:58
Localisation: belgique, mons

Messagepar and1hotsauce » 16 Avr 2006 à 17:19

III) Les templates

    III.1 A quoi sert un template ?
    Le système de template permet à la fois deux choses :
      Image Séparer le code PHP et le code HTML.
      Image D'avoir plusieurs designs possibles pour un même site/forum.

    PhpBB à fait son propre système de template, encore une fois on ne va pas voir comment a été conçu ce système mais plutot comment l'utiliser.
    Si vous êtes intérressé par sa structure et son codage : "includes/template.php".
    Le systeme de phpBB est une classe, donc pour pouvoir utiliser ce système tout comme pour les requêtes il faudra créér un objet, faire appel à des méthodes et champs d'instances.

    III.2 Comment cela fonctionne-t-il ?
    L' idée est d' avoir le code php dans un ou plusieurs fichiers et le code html dans les autres fichiers.
    Le code php fera appel alors à la page .tpl (contenant du code html) et la charger. Dans le jargon du programmeur on appelle cette ation : parser

    III.3 Comment utiliser ce système ?
      III.3.1 Création de l' objet
      Pour créer le template, il faut créer un objet "Template" défini par phpBB.
      Code: Tout sélectionner
      //Création du template
      $template = new Template($root);

      $root contient ici le chemin vers le dossiers contenant les fichiers .tpl

      Tout comme la création de l' objet pour la base de données, la création de l' objet template est faite avec l' appel de la fonction init_userprefs().
      => Normalement vous n' aurez pas à créer l' objet puisqu' il est créé dès le départ.

      III.3.2 suppimer l' objet
      Code: Tout sélectionner
      //Suppresion du template
      $template->destroy()


      Cette méthode est utile quand on en a fini avec ce template et que l' on désire en charger un nouveau.
      Avec phpBB on utilise le même template, donc normalement cette méthode ne devrait pas vous servir beaucoup dans le cadre de phpBB ;-)

      III.3.3 Assigner un fichier .tpl
      Lors du script php, il faut désigner les différents fichier .tpl qui seront chargés plus tard. On va donc assigner à un alias un fichier .tpl
      Code: Tout sélectionner
      // Affectation de fichier.tpl à l' alias de nom "alias"
      $template->set_filename(array('alias' => 'fichier.tpl'));


      III.3.4 Les variables templates
      Pour afficher des données dynamiques (par exemple, des données récupérées d' une base de données) on a besoin des variables templates.Celles-ci sont présentes dans le fichier .tpl et sont entourées pas des accolades.

      Exemple :
      Code: Tout sélectionner
      {VARIABLE}


      Lors du chargement du code html du fichier .tpl les variables templates seront remplacées par des valeurs définies dans le code php.

        Image Pour assigner une valeur à une variable template :
        Code: Tout sélectionner
        //Assignation de 'valeur' à la variable template
        $template->assign_var('VARIABLE', 'valeur');


        Dans ce cas la valeur pourra être affichée dans le fichier template avec :
        Code: Tout sélectionner
        {VARIABLE}


        Image Pour assigner un ensemble de valeurs à des variables
        Code: Tout sélectionner
        //Assignation de 'valeur1' et des 'valeur2' aux variables templates
        $template->assign_vars(array(
        	'VARIABLE1' => 'valeur1',
        	'VARIABLE2' => 'valeur2'
        ));


        Dans ce cas les deux valeurs seront accessibles dans le .tpl avec le code :
        Code: Tout sélectionner
        {VARIABLE1}
        et
        Code: Tout sélectionner
        {VARIABLE2}


      Remarques :
        ImageVous n' êtes pas obligé d' utiliser assign_vars() pour plusieurs variables, vous pouvez également appeller autant de fois assign_var() qu' il y a de variables mais c' est moins propre.

        Image Lors de l' assignation de la valeur à la variable dans le code php, il n' y a pas les accolades. Mais elles sont indispensables dans le code html du fichier .tpl

        Image Les majuscules ne sont pas obligatoires, mais dans la plupart des cas (même toujours dans phpBB) vous les trouverez en majuscule.
        Dans le cas ou vous utilisez des minscules il faut les utiliser dans le .php et dans le .tpl ;-)

      III.3.5 Les blocks simples
      Les blocks servent correspondent aux boucles en php.
      Par exemple, si vous désirez afficher les rangs sans utiliser les templates, vous allez faire une requeête sql et vous allez parcourir avec une boucle les éléments du résultat (qui est un tableau) et a chaque tour de boucle vous allez afficher le code html qui affichera le rang.

      Ainsi vous aurez (en utilisant la partie II de ce tuto):
      Code: Tout sélectionner
      while($row->sql_fetchrow($result))
      {
      	echo '<tr>';
      	echo '<td>' . $row['rank_title'] . '</td>';
      	echo '</tr>';
      }


      Seulement avec le systeme de template le code html est totalement séparé du code php, il va donc valoir définir une zone du code html qui sera répétée à chaque tour de boucle. Dans l' exemple ci-dessus on aura :

      Code: Tout sélectionner
      <tr>
      	<td>{RANK_NAME}</td>
      </tr>


      C' est donc le code a répéter et ca constiuera le corps du "block".
      Pour signaler a php que ca sera un bloc il faut lui rajouter les délimiteurs de block :

      Code: Tout sélectionner
      <!-- BEGIN nomDuBlock -->
      <tr>
      	<td>{nomDublock.RANK_NAME}</td>
      </tr>
      <!-- END nomDublock -->


      Il ne reste plus qu' a dire a php de prendre ce block et de le répéter en mettant à chaque fois à jour la variable template.

      Code: Tout sélectionner
      while($row->sql_fetchrow($result))
      {
      	$template->assign_block_vars('nomDuBloc', array(
      		'RANK_NAME' => 'valeur'
      	));
      }


      Remarques :
        ImageLa structure des délimiteurs de blocs doit être comme ci-dessus. Il ne peut pas y avoir par exemple :
        Code: Tout sélectionner
        <!--- BEGIN NomDuBloc -->

        Image Le nom du bloc du code php doit être le même que le nom du bloc du code du fichier .tpl. De plus le nom du bloc dans le delimiteur BEGIN doit être le même que celui du bloc END
        Image Dans un bloc un variable template doit être appelée de cette facon :
        Code: Tout sélectionner
        {nomDuBloc.NOMVARIABLE}

        Image Dans le code ci dessus j' ai utilisé un while, j' aurais pu utiliser un for ou un foreach ;-)

      III.3.6 Les blocks imbriqués
      Parfois dans un script php on utilise des boucles imbriquées. leurs correspondant avec le système de template sont les blocks imbriqués

      Considérons le tableau suivant (cette phrase fait vraiment démo de math :lol: ) :

      Code: Tout sélectionner
      $tab = array();
      $num = 10;
      for($i=0; $i < $num; $i++)
      {
      	$tab[$i] = array();
      	for($j=0; $j < $num; $j++)
      		$tab[$i][$j] = 1;
      }


      Ce tableau est un tableau 2 dimensions composé de 10 lignes et 10 colonnes soit 100 cellules.
      Si on veut afficher ce tableau sans template et sans l' utilisation de print_r() on ferait :

      Code: Tout sélectionner
      echo '<table>';
      for($i=0; $i < 10; $i++)
      {
      	echo '<tr>';
      	for($j=0; $j < 10; $j++)
      		echo '<td>' . $tab[$i][j] . '</td>';
      	echo '</tr>';
      }
      echo '</table>';


      Avec le système de blocs imbriqué pour template on aurait :
      --> dans le code php :
      Code: Tout sélectionner
      for($i=0; $j < 10; $j++)
      {
      	$template->assign_bloc_vars('NomDublock', array());
      	for($j=0; $j < 10; $j++)
      	{
      		$template->assigb_block_vars('NomDuBloc.NomDuSousBlock', array(
      			'VALUE' => $tab[$i][$j]));
      	}
      }


      --> dans le code html :
      Code: Tout sélectionner
      <table>
      	<!-- BEGIN nomDuBlock -->
      	<tr>
      		<!-- BEGIN nomDuSousBlock -->
      		<td>{NomDuBlock.NomDuSousBlock.VALUE}</td>
      		<!-- END nomDuSousBlock -->
      	</tr>
      	<!-- END nomDuBlock -->
      </table>


      Et voila, Notre tableau est affiché ;-)
      (Cqfd :lol: )

      Remarque :
        Image Lors de l' appelle de la variable, ne pas oublier de mettre les blocks parents :
        Code: Tout sélectionner
        {nomDuBloc.nomDuSousBloc.NOMVARIABLE}


      Ici ce n' est que deux boucles imbriquées, mais c' est possible avec plus de boucles imbriquées.

      III.3.7 Inclusion d' un template dans un autre template
      Il arrive qu' on ait besoin d' inclure un template dans un autre template.
      En effet, imaginons qu' on désire mettre un même menu vertical dans plusieurs pages de phpBB (dans le corps de la page et non dans le header ;-)). Une solution est de recopier le code du menu dans chacune des pages où l' ont veut le menu. Ca fonctionne ... mais ce n' est pas très pratique... en effet, le jour ou on veut ajouter un lien il faudra modifier chacun des fichiers :? .

      Il y a donc une solution meilleure qui permet d' inclure fichier .tpl (dans l' exemple menu_body.tpl) dans un autre fichier .tpl (les corps des âges de phpBB pr notre exemple). Ca s' utilise en gros comme un include().

      Sans utiliser de template on aurait placé ce code à l' endroit ou on voulait le menu.
      Code: Tout sélectionner
      include('menu.php');


      avec par exemple menu.php :
      Code: Tout sélectionner
      <table width="150px">
      	<tr>
      		<th>Liens</th>
      	</tr>
      	<tr>
      		<td><a href="www.google.com">Google</a></td>
      	</tr>
      </table>


      Avec l' utilisation des templates il est possible de faire quasiment la même chose grâce à la méthode assign_var_from_handle() :

      L' idée est de créer le template à inclure (pour l' exemple le menu) et de l' assigner à un alias (comme d' habitude) et ensuite on assigne cet alias a une variable template. Autrement dit cette variable contiendra le template à inclure. Ensuite il suffit d' afficher cette variable dans un template pour l' inclure.

      Voyons un petit peu comment ça marche ;-)
      Pour faciliter l' explication lorsqu' on parlera de "template conteneur" et "template inclus" on parlera respectivement du template de la page principale et du template qu' on inclus dans ce dernier.

      Notre menu à inclure devient menu.tpl :
      Code: Tout sélectionner
      <table width="150px">
      	<tr>
      		<th>{L_LINKS}</th>
      	</tr>
      	<tr>
      		<td><a href="www.google.com">Google</a></td>
      	</tr>
      </table>


      Dans le code php de la page qui va contenir le menu il faut en plus d' assigner a un alias le template conteneur, assigner a un autre alias le template inclus :
      Code: Tout sélectionner
      // Assignation du template inclus a un autre alias
      $template->set_filenames('menu', 'menu.tpl');


      Servons-nous maintenant de cette fameuse fonction qui assigne l' alias a une variable template :
      Code: Tout sélectionner
      // Assignation de l' alias menu (et donc de menu.tpl) a la variable template {MENU}
      $template->assign_var_from_handle('MENU', 'menu');


      Comme notre menu - le template inclus - comporte une variable template, il faut lui assigner une valeur. Cela doit se faire AVANT l' assign_var_from_handle() car sinon le contenu de la/des variable(s) template du template inclus sera/seront vide(s).

      Code: Tout sélectionner
      $template->assign_vars(array(
      	'L_LINKS' => $lang['links']
      ));


      Et enfin une dernière action est requise pr terminer l' inclusion. Il faut afficher dans le template conteneur la variable template qui "contient" le template inclus :
      Code: Tout sélectionner
      {MENU}


      Remarques :
        Image Ici les liens du menu sont indépendants du code php, si il se trouve que vos liens dépendent du php (récupérés d' une base de données par exemple) alors il est plus pratique de créer une fonction qui fait le boulot-ci dessus que vous appelerez pour ajouter le menu.
        Code: Tout sélectionner
        //Fonction qui assignera a {MENU} le menu
        function addMenu()
        {
        	// Assignation du template inclus a un autre alias
        	$template->set_filenames('menu', 'menu.tpl');
        	
        	$template->assign_vars(array(
        		'L_LINKS' => $lang['links']
        	));
        
        	// Assignation de l' alias menu (et donc de menu.tpl) a la variable template {MENU}
        	$template->assign_var_from_handle('MENU', 'menu');
        
        	return;
        }


        De telle manière vous n' aurez qu' a mettre a jour une seule fois le code php, pour rajouter des liens ;-)

        Image Pour l' exemple ne pas oublier l' existence de : $lang['links']

        Image Exemple d' utilisation dans phpBB : le jumpbox qui est le menu déroulant qui permet de se déplacer rapidement vers un autre forum. En chipotant vous verez qu' il est inclus avec la variable
        Code: Tout sélectionner
        {JUMPBOX}
        Il y a aussi la "boite" de smilies lors de la création d' un post qui utilise ce système.

      III.3.8 Switch/Conditions
      Il arriva que vous aurez desoin d' exprimer une condition (ou switch).
      Par exemple l' affichage ou non des boutons pour modérateur.

      L' expression d' un switch se fait avec les blocks. Donc si vous avez compris pour les boucles vous n' aurez aucunes difficulté pour le switch ;-)

      Sans template vous aurez par exemple fait :
      Code: Tout sélectionner
      if($id == 0)
      {
      	echo '<img src="image.gif" alt="" />';
      }


      Avec template :
        Image Dans le code php (d' autres alternatives sont possibles au niveau de la variable template ;-) ):
        Code: Tout sélectionner
        if($id == 0)
        {
        	$template->assign_block_vars('switch_image', array(
        		'IMG' => '<img src="image.gif" alt="" />'
        	));
        }


        et dans le .tpl :
        Code: Tout sélectionner
        <!-- BEGIN switch_image -->
        {switch_image.IMG}
        <!-- END switch_image -->


        Image Il y a aussi une solution alternative possible :

        Code: Tout sélectionner
        $template->assign_var('IMG', '<img src="image.gif" alt="" />');
        if($id == 0)
        {
        	$template->assign_block_vars('switch_image', array());
        }


        et dans le .tpl :
        Code: Tout sélectionner
        <!-- BEGIN switch_image -->
        {IMG}
        <!-- END switch_image -->



      Et voilà, comme vous le voyez, c' est assez simple les conditions ;-)


      III.3.9 Parser le code et afficher la page
      En gros le "parsage" est décomposé en plusieurs étapes gérées par la fonction pparse() :
        Image Lecture code du fichier .tpl
        Image Remplacement des variables templates (qui ne sont pas dans des blocs) par les valeurs définies précédement.
        Image détection des blocs par les
        Code: Tout sélectionner
        <!-- BEGIN *** -->
        &
        Code: Tout sélectionner
        <!-- END *** -->
        et duplication du code compris entre ces deux lignes de code avec remplacement des variables templates des blocks.

      Le code pour effectuer ce travail est :
      Code: Tout sélectionner
      $template->pparse('alias');


      L' alias étant créé avant (voir III.3.3)

      ImageATTENTION : pparse() en plus de parser, affiche le tout à l' écran. Ne l' oubliez pas quand tout est fini ! Sinon rien ne s' affichera ;-)

Modifié en dernier par and1hotsauce le 11 Nov 2006 à 14:59, modifié 9 fois.
Avatar de l’utilisateur
and1hotsauce
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3517
Enregistré le: 19 Oct 2003 à 14:58
Localisation: belgique, mons

Messagepar and1hotsauce » 16 Avr 2006 à 17:20

IV) Exemple : Création d'une page affichant les rangs
    IV.1 Code nécéssaire à la création d' une nouvelle page
    Pour pouvoir insérer une nouvelle page à phpBB il suffit juste avoir les morceaux de code suivants dans la page :
    Au début :
    Code: Tout sélectionner
    <?php
    define('IN_PHPBB', true);
    $phpbb_root_path = './';
    include($phpbb_root_path . 'extension.inc');
    include($phpbb_root_path . 'common.'.$phpEx);
    
    //
    // Start session management
    //
    $userdata = session_pagestart($user_ip, PAGE_INDEX);
    init_userprefs($userdata);
    //
    // End session management
    //


    A la fin :
    Code: Tout sélectionner
    include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
    ?>


    IV.2 Remarques
      Image Essayez de mettre le moins de texte dans les pages *.php et *.tpl (uniquement dans les message_die(), voir de ne pas en mettre du tout). Utilisez les fichiers de langues "langages/lang_***/"

      Image Avant de créer une variable de langue ($lang['***']) vérifiez qu'elle nn'existe pas déjà :)

    IV.3 Création de la page ranks.php
    Après avoir créer un fichier ranks.php, y avoir mis le code du IV.1, il faut donner un "titre" à la page.
    Code: Tout sélectionner
    //Titre de la page
    $page_title = $lang['Ranks'];


    Pour cela $lang['Rangs'] doit exister, dans le cas contraire la créer (on le fait par la suite).

    Pour notre page ranks.php, il est également nécessaire de mettre le code suivant :
    Code: Tout sélectionner
    include($phpbb_root_path . 'includes/page_header.'.$phpEx);

    Car page_header va faire tout une série de choses (controle de l'utilsateur, gère le haut du forum, ....).

    Ensuite, assignons à la page ranks.php une page template de nom ranks_body.tpl(Nous créerons cette page après):
    Code: Tout sélectionner
    //Assignation du .tpl 'ranks_body' a l' alias 'body'
    $template->set_filenames(array(
    		'body' => 'ranks_body.tpl')
    	);


    Allons rechercher ensuite les rangs et leurs infos dans la base de données :
    Code: Tout sélectionner
    $sql = 'SELECT * FROM ' . RANKS_TABLE;
    
    //Vérifie que la requête s' est correctement effectué	
    if( !($result = $db->sql_query($sql)) ) 
    { 
       message_die(GENERAL_ERROR, 'Ne peut récupérer les informations des rangs', '', __LINE__, __FILE__, $sql); 
    }


    Créons des variables template qui serviront de titre de colonnes et donc seront fixes dans tout la page.
    Code: Tout sélectionner
    //Assignation des variables de langues aux variables template
    $template->assign_vars(array(
    	'L_RANK'			=> $lang['Rank'],
    	'L_RANK_MINIMUM'	=> $lang['Rank_minimum'],
    	'L_SPECIAL_RANK'	=> $lang['Rank_special'],
    	'L_RANK_IMG'		=> $lang['Rank_image']
    ));

    Encore une fois il faut vérifier que ces 4 variables de langue n'existent pas & les créer.

    Pour l'affichage des rangs, on a besoin d'un block (puisqu'en temps normal sans template on utiliserait une boucle) :
    Code: Tout sélectionner
    //Pour chaque rang, assignation des infos aux variables templates
    while ( $row = $db->sql_fetchrow($result) ) 
    { 
       $template->assign_block_vars('rank', array(
    		'RANK_NAME'	=> $row['rank_title'] ,
    		'RANK_MIN'	=> ($row['rank_min'] == -1) ? '-' : $row['rank_min'],
    		'RANK_SPECIAL'	=> ($row['rank_special'] === 1) ? $lang['Yes'] : $lang['No'],
    		'RANK_IMG'	=> ($row['rank_image'] != '') ? '<img src="' . $row['rank_image'] . '" alt="" />' : '&nbsp;'
    	));
    }


    Libérons la mémoire inutile :
    Code: Tout sélectionner
    //Delestage de la mémoire inutile
    $db->sql_freeresult($result);


    Générons la page avec le template.
    Code: Tout sélectionner
    //
    // Generate the page
    //
    $template->pparse('body');


    La page finale(elle peut être encore améliorée & complêtée) est donc :
    Code: Tout sélectionner
    <?php
    define('IN_PHPBB', true);
    $phpbb_root_path = './';
    include($phpbb_root_path . 'extension.inc');
    include($phpbb_root_path . 'common.'.$phpEx);
    
    //
    // Start session management
    //
    $userdata = session_pagestart($user_ip, PAGE_INDEX);
    init_userprefs($userdata);
    //
    // End session management
    //
    
    //Titre de la page
    $page_title = $lang['Ranks'];
    include($phpbb_root_path . 'includes/page_header.'.$phpEx);
    
    //Assignation de 'ranks_body.tpl' a l' alias 'body'
    $template->set_filenames(array(
    		'body' => 'ranks_body.tpl')
    	);
    
    
    $sql = 'SELECT * FROM ' . RANKS_TABLE;
    
    //Vérification que la requête s' est bien effectuée	
    if( !($result = $db->sql_query($sql)) ) 
    { 
       message_die(GENERAL_ERROR, 'Ne peut récupérer les informations des rangs', '', __LINE__, __FILE__, $sql); 
    }
    
    //Assignation des variables templates	
    $template->assign_vars(array(
    	'L_RANK'			=> $lang['Rank'],
    	'L_RANK_MINIMUM'	=> $lang['Rank_minimum'],
    	'L_SPECIAL_RANK'	=> $lang['Rank_special'],
    	'L_RANK_IMG'		=> $lang['Rank_image']
    ));
    while ( $row = $db->sql_fetchrow($result) ) 
    { 
       $template->assign_block_vars('rank', array(
    		'RANK_NAME'	=> $row['rank_title'] ,
    		'RANK_MIN'	=> ($row['rank_min'] == -1) ? '-' : $row['rank_min'],
    		'RANK_SPECIAL'	=> ($row['rank_special'] === 1) ? $lang['Yes'] : $lang['No'],
    		'RANK_IMG'	=> ($row['rank_image'] != '') ? '<img src="' . $row['rank_image'] . '" alt="" />' : '&nbsp;'
    	));
    }
    //Delestage de la mémoire inutile
    $db->sql_freeresult($result);
    
    //
    // Generate the page
    //
    $template->pparse('body');
    include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
    ?>


    IV.4 MAJ du fichier de(s) langue(s)
    Il faut rajouter dans chaque langue les variables de langues dont on s'est servis plus haut. Ici on a travaillé avec uniquement des fichiers qui ne sont pas dans l'administration donc on met à jour le fichier "langages/lang_***/lang_main.php"

    Code: Tout sélectionner
    //MOD ranks
    $lang['Ranks'] = 'Rangs';
    $lang['Rank'] = 'Rang';
    $lang['Rank_special'] = 'Rang spécial';
    $lang['Rank_minimum'] = 'Messages Minimums'; 
    $lang['Rank_image'] = 'Image du rang';
    //


    Il ne reste plus qu'à créer le fichier *.tpl

    IV.5 Création de la page ranks_body.tpl
    Si vous avez compris le tutorial de Génova cette page en HTML ne devrait pas poser de soucis :
    Code: Tout sélectionner
    <table width="100%" cellspacing="1" cellpadding="4" border="0" align="center" class="forumline">
    	<tr>
    		<th class="thCornerL">{L_RANK}</th>
            <th class="thTop">{L_RANK_MINIMUM}</th>
    		<th class="thTop">{L_SPECIAL_RANK}</th>
    		<th class="thCornerR">{L_RANK_IMG}</th>
    	</tr>
    	<!-- BEGIN rank -->
    	<tr>
    		<td class="row1"><span class="gensmall">{rank.RANK_NAME}</span></td>
    		<td class="row1"><span class="gensmall">{rank.RANK_MIN}</span></td>
    		<td class="row1"><span class="gensmall">{rank.RANK_SPECIAL}</span></td>
    		<td class="row1"><span class="gensmall">{rank.RANK_IMG}</span></td>
    	</tr>
    	<!-- END rank -->
    	<tr>
    		<td class="catBottom" align="center" colspan="4">&nbsp;</td>
    	</tr>
    </table>


    Enregistrez la page dans le dossier "templates".

    Voila le MOD "page rank" est fini, il restera plus qu'à mettre le lien dans le menu du forum ;-)


[ dernière MAJ le 16/04/2006 par And1HotSauce ]
Avatar de l’utilisateur
and1hotsauce
Grand-maître des floodeurs
Grand-maître des floodeurs
 
Messages: 3517
Enregistré le: 19 Oct 2003 à 14:58
Localisation: belgique, mons


Retourner vers [phpBB 2.0.x] Forum de documentation

 


  • Articles en relation
    Réponses
    Vues
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron