Function assign_bloc du Moteur Template
Hors ligneZbergk Le 14/02/2006 à 12:21 Profil de Zbergk Configuration de Zbergk

Bonjour,

Je suis en train de réaliser mon propre moteur de template. Mais comme je ramais assez bien pour les assign_bloc, j'ai recherché quelque exemple sur le google, et je suis tombé sur celui-ci en php5.

Mais j'aimerais avoir plus d'infos sur la "function assign_bloc"
Car je ne comprend pas trop bien sont fonctionnement.

Est ce possible d'expliquer son fonctionnement pt par pt, pour que j'essaye de me basser sur elle.

A premiére vue je partais du même principe càd faire passer le Nom du bloc et un tableau de donnée a la fonction.

Merci d'avance.
ZbergK
En ligneAnthony Le 14/02/2006 à 13:20 Profil de Anthony Configuration de Anthony

Admin
Salut,

si tu parles de ma classe, en fait on a ça :


<?php
        
//-----------------------------------------------------------
        //TRAITE LES BLOCS
        //-----------------------------------------------------------
        public function assign_bloc($nom_bloc,$tableau)
        {
            $array_recherche=array('<!--'.$nom_bloc.'-->','<!--/'.$nom_bloc.'-->');
            $array_remplace=array('','');

            //--------------------------------------------------
            //SI LE CONTENU DU BLOC N'A PAS ETE ENCORE RECUPERE
            //ON LE STOCKE DANS LA VARIABLE
            //$this->blocs[$nom_bloc]
            //--------------------------------------------------
            if(!isset($this->blocs[$nom_bloc]))
            {
                $tableau_ereg=array();
                ereg('<!--'.$nom_bloc.'-->(.*)<!--/'.$nom_bloc.'-->',$this->template,$tableau_ereg);
                $this->blocs[$nom_bloc]=$tableau_ereg[0];
            }
            //--------------------------------------------------
            //REMPLACE LE MASQUE PAR TOUTES LES VALEURS
            //DU TABLEAU PASSEES EN PARAMETRE
            //--------------------------------------------------

            while(list($cle,$valeur)=each($tableau))
            {
                //---------------------------------
                //RAJOUTE UNE CONDITION DE
                //REMPLACEMENT
                //---------------------------------

                $array_recherche[]='{'.$cle.'}';
                $array_remplace[]=$valeur;

            }
            //----------------------------------------------------
            //RAJOUTE LE CONTENU PARSE AU CONTENU DU BLOC EXISTANT
            //----------------------------------------------------
            if(!isset($this->contenu_blocs[$nom_bloc]))
            {
                $this->contenu_blocs[$nom_bloc]=str_replace($array_recherche,$array_remplace,$this->blocs[$nom_bloc]);
            }
            else
            
{
                $this->contenu_blocs[$nom_bloc].=str_replace($array_recherche,$array_remplace,$this->blocs[$nom_bloc]);
            }
        }
?>


Ceci :       $array_recherche=array('<!--'.$nom_bloc.'-->','<!--/'.$nom_bloc.'-->');
            $array_remplace=array('','');

va te rechercher dans le code html de la template le bloc et supprimer les commentaires qui le délimitent.

            if(!isset($this->blocs[$nom_bloc]))
            {
                $tableau_ereg=array();
                ereg('<!--'.$nom_bloc.'-->(.*)<!--/'.$nom_bloc.'-->',$this->template,$tableau_ereg);
                $this->blocs[$nom_bloc]=$tableau_ereg[0];
            }

ceci permet comme le commentaire l'indique de récupérer ce qui était entre les délimiteurs du bloc dans le code HTML.

            while(list($cle,$valeur)=each($tableau))
            {
                //---------------------------------
                //RAJOUTE UNE CONDITION DE
                //REMPLACEMENT
                //---------------------------------

                $array_recherche[]='{'.$cle.'}';
                $array_remplace[]=$valeur;

            }

Ceci permet de remplacer tout ce qui est entre accolades dans le bloc. Mettons que tu aies un code comme ça de ton bloc :

<!--BLOC_MACHIN-->
ici un {TRUC} et un autre {MACHIN}
<!--/BLOC_MACHIN-->

bah ça va remplacer {TRUC} et {MACHIN} par ce que tu as spécifié. Le reste permet en cas de "continuité" (si tu rajoutes une ligne à un tableau html par exemple) de rajouter le contenu du bloc actuel au contenu des blocs d'avant qui ont été parsés.

a +
--

Hors ligneZbergk Le 14/02/2006 à 18:50 Profil de Zbergk Configuration de Zbergk

Pourrais tu expliquer cette ligne

ereg('<!--'.$nom_bloc.'-->(.*)<!--/'.$nom_bloc.'-->',$this->template,$tableau_ereg);

Tu dis que l'on va chercher dans $this->template ce qui a entre les blocs.
Je suis tout a fait d'accord, mais je ne comprend pas comment cela se passe au niveau du ereg et aussi du (.*)
Et qu'ensuite on utilise le tableau_ereg[0]

Tu dis aussi cela :
$array_recherche=array('<!--'.$nom_bloc.'-->','<!--/'.$nom_bloc.'-->');
$array_remplace=array('','');
Va te rechercher dans le code html de la template le bloc et supprimer les commentaires qui le délimitent.

Moi ce que je vois c'est juste 2 tableaux que tu déclares, dans le premier tu y mets les bornes de nos blocs et le 2e des chaînes vides ?
Pourquoi cela ?

Merci d'avance.
Je poses toute c'est question car j'aime bien comprendre tout le principe du code et ne pas copier-coller bêtement.
Je supposes que tu comprend ma démarche

ZbergK
En ligneAnthony Le 14/02/2006 à 20:06 Profil de Anthony Configuration de Anthony

Admin
.* ça veut dire n'importe quelle chaîne de caractères située entre les deux délimiteurs de blocs.

Pour savoir pourquoi j'ai utilisé $tableau_ereg[0] c'est une question de masque, il y a deux ou trois masques qui vont être retournés et seul celui contenu à l'indice 0 m'intéresse (je ne veux pas me récupérer les deux blocs par exemple).

Ensuite pour les deux tableaux une petite recherche (idem que ci dessus) sur fr.php.net fonction str_replace() et tu verras que ça accepte deux tableaux en paramètres...
--

Hors ligneZbergk Le 14/02/2006 à 23:49 Profil de Zbergk Configuration de Zbergk

Hé bien voilà ca commence a devenir bcp plus clair

J'ai voulu modifier un petit truc.
Au lieu de devoir passer par "function afficher_blocs()"
J'ai voulu mettre ce code directement a la fin de "function assign_bloc($nom_bloc,$tableau)"

Et la ca ne marchait plus.

J'ai donc analysé le contenu de " $this->contenu_blocs"
Et a ma grande surprise il n'est pas le même dans les 2 fonctions que j'ai sité précédement.
Je n'arrive pas a m'expliquer pourquoi
J'aimerais ne pas devoir créer la 2e fonction "afficher_blocs()" ya t'il moyen ?

Merci d'avance
ZbergK
En ligneAnthony Le 15/02/2006 à 12:39 Profil de Anthony Configuration de Anthony

Admin
Non y'a pas moyen faut que ce soit fait une fois que tous les blocs soient remplis, bref non. sinon faut mettre le code de cette fonction dans afficher() mais il est inutile de modifier ça de toute façon, cela ne correspondra plus au fonctionnement initial de cette classe.

a +
--

Hors ligneZbergk Le 15/02/2006 à 16:59 Profil de Zbergk Configuration de Zbergk

Ok,

Mais comment expliques tu que le contenu de "$this->contenu_blocs" n'est pas le même dans les 2 fonctions ?

ZbergK
En ligneAnthony Le 15/02/2006 à 18:22 Profil de Anthony Configuration de Anthony

Admin
$this ça veut dire que c'est une variable de la classe, donc si elle est présente en haut de la classe elle est "globale" donc c'est la même chose dans les deux fonctions.
--

Hors ligneZbergk Le 15/02/2006 à 18:37 Profil de Zbergk Configuration de Zbergk

Je le savais avec le $this
Mais en testant avec ca
Foreach ($this->contenu_blocs as $element) { echo "#".$element."<br/>"; }
Le résultat n'est pas le même lorsqu'on le test dans "assign_blocs" et "afficher_blocs"

C'est donc cela que je ne comprend pas as tu testé toi aussi ?
En ligneAnthony Le 15/02/2006 à 19:00 Profil de Anthony Configuration de Anthony

Admin
Bon je t'ai répondu sur le chat sur le fait que assign_bloc() ne modifie pas tout le bloc d'un coup mais qu'elle le complète également.
--

Vous avez résolu votre problème avec VIC ? Faites-le savoir sur les réseaux sociaux !
Vulgarisation-informatique.com
Cours en informatique & tutoriels