PHP & les hook

cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 26 avril 2016 à 15:45
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 - 1 mai 2016 à 11:48
Bonjour,

Je vous explique d'abord mon problème : je suis entrain de développer un site sur le jeu Euro Truck Simulator 2 : ETS2Routes (http://www.ets2routes.com pour ceux qui veulent voir ce qui a déjà été fait). Dans le cadre de ce projet (que je compte présenter au jury les 7 et 8 juillet 2016 dans le cadre de ma formation pro à Objectif3D), je souhaite gérer les différents éléments sous forme de modules.

A ce niveau là, pas de soucis je m'en sorts très bien, mais je souhaiterais pouvoir faire comme le permettent les CMS comme Wordpress/Drupal/Joomla : qu'un module puisse interagir sur une page sans devoir modifier cette page pour appeler le module.

Actuellement, sur la page d'accueil j'affiches les news et je suis obligé donc dans le Core\Indexcontroller.php d'appeler le contrôleur de mon module (actuellement Modules\News\NewsController.php), mais si demain je veux changer ben je suis obligé de modifier ma page.

Je sais que Wordpress, permet via add_filter et add_action, de faire un hook pour que le plugin puisse ajouter par exemple des metabox sur la page sans modifier cette dernière.

Je souhaiterais pouvoir avoir un comportement de ce style, mais hélas je ne vois pas comment faire. J'ai déjà plus ou moins contourné mon soucis pour l'ajout d'un CSS propre au module, en créant une classe Core\HookController.php, et dont on appel la méthode addCSS, qui stocke dans un tableau le nom du CSS a charger.

Cela me permet actuellement, d'afficher dans ma page un CSS en plus à partir du module et sans modifier ma page. Mais je sais pas si faire à coup de méthodes et tableaux comme ça, si ça va pas alourdir et rendre imbuvable au final.

Merci d'avance pour votre aide.

P.S. : Le code intégral du site est disponible sur http://www.ets2routes.com/git qui vous fera retombé sur mon dépôt GIT sur bitbucket, du fait que le projet est open-source. Si vous avez donc besoin de voir les sources, c'est librement accessible à tous ;).

5 réponses

nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
27 avril 2016 à 10:24
Salut,

Pour gérer dynamiquement ta page il faut te tourner vers le javascript:
Php est interpreté par le serveur et renvoi un formulaire, ce qui sous entend que tu ne peux pas "updater" ta page en partie ( en fait si, tu peux utiliser les frame mais c'est déconseillé et pas adapté à ton besoin je penses.
Le javascript te permet d'effectuer des actions depuis le poste client ce qui te permet de gérer l'affichage sans recharger son intégralité.

Donc pour faire court: fais des recherche concernant le javascript associé à la gestion des champs et les sockets (pour la communication)

naga
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
27 avril 2016 à 10:39
Bonjour Naga,

Merci pour ta réponse. Je sais que le JavaScript avec l'AJAX permet d'éviter le rechargement de page, mais mon problème ne concerne pas ça du tout.

En fait sur Wordpress (et c'est en PHP pas en JS que c'est fait, mais je comprend pas leur fonction add_filter, le hic est là), tu peux faire un "add_metabox" par exemple dans ton plugin. Cela aura pour effet, quand tu arriveras sur la page "modifiée" par ce add_metabox, d'avoir une zone de la page où s'affiche ton propre module. Wordpress appel cela des Hook, et vu ce que cela fait ça correspond bien à la définition d'un hook : interception d'un événement.

Le problème étant que je ne comprend pas comment Wordpress fait. Tout ce que je sais, c'est qu'avec ce add_metabox, quand ton plugin est chargé, l'instruction add_metabox si elle est exécutée, va rajouter une nouvelle entrée dans la page demandée afin d'afficher ton plugin.


J'ai un peut contourner mon soucis avec mon addCSS pour ajouter un CSS propre à mon module sur mes pages, j'ai prévu dans mon template, qu'il puisse y avoir d'autres CSS, et cette méthode de ma classe HookController, récupère le nom passé en paramètre et l'enregistre dans un tableau PHP.

A partir de là, au moment où ma page est chargée, je me retrouve bien avec mon nouveau CSS d'ajouté.

Mais je sais pas si cela peut s'appliquer au reste, ou si c'est un cas isolé non utilisable (ou trop pénible à utiliser) pour ajouter ce même comportement pour l'intégration d'un module.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
27 avril 2016 à 11:12
Ok donc si je comprend bien, ce que tu souhaite faire c'est générer ta page (via php) en incluant ou non des modules ? (je ne penses pas car je pense que tu l'aurai fait)

En fait il n'y a pas 50 possibilités:
- On génère notre page en php et on envoi au client un contenu htlm+css -> pas de dynamisme côté client

- On envoi un contenu html+css+javascript ( généré ou non en php) -> dynamisme côté client

- On utilise des frame: les zone pour être mises à jours individuellement (elles fonctionnent comme des pages indépendantes grosso modo) MAIS A NE PAS UTILISER: c'est devenu obsolète



A noté que le css peu apporter un peu de dynamisme visuel mais en aucuns cas effectuer de communication avec le serveur (sur les toutes dernières versions de css et html il me semble qu'ils ont rajouté du js implicite pour pouvoir le faire sans utiliser directement le js mais je n'ai aucunes certitudes ou connaissances dessus) : masquer ou rendre visible des élément, effectuer un mouvement, mais dans tous les cas les éléments existent dans ta page.

Word press, ainsi que "tous" (je ne les connais pas tous) les cms incluent le js => c'est très simple de générer du javascript via le php (exactement meme principe que pour du css, html, etc). Ce qui sous entend que de ton côté tu ne fais que des appels JS mais qu'à aucuns moment ca prouve qu'il n'y a pas de javascript "derrière" (pour ca c'est simple, il te suffit de regarder le code html généré)

Tu peux toujours t'inspirer des fonctions de word press pour ton dev, tu as toutes les sources ( si tu n'as pas de version dispo chez toi) ici:

http://phpxref.ftwr.co.uk/wordpress/nav.html?index.html

Ou juste le source de la fonction add_filter:
https://developer.wordpress.org/reference/functions/add_filter/

qui inclue la fonction _wp_filter_build_unique_id :
https://developer.wordpress.org/reference/functions/_wp_filter_build_unique_id


naga
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344
27 avril 2016 à 11:51
Bonjour,

Je pense que ce que tu cherches ressemble à ça :
https://wiki.dolibarr.org/index.php/Syst%C3%A8me_de_Hooks
http://www.edouardlabre.com/developpement-internet/les-hooks/
http://www.failover.co/blog/writing-pluggable-php-application-part-3
https://processwire.com/talk/topic/4834-simple-hooks-tutorial-turn-a-pagearray-into-a-list-of-links/


Si tu parviens à mettre en place ce genre de mécanisme .. n'hésites pas à revenir ici nous montrer le résultat .... ça peut en intéresser plus d'un (moi y compris ^^ )

0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par nagashima le 27/04/2016 à 12:03
oY!

Du coup tu pourra peu être m'expliquer la différence, car pour moi les hook c'est juste des conteneurs pour générer des pages suivant un paramétrage, le "dynamisme" est côté serveur ...

[edit] et du coup s'i c'est juste ca, autant prendre une classe simple déja faite,comme:
https://github.com/edouardl/php_hooks/blob/master/inc/hook.php
/edit
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023
27 avril 2016 à 13:12
Salut Naga,


car pour moi les hook c'est juste des conteneurs pour générer des pages suivant un paramétrage, le "dynamisme" est côté serveur

Pour moi aussi .... et c'est visiblement ce dont Christophe parle également..


l'instruction add_metabox si elle est exécutée, va rajouter une nouvelle entrée dans la page demandée afin d'afficher ton plugin.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
27 avril 2016 à 13:48
ok donc c'est bien ce que je disais x) bon après c'est vrai que j ai tendance a mal expliquer mon point de vue -_- (dans le cas présent, la différence entre le dynamisme coté serveur et le dynamisme client)

Donc du coup la classe que je donnes en lien devrai convenir ^^
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023
27 avril 2016 à 14:41

(dans le cas présent, la différence entre le dynamisme coté serveur et le dynamisme client)

Oui .. mais je ne trouve pas décon**t de gérer les "modules" à afficher côté serveur.
Ce n'est "que" du paramétrage fait par l'admin du site qui décide si un "plugin" doit être affiché ou non sur une page.


Donc du coup la classe que je donnes en lien devrai convenir ^^

Oui. je l'avais vu également.
Mais je trouve plus intéressant de regarder les tutos pour comprendre comment ça fonctionne plutôt que d'utiliser une class toute faite, qui, si on n'en a pas compris le fonctionnement ne servira à rien de toutes manières ^^
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
27 avril 2016 à 14:49
C'est exactement cela que je veux faire, j'ai fait un petit début pour les CSS mais je pense que c'est une façon de faire un peut dégueulasse.

Mais oui tu as très bien compris ce que je souhaite faire, c'est exactement cela.
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
27 avril 2016 à 14:55
Merci pour ce lien que je vais étudier attentivement ce week-end dès que j'ai du temps (en semaine je suis en stage, et je m'arrache déjà les cheveux sur le code qu'on me fait faire alors bon lol).

Mais oui en effet, cette classe semble correspondre à ce que je veux (dommage que le principe d'encapsulation n'est pas forcément respecté pour ce que j'ai lu en diagonale lol). Je verrais pour faire des tests ce week-end et voir si ça correspond bien.

Par contre j'aime bien faire mes propres codes en effet, mais si j'arrive à l'utiliser et la comprendre, elle pourrait me servir de base pour faire mon propre truc.


Je vous recontacte dès que j'ai testé et je vous dis si c'est ça que je veux. En attendant, si vous avez des idées je reste preneur, car le but n'est pas non plus d'avoir du tout fait mais comprendre comment c'est fait (d'où le fait que j'aime bien tout faire moi même lol).
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
27 avril 2016 à 15:30
Je me reprends, mais la classe en lien est un peu "sale" à mon gout, par contre le squelette est correcte et il permet de comprendre la notion d'invoke de fonction ( en c# par exemple, ca se nome reflexion - en php, comme en javascript, c est ultra simplifier du fait qu'une variable est un conteneur - le contenu pouvant être tout et n importe quoi).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
29 avril 2016 à 09:24
Hello !

Voila comme promis j'ai fais les deux classes avec un petit test pour illustrer. C'est ultra simple (je laisse les améliorations a faire en fonction de ce que vous voulez vraiment faire) , mais le principe est la.

<?php

class Conteneur {

	var $Alias; //alias - pour class hook 
	var $isSet = false; //module inclu dans la page? - pour class hook
	var $iHauteur; //Hauteur du module
	var $iLargeur; //largeur du module
	var $sFunction; //fonction à appeler pour la génération
	
	
	function set( $tAlias,$tHauteur,$tLargeur,$tFunction){
		$this->Alias=$tAlias;
		$this->iHauteur=$tHauteur;
		$this->iLargeur=$tLargeur;
		$this->sFunction=$tFunction;
	}
	
	function set_hauteur( $tHauteur ) {$this->iHauteur=$tHauteurs;}
	function get_hauteur( $tHauteur ) { return $this->iHauteur; }
	function set_largeur( $tLargeur ) {$this->iLargeur=$tLargeur;}
	function get_largeur( $tLargeur ) { return $this->iLargeur; }
	
	function run( $param ) {
		$this->isSet=true;
		return call_user_func($this->sFunction,$param);	
	}
}

class Hook {
	var $tConteneurs; //tableau de conteneurs
	
	
	//add ou set (implicite) un conteneur
	function add( $Conteneur ) { $this->tConteneurs[$Conteneur->Alias]=$Conteneur; }
	//appel de la fonction 
	function call( $Alias , $param) { return $this->tConteneurs[$Alias]->run($param); }
	
	function getListSet () {
		$tRet = array();
		foreach($this->tConteneurs as $cont){
			if( $cont->isSet ){ $tRet[$cont->Alias] = $cont;}
		}
		return $tRet;
	}
}

//-- tester 

function test_1( $var ) { echo $var; return true; }
function test_2( $tvar ) {
	print_r($tvar);
	foreach($tvar as $var) {
		echo '<br />' . $var;
	}
	return true;
}

$oCont1=new Conteneur();
$oCont1->set('test_1',10,10,'test_1');
$oCont2=new Conteneur();
$oCont2->set('test_2',10,10,'test_2');

$oHook = new Hook();
$oHook->add($oCont1);
$oHook->add($oCont2);

$oHook->call('test_1','test var');
echo '<br />' ;
echo '<br />' ;
$oHook->call('test_2',array("foo", "bar", "hello", "world"));
echo '<br />' ;
echo '<br />' ;

print_r($oHook);





un test a rajouter sera de donner comme fonction une fonction d'une autre classe.
On pourra aussi rajouter un parametre pour savoir si l'appel de la fonction est avec une variable unique ou non (regarder différences call_user_func / call_user_func_array).

Demandez si besoin.

naga
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5
29 avril 2016 à 09:34
Merci, je regarde ça demain matin car ce soir je peux pas. Mais cela semble rejoindre une idée que j'ai noté avant-hier soir au moment de me coucher lol.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
29 avril 2016 à 10:02
prends ton temps ^^

juste deux choses auquel tu n 'as pas nécessairement pensé:
Dans ma classe de conteneur, j'ai la hauteur et la largeur que tu pourra exploiter pour générer ton css. Ca pourrai être pas mal d'avoir un ordre d'affichage pour mettre en premier les modules estimés plus "important" (que tu peux laisser au paramétrage utilisateur: il configure les modules, leur affichage et ordre, et tu sérialize ta classe en bdd: chaque user aura son interface).

Aussi, pour simplifier tes calculs de mise en page, tu pourrais t'inspirer des tuiles de windows: 3 tailles définie en %age:
- taille 1: 25% en largeur
- taille 2: 50%
- taille 3 : 100%

ca te permettra de gérer un css avec une simple matrice ;)

bon dev.
naga
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023
29 avril 2016 à 10:08
Hello
pour le css ... tu peux aussi te servir de bootstrap. ...
0
cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023 5 > jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024
29 avril 2016 à 10:42
Oui c'est déjà ce que j'utilise, ce bon vieux Bootstrap, mais je le personnalise un peut car il correspond pas parfaitement à mes besoins.
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 344 > cs_christophedlr Messages postés 267 Date d'inscription samedi 3 janvier 2004 Statut Membre Dernière intervention 23 août 2023
29 avril 2016 à 15:46

mais je le personnalise un peut car il correspond pas parfaitement à mes besoins.

Comme tout le monde en fait .. :-)
Déjà ... je l'ai passé sur 48 colonnes .... histoire d'affiner les positionnement ....
0
Rejoignez-nous