Tout savoir pour devenir un pro de PluXml, mais pas seulement...

Construire un plugin avec theCrock


Rédigé par gccyrillus le Aucun commentairee

Dans le forum de PluXml , un utilisateur connaissant bien le CMS, à demander un peu d'aide pour construire un plugin pour ajouter un champ aux articles, afin de publier des dates événementielles. Il a tenter theCrock pour se lancer dans la création d'un plugin, sans succès.

Des plugins proche de l'idée que l'on peut s'en faire existent, KzChamPlus et plnCalendrier par exemples.

Mais aucun des plugins disponibles ne convenait, l'un prend un temps pour apprendre à s'en servir et l'autre ne correspondait pas plus au besoin.

Bien entendu, le forum lui à répondu et deux plugins ont vu le jour : kzEvents de Bazooka07 et un exemple de plugin produit avec le "chaudron à plugins" : addEvents. C'est ce second plugin que l'on va décortiquer un peu de son squelette et regarder comment on peut commencer à le construire.

Kamea, l'auteur du sujet et auteur de thèmes ex: équinoxe à tenté de s'aider du chaudron à plugins pour creer son plugin , sans succès.

Autopsie

A l'aide du chaudron à plugins, il est possible de passer rapidement à l'essentiel sans avoir à déboguer l'installation et l'activation du plugin.

Il vous est servi un zip avec en garniture:

  • Le fichier infos.xml obligatoire
  • Le répertoire du plugin obligatoire
  • Le fichier de CLASS du plugin obligatoire
  • Le corps des fonctions
  • Les hooks choisis, parmi + de 170 disséminé dans PluXml.
  • Des variables en exemples ou depuis le formulaire, initialisées avec des valeurs par défaut.
  • Une page de configuration
  • Une page d'administration
  • l’ébauche des fichiers d'aides et de langues
  • La compatibilité avec le plugin plxMyMultilingue
  • Un module d'aide à la configuration
  • Fichiers de style et JavaScript
  • Une arborescence de répertoire
  • verser un logo

... tout cela en quelques cliques au travers d'un formulaire pour se faire livrer un zip prêt à être décharger dans le répertoire plugins. Vous pouvez déjà l'activer.

Selon les options prises, vous aurez déjà accès aux page d'administration, configuration, statique , au wizard et la possibilité d'enregistrer vos variables de configurations ...

Par où commencer?

Faire une différence entre un hook et une fonction:

Le hook
sert à injecter du code dans le code de PluXml
La fonction
est une fonction interne au Plugin

Pour le moment il n'y a que le squelette et nous allons chercher ce qu'il lui manque pour l'étoffer.

Pour construire notre squelette,une fois la description faite et les pages choisies, il nous faut déterminer les hook dont nous aurons besoins pour entrer dans le code de PluXml. Le formulaire les regroupes par famille et emplacement.

Les hooks nécessaires aux options choisies seront intégrées et si ce hook vous est aussi utile, vous pouvez y ajouter votre propre code.

Vous pouvez aussi ajouter vos propre fonctions pour aérer et faciliter le maintient de votre code.

Le premier hook que l'on va rechercher est celui qui nous permet de s'accrocher à la page d’édition des articles.

Vous trouverez leur liste dans la doc, il peuvent être sélectionnés dans le formulaire.

Rassurez-vous, les noms des hook sont plutôt éloquent et on en trouve deux facilement :

  1. AdminArticleSidebar
  2. AdminArticleTop

En les recherchant dans le fichier /core/admin/article.php on les trouve dans une zone de texte de la page. On ne peut donc y injecter que du texte , pour cela on injecte une balise PHP fermante ?> puis une balise PHP ouvrante <?php . entre ces deux balise, nous pouvons maintenant injecter du texte et du code qui ne sera pas interprété dans le plugin, mais dans le code de la page article.php.

Prenons le Hook :

		/** 
			* Méthode AdminArticleTop
			* 
			* Descrition	:
			* @author		: TheCrok
			* 
			**/
			public function AdminArticleTop() {
			// ici vos scripts
		}

Et en insérant dans ce hook:

?><label>label</label><input><?php

Ce code affichera dans la page d’édition d'un article : , au dessus du champ titre.

Bon, on à écrit une seule ligne de HTML dans notre squelette et on à déjà un champ supplémentaire qui s'affiche, c'est encourageant

C'est parti.

Maintenant qu'un nouveau champ s'affiche, il nous faut mieux le définir et sauvegarder ses données, c'est une date que l'on veut sauvegarder

Comme nous avons une page de configuration, vous verrez que dans le code de celle-ci, une fonction interne à PluXml pour créer des inputs, nous allons l'utilisé, en injectant du code PHP.

?><label for="id_dateEvent">Date Événement :</label><?php
			echo '<?php
			plxUtils::printInput('dateEvent', 'valeur'  , 'date'); ?>';
			?>
			<?php
		

En remplaçant le code précédent par celui-ci, on affiche maintenant un label avec un input de type date, comme demandé dans le troisième paramètre de la fonction printInput(().

		/** 
			* Méthode AdminArticleTop
			* 
			* Descrition	:
			* @author		: TheCrok
			* 
			**/
			public function AdminArticleTop() {
			?><label for="id_dateEvent">Date Événement :</label><?php
			echo '<?php
			plxUtils::printInput('dateEvent', 'valeur'  , 'date'); ?>';
			?>
			<?php
		}

Sauvegarder la date

Chaque plugin est capable d'enregistrer pour lui seul des paramètres, ce que fait la page de configuration, Nous pouvons donc simplement en reprendre et adapter la méthode sans oublier que nous injecteront le code dans PluXml.

Pour cela, il va falloir rendre les fonctionnalité de lecture et écriture du plugin accessible la page d’édition d'article dans l'administration.

Et pour reduire l'appel au plugin, on le case dans une variable:
			$plug = $plxAdmin->plxPlugins->getInstance(''.basename(__DIR__).'');

Il nous faut maintenant une variable pour stocker notre date. Si nous n'avons pas de date, la variable sera vide, mais elle doit être initialiser.

Cette variable doit aussi être relié à l'article. Dans la page d'édition, la variable $artId nous donne l'identifiant de l'article. Nous utiliseront le même identifiant comme nom de paramètre et stockeront dans la page la valeur qu'il contient dans $dateEvent.

Ils nous reste maintenant à tester si un paramètre au nom de l'identifiant de l'article existe et si il contient quelque chose. si il n'y a rien, on gardera cette variable vide

$dateEvent = $plug->getParam($artId)	== '' ? '' : $plug->getParam($artId);

finaliser la fonction de lecture/écriture.

		/** 
				* Méthode AdminArticleTop
				* 
				* Descrition	:
				* @author		: TheCrok
				* 
				**/
				public function AdminArticleTop() {
				?><label for="id_dateEvent">Date Événement :</label><?php
				echo '<?php
				$plug = $plxAdmin->plxPlugins->getInstance(''.basename(__DIR__).'');
				$dateEvent = $plug->getParam($artId)	== '' ? '' : $plug->getParam($artId); 
				plxUtils::printInput('dateEvent', $dateEvent  , 'date'); ?>';
				?>
				<?php
			}

Ca y est, nous avons un champ supplémentaire fonctionnel qui affiche et enregistre une date si il y en a une.

Lire et utiliser cette date sur le site

Dans les données du des paramètres du plugin il y a des identifiants d'article, et les articles affichés coté visiteur.

Le pont entre les deux est possible

,

Coté site, PluXml fonctionne selon plusieurs modes

  1. home
  2. article
  3. categorie
  4. static
  5. tags
  6. archives
  7. erreur

Il sera possible de filtrer selon le type de page demandée et afficher en conséquences nos infos.Nous savons si un ou des articles sont affichés.

Quels hooks?

quels sont les hooks commun au traitement des articles disponibles sur lesquels on pourrait traiter ou signaler cette date évènementielle?

  1. plxMotorParseArticle
  2. plxShowPageTitle *
  3. plxShowMeta *
  4. plxShowArtFeed *
  5. plxShowLastArtList
  6. SitemapArticles
  7. ThemeEndHead
  8. ThemeEndBody
  9. ...

* Hooks acceptant une valeur de retour permettant d’interrompre l’exécution du code suivant l’appel du hook.

L'idée est pour le moment d'accroché notre date au contenu d'un article, on va s’intéresser aux hook dans plxMotor .

plxMotorParseArticle semble être le seul qui va nous intéresser

création du hook plxMotorParseArticle

Regardons où se trouve ce hook dans le code du fichier /core/lib/class.plx.motor.php.

Il se trouve dans la fonction parseArticle($filename) et à l'endroit de ce hook, nous avons toutes les informations et champs de l'article, nous pouvons les modifier ou les completer à partior de cet endroit.

Le hook dans notre squellette de plugin:

		/** 
					* Méthode plxMotorParseArticle
					* 
					* Descrition	:
					* @author		: TheCrok
					* 
					**/
					public function plxMotorParseArticle() {
					# code à executer
					
					}
				

Le hook se trouve dans une zone de code php, On peut preparer l'injection de code avec :

		echo '<?php
					// ici le code PHP à injecter 
				?>';

Cette fonction est aussi utilisé dans l'admin pour remplir les champs dans l'édition des articles, il ne faut pas intervenir dans ce contexte aux risques de modifier en boucle les contenus de l'article.

Une façon de verifier si l'on se trouve dans la page d'administration d'un article est d'écouter comment la page est demandée. Pour cela on teste si une variable particulière est transmise au navigateur par l'URL

Dans l'admin, cette variable est a et elle transmet l'identifiant de l'article. Si cette variable est absente, alors on est coté visiteur et l'on peut interagir avec le contenu de l'article.

On continue à alimenter notre hook

		/** 
					* Méthode plxMotorParseArticle
					* 
					* Descrition	:
					* @author		: TheCrok
					* 
					**/
					public function plxMotorParseArticle() {
					# code à executer
					echo '$lt;?php
					if(!isset($_GET['a'])) {
					// code à executer coté visiteur
					}
					?>';
					}
				

Pour accéder aux données du plugin, il faut à nouveau le rendre accessible depuis la fonction parseArticle($filename) où se trouve le hook pour tester si l'identifiant de l'article correspond à un paramètre.

$plug = $this->plxPlugins->getInstance(''.basename(__DIR__).'');
					if($plug->getParam($art['numero'])!='') {
					/*code à exécuter si le paramètre contient une date*/
				}

À l'endroit du hook, les infos et contenus de l'article se trouve dans le tableau $art, rien n'est encore affiché

Nous pouvons injecter du texte et du code HTML dans ces données, lesquelles choisir?

Regardons les champs de l'article

$art['filename']
Le nom du fichier ne pas modifier
$art['title']
Le titre de l'article modifiable
$art['allow_com']
Autorisation des commentaires : 0 ou 1 uniquement.modifiable
$art['template' ]
fichier template utiliser pour l'affichage modifiable
$art['chapo']
Contenu de chapomodifiable
$art['content']
contenu de content modifiable
$art['tags']
liste des tags en textemodifiable
$art['meta_description']
contenu de la balise meta description modifiable
$art['meta_keywords']
contenu de la balise meta keywords modifiable
$art['title_htmltag']
contenu de la balise title dans head modifiable
$art['thumbnail']
l'adresse d'une image modifiable
$art['thumbnail_title']
contenu de l'attribut title d'une image modifiable
$art['thumbnail_alt']
texte alternatif de l'image modifiable
$art['numero']
identifiant de l'article ne pas modifier
$art['author']
l'auteurmodifiable
$art['categorie']
liste des identifiants catégorie auxquelles est rattaché l'article.modifiable
$art['url']
la derniere partie de l'url de l'article (SEO Friendly)) ne pas modifier
$art['nb_com']
le nombre de commentaires modifiable

Nous avons toutes nos entrées pour modifier notre article et selon que le plugin est destiné à être partagé ou à votre usage, ces modifications seront le plus sobres possible ou raccords à votre site.

Rassurez-vous, jusqu'ici le plugin n'a physiquement modifié aucun de vos articles et ne le fera pas.

si vous avez des bogues ou des résultat étranges à l'affichage, ce ne sera qu'une erreur dans le code du plugin ou un mauvais choix de hook. Il suffit de la corriger, ce n'est souvent qu'une erreur de frappe dans le code et n'a aucune incidence sur vos données.

Poursuivons

Dans les modes de PluXml, il n'y en à qu'un qui affiche l'article en entier et seul, c'est le mode article.

Le plugin avec son option "page statique" qui s'affichera avec son propre mode interprété depuis sa variable de configuration Nom du paramètre dans l'url en comparaison à l'URl demandée.

Cela fait deux modes que nous pouvons potentiellement filtrer pour differencier l'affichage des contenus.

* Il est suffisant de placé une icone dans ou à coté du titre d'un article au fil des pages.

* La page statique injectée par le plugin peut, quant à elle, afficher un bandeau aux articles avec la date bien en évidence.

Ce ne sont que des choix pour l'exemple, il n'y a à l'origine de la demande d'aide sur le forum, ni cahier des charges ni scénari visuels et de navigation.

Complétons notre hook avec l'ajout d'une icône au titre, seulement si notre article est lié à une date événementielle. Prenons l'icône du plugin pour l'exemple at affichons la devant le texte du titre.

$art['title'] = ' ' . $art['title'];

On remarque qu'a ce stade, les données extraite des articles ne sont plus nettoyées et qu'elles peuvent recevoir du code HTML, il faudra être attentif aux balises ajoutées et s'assurer qu'elles sont bien écrites, refermées et qu'elle ne produisent pas de code HTML invalde, au risque de perturbée l'affichage.

Notre hook devient:

		/** 
		* Méthode plxMotorParseArticle
		* 
		* Descrition	:
		* @author		: TheCrok
		* 
		**/
		public function plxMotorParseArticle() {
		# code à executer
		echo '$lt;?php
		if(!isset($_GET['a'])) {
			$art['title'] = '<img src="https://pluxopolis.net/'.PLX_PLUGINS.basename(__DIR__).'/icon.png"> ' . $art['title'];
		}
		?>';
		}
	

Les champs d'article, indiqués précedemment, vous montrent lesquels sont modifiables.

Vous pouvez aisaiment utiliser le champ $art['thumbnail'] pour afficher l'affiche de votre évément ou ajouter un lien devant $art['chapo'] ou $art['content'] pour mettre en téléchargement un programme ou plaquette PDF de votre événement.

Ensuite ?

Le reste du dévellopement de votre plugin suivra le même principe.

Quelle fonction ou modification à apporter ?

  • recherche des hooks qui se trouve aux endroits propices pour la ou les modification dont on a besoins.
  • Y a t-il des données à modifier ou fonction à ajouter.
  • Faut-il injecter du code ou alimenter le plugin?
  • Cette modification est t-elle configurable à partir d'un paramètre du plugin.
  • Est ce coté visiteur, administration ou les deux ?
  • Est ce en fonction d'un mode de PluXml ?
  • Y-a t-il des données ou paramètres à mettre à jour?
  • etc ...

Vous pouvez retrouver ce plugin sur la page plugins.html de pluxopolis et suivre les modifications et ajouts de fonctionnalité en l'autopsiant au fil de ses versions (0.1 à 2.3 au moment de l'écriture de cet article.

Vous pouvez commenter ici ou depuis le sujet du forum. Le forum de PluXml est aussi ouvert pour vous aider à develloper votre propre plugin.

DClassé dans : Plugin ,Mots clés : aucun

A propos de l'auteur, gccyrillus:

Gccyrillus : Amoureux de PluXml et codeur bricoleur à mes heures perdues.


Écrire un commentaire

      ! if(spam)=> oubliettes

Top