Modifications d'éléments existants

Dans mon précédent article numéro 880, comment j'ai rajouté un bloc statique aide-mémoire dans la partie édition Joomla content de l'administrateur, je vous ai proposé comment rajouter une petite aide mémoire de vos commandes personnalisées de vos plugins.

J'ai refait un équivalent de la solution à cette problématique, en rendant modulable l'ensemble de ce que je vous avais déjà proposé dans l'article précédemment cité.

Quoi de neuf ?

Dans cette nouvelle méthode de faire, j'ai réalisé le stockage de l'ensemble de mes informations dans un simple fichier externe au format XML de chacun des plugins que je développe, ainsi qu'un petit élément qui vous permet de lire ces fichiers XML.

Ainsi, si vous souhaitez rajouter des éléments, il vous suffit simplement d'éditer ce fichier XML de votre plugin dans un éditeur simple, afin de rajouter de nouvelles données.

Modifications à apporter

Pour mettre en place ce système, j'ai dû apporter quelques modifications aux dichiers de base de joomla.

Après avoir effectué un héritage de votre Fichier edit.php de administrator->com_content->edit, j'ai simplement rajouter à la suite de la ligne 75, le code suivant :

<?php include('explications.php'); ?>

De cette manière, si je veux modifier des choses particulières dans ma nouvelle modification, il ne suffit pas d'aller rechercher et bidouiller le fichier d'origine, les données se trouve dans un fichier externe explication.php. C'est un choix personnel mis je prèfère. Un moyen simple, à mon avis, de se retrouver plus facilement.

Désormais, l'ensemble des modifications que je vais apporter seront incluses dans ce nouveau fichier explications.php

Fonctionnement de ce nouveau fichier

Comme beaucoup d'informaticiens, je suis très fainéant. Ainsi, dans ce fichier, je vais aller scanner l'ensemble des noms de fichiers qui portent la le sous chaine SEOExplication dans les noms de fichiers au format XML, qui seront disséminés dans l'ensemble du sous répertoire administrator.

Ainsi, mon petit outil va rechercher l'ensemble des explications contenues dans les sous répertoires de mes modules ainsi que de mes plugins que j'ai développé. Nous retrouverons ici l'ensemble de la doc de l'ensemble de mes développements.

Fonctionnement générique

De manière à ce que ce fonctionnement s'applique à l'ensemble de mes développements, je me suis fixé une norme XML afin de pouvoir faire en sorte que ensemble de mes documentations de mes plugins (ou de mes modules) soit tout identiques. Le format de mon fichier XML et le suivant et porte toujours un nom qui va contenir la chaîne de caractères SEBExplication, avec comme extension de fichiers XML. Ce sont les deux conditions pour que le fichier soit détecté par mon système soit reconnu comme un fichier d'aide.

Exemple d'un fichier XML

<SEBexplication>
	<nom>SEOExplication</nom>
	<tag>{ici mon tag}</tag>
	<explications>Ce tag permet de ...</explications>
</SEBexplication>

Les modifications à apporter.

Dans un premier temps, vous devez créer le fichier explications.php et le placer dans le dossier administrateur template Isis -> HTML -> com_content -> article.

Désormais que ce fichier est créé, vous devez le faire appeler par le fichier edit que vous aurez préalablement hérité, et qui se trouvera dans le répertoire, après héritage, administrator->template->Isis->HTML->com_content->article edit.php en rajoutant ligne 76 :

<?php include('explications.php'); ?>

Enfin, vous devez corriger ou modifier le fichier CSS de la template d'administration de Joomla, je vous donne ce que moi j'ai rajouté mais à vous d'y faire votre propre style de cet outil :

.seb-admin-explications {
  border: 2px solid red;
  padding: 1%;
  border-radius: 5px;
  background-color: lightyellow;
}

.seb-admin-explications .nom {
  text-align: center;
  font-weight: bold;
}

.seb-admin-explications .tag {
  float: left;
  margin-right: 2%;
  color: blue;
  font-weight: bold;
}
Add a comment

Aujourd'hui, nous allons regarder la dérivation que l'on appelle aussi override en anglais voire surcharge en français bien de chez nous.

Nous allons surcharger un fichier d'affichage des champs de type répétables (repeatables) afin de pouvoir appliquer à chacun des éléments répérés, un style particulier. Nous allons alors créer une classe par champs.

J'ai déjà parlé de la surcharge dans l'un de mes articles mais nous allons y revenir rapidement. Le principe de la surcharge est de prendre un fichier d'origine de Joomla dans notre cas, de modifier, afin d'en apporter des modifications ou des ajouts particuliers, et me donner en pâture à Joomla.
J'en ai aussi déjà parlé, pour opérer à cette surcharge, vous pouvez surcharger votre fichier directement à partir de l'interface de Joomla dans le menu template -> sélectionner votre template -> cliquez dans l'onglet "Créer des substitutions", sélectionnez votre élément répétable dans la colonne plugin en sélectionnant le sous-égaiement field. Vous trouverez ainsi un élément qui s'appelle répeatable en anglais, cliquez dessus, le processus de surcharge se met en place.
AVGBrowser C6E2NIXPEs
Lorsque Joomla vous a confirmé que la substitution était bien créé, rendez-vous dans votre répertoire de votre template, et éditer ainsi ce nouveau fichier se trouvant théoriquement dans le répertoire de votre template, dans le dossier HTML. Vous trouverez ainsi un sous répertoire [votre template]/html/plg_fields_repeatable.
explorer JkjKEFiVtR
Ouvrez ce dossier et éditer ainsi le fichier que vous avez surchargé dont le nom est repeatable.php dans votre éditeur de texte favoris. Si vous êtes en ligne, et que vous avez installé Phoca Commander dans votre Joomla, vous pouvez effectuer cette manipulation directement avec une option d'édition de ce composant.
Comme je vous donne l'intégralité du fichier que j'ai modifié, il vous suffit de tous sélectionner et de remplacer dans ce nouveau fichier que vous avez créé.
<?php
/**
 * @package     Joomla.Plugin
 * @subpackage  Fields.Repeatable
 *
 * @copyright   (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$fieldValue = $field->value;

if ($fieldValue === '')
{
	return;
}

// Get the values
$fieldValues = json_decode($fieldValue, true);

if (empty($fieldValues))
{
	return;
}

$html = '<ul>';

foreach ($fieldValues as $value)
{
	$html .= '<li>' . implode(', ', $value) . '</li>';
}

$html .= '</ul>';

echo $html;
Add a comment
Aujourd'hui, dans cet article, je vous partage un besoin tout à fait personnel dans le cadre de mon activité professionnelle.
N'ayant pas une mémoire d'éléphant, à chaque fois que je crée un article dans mon Joomla professionnel, je dois en avertir certains collègues (une sorte de worflow oral). Or jusque maintenant, il y a eud es oublis.
C'est la raison pour laquelle, en modifiant la template Isis, je vous propose de rajouter un message personnel, à l'issu de l'enregistrement de votre article, en rajoutant un petit texte à l'endroit où Joomla vous affiche "article enregistré."
firefox ZCpBConmUi
 
Cette modification que je vous propose, s'effectue en deux grandes étapes.

Modification de la template de base.

Dans cet exemple, je n'ai pas réussi à faire un héritage du fichier dans lequel je dois apporter mes modifications. Cela ne me pose aucunement problème, dans la mesure où le Joomla 3 est là pour perdurer. Dans le fichier administrator/templates/isis/html/layouts/joomla/system/message.php, je me suis rendu sur la ligne 24 et dans un premier temps, je vais simplement dupliquer la ligne. Dans la copie d'écran ci dessous, vous pouvez voir que mon extension de mon outil de versionning vous affiche avec un petit rectangle vertical Orange la nouvelle ligne créée.
notepad JdB5K6WKmk En effet, dans la mesure où je souhaite rajouter un message à celui existant, je me suis largement inspiré de cette ligne 24. J'ai cependant simplement rajouté dans la classe une classe personnalisée pour mon message.
Dans mon div, j'ai codé en dur mon message. Je n'ai pas l'intention de créer de variables spécifiques, mon but n'est pas de faire du propre mais du fonctionnel dans ce cas. Allons droit au but même si cela n'est pas très propre.
J'ai donc codé en dur le message que je souhaite afficher point dans la mesure où le seul administrateur c'est, c'est le développeur (enfin c'est moi !). Il n'y a pas de gros problèmes à mettre une information en dur. La seule chose que je fais, c'est que je note dans les notes des administrateurs de Joomla toutes les modifications que j'ai effectuées au fil du projet, de manière à retrouver facilement où, dans quels fichiers ces dernières ont été faites.
Dans ma division (mon <div>), j'ai donc ajouté une classe et mon message texte.

Styliser mon message

Dans un deuxième temps, je devrais me rendre dans le fichier CSS de ma template d'administration, afin de déclarer ce nouveau style et de lui affecter un truc sexy. Le fichier message.php modifié ressemble donc désormais au fichier suivant
 
<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  Template.Isis
 *
 * @copyright   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$msgList = $displayData['msgList'];

$alert = array('error' => 'alert-error', 'warning' => '', 'notice' => 'alert-info', 'message' => 'alert-success');
?>
<div id="system-message-container">
	<?php if (is_array($msgList) && $msgList) : ?>
		<?php foreach ($msgList as $type => $msgs) : ?>
			<div class="alert <?php echo isset($alert[$type]) ? $alert[$type] : 'alert-' . $type; ?>">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<?php if (!empty($msgs)) : ?>
					<h4 class="alert-heading"><?php echo JText::_($type); ?></h4>
					<?php foreach ($msgs as $msg) : ?>
						<div class="alert-message"><?php echo $msg; ?></div>
						<div class="alert-message message-matso">Ne pas oublier de prévenir la cellule matso</div>
					<?php endforeach; ?>
				<?php endif; ?>
			</div>
		<?php endforeach; ?>
		
	<?php endif; ?>
	
</div>
Add a comment

Bien qu'à avoir déjà contacté le développeur pour la problématique que je vais vous évoquer ici, je n'ai malheureusement eu aucune réponse de sa part. Italien, peut-être ne savait-il pas lire les langues (fançais et anglais) dans lesquelles je me suis exprimé, c'est la raison pour laquelle je me suis attaqué ce matin à de la rétro engineering de ce bel outil Big File Uploader afin de regarder comment son code fonctionne pour pouvoir modifier ce que je devais faire.

Un petit rappel de ma problématique.

 Afin de pouvoir mettre en ligne des gros fichiers très volumineux, j'utilise la version gratuite du composant Big File Uploader édité par Prisma net. Deux versions de cet outil existent :
  • l'une en version gratuite, celle que j'utilise,
  • l'autre en version Pro dont je n'ai pas les moyens de m'acheter ! (mais surtout dont je n'ai pas l'utilité)

Enfin, la version gratuite répond surtout tout à fait à mes attentes. Cette version gratuite permet de mettre en ligne sur votre serveur de gros fichiers, mais le chemin de cette destination de ce répertoire de stockage, codé en dur dans le code, ne correspond pas du tout à l'architecture que j'ai mise en place pour stocker mes fichiers. Cette architecture m'est plus ou moins imposée par une organisation fonctionnelle de notre environnement de travail.

L'idée est donc de pouvoir spécifier un nouveau répertoire de destination qui se trouvera d'ailleurs dans un sous répertoire bien spécifique. Actuellement, le code de Big File Uploader définit un dossier dans le répertoire image de Joomla. Mais pourquoi diable ce dossier-ci ?

 Je n'aime pas coder en dur ce genre de données, surtout si les "oeuvres" sont destinées à être diffusées. Ce n'est qu'un point de vue personnel (mais surtout professionnel) des choses. Aller je ferme cette parenthèse bien triste.
 
Après avoir analysé le code du composant sous licence Licence GNU GPL, étape dont je vous ferai grâce, j'ai découvert effectivement que des informations étaient donc stockées en dur dans le code. Ces informations sont placées à trois endroits différents, dans deux fichiers qui permet de faire l'upload de vos fichiers sur le serveur :
- le fichier upload.php,
- Le fichier uploadfile.php
 
Dans un premier fichier, celui que vous retrouverez dans le dossier "[dossier Joomla]/components/com_bigfileuploader/models, vous retrouverez sur la ligne 30, la variable targetir.
private function getTempPath($idFile){
  return JPATH_SITE . DIRECTORY_SEPARATOR . "__DOCUMENTS__" . DIRECTORY_SEPARATOR . "fileuploaded" . DIRECTORY_SEPARATOR ;
}
Dans le deuxieme fichier, vous retrouverez à la ligne 80 le retour de la fonction getFilePath, le nom du répertoire dans lequel il faut modifier le chemin. c'est sur la ligne return.
private function getFilePath($nomeFile=''){
   //return JPATH_ADMINISTRATOR.DIRECTORY_SEPARATOR."components".DIRECTORY_SEPARATOR."com_bigfileuploader".DIRECTORY_SEPARATOR."uploadedfile".DIRECTORY_SEPARATOR.$nomeFile;
   return JPATH_SITE . DIRECTORY_SEPARATOR . "__DOCUMENTS__" . DIRECTORY_SEPARATOR . "fileuploaded" . DIRECTORY_SEPARATOR . $nomeFile;
}
Dans ce même fichier, à la ligne 84, dans la fonction qui retourne le chemin temporaire, modifier il y a aussi votre chemin de positionnement de votre dossier dans lequel vous souhaitez que le fichier destination s'insère.
private function getTempPath($idFile){
//return JPATH_ADMINISTRATOR.DIRECTORY_SEPARATOR."components".DIECCTORY_SEPARATOR."com_bigfileuploader".DIRECTORY_SEPARATOR."uploadedfile";
return JPATH_SITE . DIRECTORY_SEPARATOR . "__DOCUMENTS__" . DIRECTORY_SEPARATOR . "fileuploaded" . DIRECTORY_SEPARATOR ;
}
 Il suffit là aussi de donner le même chemin que celui que vous avez déjà changé sur les deux lignes précédentes. Bien entendu, il serait fort intéressant de remodifier l'ensemble du code pour que ces informations ne se trouvent qu'à un seul et même endroit, mais peut-être est-ce une volonté spécifique du développeur.
 
Voilà nous avons donc désormais spécifié le nouveau dossier cible dans lequel les fichiers seront enregistrés avec ce beau composant italien.
Add a comment

Mon Github

slhuilli1's GitHub repositories