Un plugin qui agit sur moteur de Thelia

De TheliaDoc
Aller à : navigation, rechercher

A chaque page appelée, le moteur de Thelia est appelé. Il execute de nombreuse action de manière linéaire. Régulièrement, le moteur appelle certaines fonctions bien précises des plugins.

Inclusion des classes des plugins

Pour pouvoir instancier un objet et le conserver en session, il faut que la classe soit définie avant l'appel de la fonction :

session_start();

Pour que votre classe soit appelée avant l'ouverture de la session, il faut créer dans le repertoire de votre plugin, au même niveau que le fichier Monplugin.class.php, un fichier nommé inclure_session.php qui contiendra l'inclusion de votre/vos classes :

include_once(realpath(dirname(__FILE__)) . "/Monplugin.class.php");

Points d'entrée

Les points d'entrée sont des méthodes dont le moteur va vérifier l'existence dans chaque classe héritant de plugin. Si elle sont présentes et que le plugin est actif, elles sont exécutées.

Soit le point d'entrée predemarrage, lorsqu'il sera appelé par le moteur de Thelia, ce dernier va rechercher dans tous les plugins activé si la classe contient une méthode nommée ainsi.

L'exemple suivant montre par exemple comment un plugin peut interdire l'accès aux pages Thelia à l'adresse IP 127.0.01 en utilisant un point d'entrée :

class Monplugin extends PluginsClassiques
{
	function predemarrage()
	{
		if($_SERVER["REMOTE_ADDR"] == '127.0.0.1')
		{
			echo "ACCES INTERDIT";
			exit;
		}
	}
}

Cheminement du moteur

  • inclusion des fichiers inclure_session.php
  • initialisation de la session :
session_start();
  • appel du point d'entrée predemarrage
  • initialisation de $_SESSION["navig"] si elle n'existe pas
  • définition des variables $fond, $lang et $devise et récupération des différentes variables recevable par le moteur en paramètres (GET ou POST)
  • si la réécriture d'url est activée :
    • chargement du contexte (par exemple on récupère l'id du produit/rubrique/contenu/dossier)
    • appel du point d'entrée lireVarUrl
  • mise en session de :
$_SESSION["navig"]->urlprec = $_SERVER['HTTP_REFERER'];
$_SESSION["navig"]->lang = $lang;
$_SESSION["navig"]->devise = $devise;
  • appel du point d'entrée demarrage
exemple :

function demarrage()
{
	global $fond;
	if($fond == 'index' && $_SESSION['client']->connecte) //si on est sur la page d'index et que le client est connecté
	{
		$fond = 'index_client'; //on affiche le fond index_client.html au lieu de index.html
	}
}
  • appel des actions de Thelia passées dans le paramètre action (exemple : action=creercompte, action=ajouter, action=connexion ...). Lors de certaines action, on retrouve des points d'entrée.
    • si action=codepromo :
      • appel du point d'entrée avantpromo qui prend en premier paramètre (string) le code promo utilisé (passé en référence).
exemple :

function avantpromo(&$code)
{
	if($code=='CODE_TEST' && $_SERVER["REMOTE_ADDR"] != '127.0.0.1') // si on utilise le code promo CODE_TEST et que l'on a pas l'adresse IP 127.0.0.1
	{
		$code = ""; //on vide le code
	}
}
      • mise en session du code promo dans $_SESSION['navig']->promo
      • appel du point d'entrée avantpromo qui prend en premier paramètre (string) le code promo utilisé (passé en référence)
exemple :

function aprespromo($code)
{
	if(!isset($_SESSION['navig']->promo)) // si le code promo utilisé n'est pas valide
	{
		//on peux par exemple tester si le code correspond à un type de code promo personnalisé et appliquer une réduction spéciale.
	}
}
    • si action=calc_remise :
      • calcul de la remise (code promo) pour le panier en cours du client.
      • appel du point d'entrée calc_remise qui prend en premier paramètre (float) la remise calculée par Thelia (passée en référence)
exemple :

function calc_remise(&$remise)
{
	if(in_array($_SESSION['navig'])->client->id, $listeRouge) // si le client est dans la liste rouge
	{
		$remise = 0; //on supprime la remise
	}
}
    • si action=connexion :
      • tentative d'identification du client
      • si l'identification est un succès : appel du point d'entrée apresconnexion qui prend en premier paramètre (objet client) le client qui vient de se connecter (passé en référence)
exemple :

function apresconnexion($client)
{
	//$client correspond à $_SESSION['navig']->client
	if(in_array($client->id, $listeNoire) // si le client est dans la liste noire
	{
		$_SESSION['navig']->connecte = 0;
		$_SESSION['navig']->client = new Client(); //on déconnecte le client et on l'envoi sur une page d'avertissement
		redirige(urlfond('compte_banni'));
	}
}
    • si action=deconnexion :
      • deconnexion du client
      • appel du point d'entrée apresdeconnexion
exemple :

function apresdeconnexion()
{
	$_SESSION['datenaissance'] = ; //on supprime la date de naissance du client que l'on stockait en session (car elle n'est pas gérée nativement pas Thelia)
}
    • si action=paiement :
      • vérification que le panier contient au moins un article sinon redirection vers l'index.
      • appel du point d'entrée avantcommande
exemple :

function avantcommande()
{
	if($_SESSION['navig']->panier->total() - calc_remise($_SESSION['navig']->panier->total()) < 20) //si le total de la commande n'est pas au minimum de 20€, on renvoie le client vers une autre page.
	{
		redirige(urlfond('cgv'));
	}
}
      • debut de la création de la commande dans Thelia
      • pour chaque produit ajouté dans la table venteprod appel du point d'entrée apresVenteprod qui prend en premier paramètre (objet venteprod) le produit qui vient d'être ajouté (passé en référence)
exemple :

function apresVenteprod($venteprod)
{
	if($venteprod->ref=='ETAGERE_A_MONTER'); //si on commande le produit ETAGERE_A_MONTER, on ajoute un produit POT_PEINTURE offert lié.
	{
		$potPeinture = new Produit('POT_PEINTURE');
		
		$cadeau = new Venteprod();
		$cadeau->ref = $potPeinture->ref;
		$cadeau->titre = $potPeinture->titre;
		$cadeau->chapo = $potPeinture->chapo;
		$cadeau->description = $potPeinture->description;
		$cadeau->prixu = 1;
		$cadeau->tva = 0;
		$cadeau->commande = $venteprod->commande;
		$cadeau->parent = $venteprod->id;
		$cadeau->add();
	}
}
      • fin de la création de la commande dans Thelia
      • appel du point d'entrée aprescommande qui prend en premier paramètre (objet commande) la commande qui vient d'être crée (passée en référence)
exemple :

function aprescommande($commande)
{
	if($commande->total - $commande->remise > 1000); //si la commande est supérieur à 1000€
	{
		//on communique un code de réduction spécial par mail au client

		$client = new Client($commande->client);

		$nomsite = new Variable('nomsite');
		$emailfrom = new Variable('emailcontact');

		$message = new Message('email_promo_1000_euros');
		$messagedesc = new Messagedesc($message->id);

		Mail::envoyer(
			$client->prenom . ' ' . $client->nom, $client->email,
			$nomsite->valeur, $emailfrom->valeur,
			$messagedesc->titre,
			$messagedesc->description,
			$messagedesc->descriptiontext
		);
	}
}
      • appel des fonctions :
mail();
paiement();
    • si action=creercompte :
      • appel du point d'entrée avantclient
exemple :

function avantclient()
{
	$quota = new Variable('quota_inscription_atteint');
	if(quota->valeur == 1) //si on a atteint notre quota d'inscription, on redirige le client
	{
		redirige(urlfond('quota'));
	}
}
      • tentative de création du client
      • si le client a été créé, appel du point d'entrée apresclient qui prend en premier paramètre (objet client) le client qui vient d'être crée (passé en référence)
exemple :

function apresclient($client)
{
	//$client correspond à $_SESSION['navig']->client
	//on envoi un mail au client pour confirmer son inscription
	$nomsite = new Variable('nomsite');
	$emailfrom = new Variable('emailcontact');

	$message = new Message('confirmation_inscription');
	$messagedesc = new Messagedesc($message->id);

	Mail::envoyer(
		$client->prenom . ' ' . $client->nom, $client->email,
		$nomsite->valeur, $emailfrom->valeur,
		$messagedesc->titre,
		$messagedesc->description,
		$messagedesc->descriptiontext
	);
}
    • si action=modifiercompte :
      • appel du point d'entrée avantmodifcompte
exemple :

function avantmodifcompte()
{
	//on vérifie si la nouvelle pointure (car elle n'est pas gérée nativement pas Thelia) saisie par le client est bien un entier compris entre 35 et 45. Sinon on le redirige vers le formulaire d'erreur
	$pointure = lireParam('date_naissance', 'int');
	if(empty($pointure) || $pointure>45 || $pointure<35)
	{
		redirige(urlfond('compte_modifiererr', 'errform=1&errpointure=1'));
	}
}
      • tentative de modification du client
      • si le client a été modifié, appel du point d'entrée apresmodifcompte qui prend en premier paramètre (objet client) le client qui vient d'être modifié (passé en référence)
exemple :

function apresmodifcompte($client)
{
	//$client correspond à $_SESSION['navig']->client
	//on insere la nouvelle pointure (car elle n'est pas gérée nativement pas Thelia) saisie par le client
	{ ... }
}
    • si action=creerlivraison :
      • tentative de creer une nouvelle adresse de livraison
      • si l'adresse de livraison a été créée, appel du point d'entrée apres_creerlivraison qui prend en premier paramètre (objet adresse) l'adresse de livraison qui vient d'être créée (passée en référence)
exemple :

function apres_creerlivraison($adresse)
{
	if(in_array(substr($adresse->cpostal, 0, 2), array('03', '15', '43', '63')) // si l'adresse est en Auvergne
	{
		//On envoi un email à l'admin, parce qu'un Auvergnat ça va, mais quand ils y en a plusieurs ....

		$nomsite = new Variable('nomsite');
		$emailcontact = new Variable('emailcontact');
		$emailfrom = new Variable('emailcontact');

		$message = new Message('attention_auvergnat');
		$messagedesc = new Messagedesc($message->id);

		Mail::envoyer(
			'admin', $emailcontact->valeur,
			$nomsite->valeur, $emailfrom->valeur,
			$messagedesc->titre,
			$messagedesc->description,
			$messagedesc->descriptiontext
		);
}
    • si action=modifierlivraison :
      • tentative de modifier une adresse de livraison
      • si l'adresse de livraison a été modifiée, appel du point d'entrée apres_modifierlivraison qui prend en premier paramètre (objet adresse) l'adresse de livraison qui vient d'être modifiée (passée en référence)
exemple :

function apres_modifierlivraison($adresse)
{
	if($adresse->pays != 64) // si l'adresse n'est pas en France
	{
		redirige(urlfond('recommandations')); //on redirige le client vers une page de recommandations
	}
}
  • appel du point d'entrée pre pour les fonctions à exécuter avant ouverture du template
  • chargement du fichier de traduction du site (si il existe)
  • chargement du template (squelette), la variable $res est remplie.
  • lecture des options du template, c'est à dire les #PARAM_FOND prévus par Thelia. (exemple : #PARAM_FOND_reset=1, #PARAM_FOND_panier=1...)
  • appel du point d'entrée varfond
exemple :

function varfond()
{
	global $res;
	//on cherche le #PARAM_FOND_membre_vip
	if (preg_match_all("/#PARAM_FOND_([a-zA-Z0-9_]+)[\s]*=[\s]*([0-9]*)[\s]*/", $res, $matches, PREG_SET_ORDER))
	{
		foreach($matches as $match) 
		{
			if(strtolower($match[1])=='membre_vip')
			{
				$membre_vip = $match[2];
				$res = str_replace($match[0], , $res);  
			}
		}
	}
	//si la page demande $membre_vip = 1 et que le membre n'est pas vip, on le redirige.
	if(!empty($membre_vip) && $membre_vip==1 && empty($_SESSION['vip']))
	{
		redirige(urlfond('erreur_vip'));
	}
}
  • si #PARAM_FOND_securise vaut 1 et qu'aucun client n'est connecté, redirection vers la page'connexion
  • si #PARAM_FOND_transport vaut 1 et qu'aucun transport n'est choisi, redirection vers la page adresse
  • si #PARAM_FOND_panier vaut 1 et que le panier est vide, redirection vers la page index
  • appel du point d'entrée inclusion pour les fonctions à exécuter avant les inclusions
  • substitution des #INCLURE page.htm
  • appel du point d'entrée action. Ce point d'entrée est le point qui permet de récupérer le squelette complet de la page avant le calcul des boucles
exemple :

function action()
{
	global $res;
	
	if(!empty($_SESSION['vip']) && $_SESSION['vip']===1)
	{
		$res = str_replace("#MEMBRE_VIP", 1, $res);
	}
	else
	{
		$res = str_replace("#MEMBRE_VIP", 0, $res);
	}
}
  • calcul des boucles
  • appel du point d'entrée analyse
  • application de filtres
  • substitution des #HEADER{}
  • appel du point d'entrée post
  • envoi de la page parsée par Thelia au navigateur, simplement avec
echo $res;
  • appel du point d'entrée apres
  • si #PARAM_FOND_reset vaut 1 la comme est vidée, ainsi que le panier et le code promo en cours.