Sébastien LHUILLIER

Sébastien LHUILLIER

Pour certaines données d'un module, il peut être nécessaire de savoir si l'utilisateur courant est administrateur ou non.

Pour cela, inutile de tester l'appartenance au groupe admin de l'utilisateur, la factury user donne la réponse !

$user = JFactory::getUser();
if ($user->guest == 0)
{
   echo "Vous êtes administrateur";
}
else
{
   echo "Vous êtes simple utilisateur";
}
jeudi, 06 janvier 2022 17:30

Joomla sur un serveur Portable

Si vous utilisez un Joomla sur un serveur Web portable de type Uwamp, lorsque vous déplacez le serveur d'une machine à une autre, afin de pouvoir continuer à installer des composants, il ne faut pas oublier de corriger sur la ligne 61 du fichier configuration.php situé dans le dossier Joomla, la valeur de la variable $tmp_path sans quoi les installations des modules ou composants que vous alliez télécharger sur la GED notamment seront ininstallables puisque Joomla recherchera le répertoire par son chemin absolu qui, s'il n'est pas placé a même endroit, sera introuvable.

vendredi, 31 décembre 2021 11:04

Génération de votre formulaire de saisie

Suite à mon article sur la génération de jeux de données avec Google Sheets, je souhaitais aller plus loin en générant, une fois le fichier Sheets prêt ( et ceci à son importance) un formulaire de saisie.

Pourquoi ceci à son importance ? Car à en suivre les tutos de Google, c'est dans l'autre sens qu'il faut faire : déja créer son Google Forms puis ensuite l'associer à une Google Sheets. Ici la problématique est à l'envers : nous avons une feuille de données et nous voulons nous appuyer dessus pour former un formulaire.

A priori, d'après mes recherches, Google n'a pas envisagé cet ordre. En revanche, Jivrus Technologie y a pensé et à mi s en place un petit outil : Form Builder for Sheets que vous pouvez retrouver à l'adresse https://workspace.google.com/marketplace/app/form_builder_for_sheets/463417060578 pour procéder à son installation dans votre espace Google Sheets.


Maintenant que notre extension est installée, nous retrouvons cette extension dans les feuilles Google Sheets :

Nous devons maintenant préparer notre feuille afin de connaitre le contenu des colonnes. Ainsi, sur la première ligne, nous allons mettre nos entêtes de colonnes.


Maintenant que notre feuille de calcul, qui ne va servir que d'espace de stockage de vos informations, est prête, nous allons désormais passer à la création du formulaire. Assurez-vous d'être connecté à votre compte Google et rendez vous sur la page https://workspace.google.com/marketplace/app/form_builder_for_sheets/463417060578 et procédez à l'ibnstallation de cette extension. Elle s'intégrera dans VOTRE profil Google Sheets.
Désormais nous allons précéder à la création du formulaire à partir de votre feille de caclul, en vous rendant dans le menu Extension->Form builder for Sheets. (ATTENTION, il ne faut pas utiliser le menu Outil->Créer un formulaire qui lui ne se base pas sur votre feuille de données en cours mais céer un formulaire vide).


Sélectionnez votre feuille et cliquer pour l'import de la sélection


Vous vous retrouvez avec votre formulaire prêt à l'emploi. Deux solutions s'offrent désormais à vous :

  • Intégrer votre formulaire à votre propre page web
  • Donner le lien direct aux personnes susceptibles de renseigner votre formulaire

 

Pour obtenir le lien vers votre formulaire, dans le coin haut droit, cliquer sur les trois points puis sélectionner "Obtenir le lien". remplissez une premiere fois votre formulaire puis cliquez sur Obtenir le lien. Ce dernié est collé dans votre presse-papier.

Obtenir le lien

lundi, 27 décembre 2021 12:23

Instagram : les dernieres images postées

Dans cet article, j'aborde un point que je recherchais depuis très longtemps, à savoir comment utiliser des API Instagram. Alors non, nous n'allons pas comme de manière classique regarder le fonctionnement des API, mais je vais plus vous montrer comment extraire des données d'un flux de données  fourni par Instagram lui-même. j'ai déjà écrit des articles sur ce système mais celui-ci aborder la chose de manière différente.

Comme vous pouvez donc déjà vous imaginer, ce fût de données ne renvoie pas l'intégralité des informations concernant un compte Instagram, mais cela ressemble plus à ce que fournit un flux RSS, à savoir un certain nombre d'informations récentes sur un compte. L'information ci-dessus est importante, vous ne pourrez pas faire de recherche particulière sur des données anciennes.
 
Voyons le fonctionnement. Dans le code que je fournis, le principe est le suivant : Je propose à utilisateur de fournir le nom d'un compte au travers d'un champ de saisie, ainsi qu'un bouton Valider qui va poster votre recherche.
Au moment de votre poste, le programme va et récupérer le nom de l'utilisateur, de ce nom vous recherchez via le flux fourni par Instagram, flux dans lequel vous passez en paramètres le nom de l'utilisateur suivi de la chaîne "/?__a=1" sans les doubles côtes bien entendu, afin Instagram vous retourne un fou au format JSON de compte que vous avez sélectionné.
Ce fut json, je vous laisse le soin de regarder l'intégralité des informations qui peuvent vous intéresser. Dans mon cas et dans cet exemple, j'en récupère les derniers posts de types photos s'ils ont été postés par un utilisateur afin de les mettre de côté sur mon serveur. Je ne prends pas en compte les posts de type vidéo, bien que je puisse dans le programme les récupérer. D'ailleurs le code concernant les  est commenté, vous pourrez vous en inspirer.
Ce programme enregistrera donc dans un dossier qui porte le nom de l'utilisateur c'est-à-dire le nom du compte que vous avez sélectionné ou saisi dans le formulaire en début de page. Le dossier est créé et y seront stockés les dernières images postées par un utilisateur.
Dans cet exemple, vous trouverez une boucle de type foreach dans laquelle je récupère plusieurs types d'informations et lorsque je tombe sur une image, je l'enregistre sur le serveur. Vous pouvez à partir de ce code, non pas enregistrer mais afficher l'image dans le cadre du développement, par exemple, d'une galerie d'images issues d'instagram.
J'ai découpé le script en deux fichiers PHP, le premier dénommé index.php propose simplement à l'utilisateur un formulaire de saisie, dans lequel l'utilisateur pourra saisir le nom du compte qui l'interesse. Lorsque ce fichier php est posté au travers du bouton Valider c'est-à-dire au travers de ce script, un deuxième programme contenu dans le fichier dénommé étape 2. PHP va prendre le relais. Ce fichier va afficher un nouveau formulaire en rappelant le nom du compte que vous souhaitez traiter, ce fichier va vous donner un lien direct vers une page qui contiendra le flux JSON qui "portera" les données qui vous intéresse.
Ouvrez votre lien dans une nouvelle fenêtre, mon programme le fait simplement lorsque vous cliquez sur le lien donné, copiez via le bouton copier affiché dans cette nouvelle fenêtre, les données dans votre presse-papier, revenez sur le programme toujours dénommé étape 2.
instagrammm1
Collez désormais le contenu de votre presse-papier dans le cadre destiné à cet effet.
instagrammm2
Une fois le bouton Envoyer cliqué, les données se téléchargent dans le sous-répertoire qui portera le nom du compte que vous souhaitez suivre, avec l'ensemble des dernières photographies postées par ce compte en l'occurrence.
Comme je vous le disais, le flux fourni par Instagram ne vous propose que les 12 dernières publications du compte en question. De ce fait, vous ne pourrez pas récupérer plus de 12 photos à chaque poste. Toutefois, à partir de mon script, il vous sera possible d'automatiser la tâche au travers d'un cron si jamais vous souhaitez suivre un compte qui publie de manière très courante des photographies.
Comme le flux de contient pas plus de 10 photos, je vous laisse le soin de calculer la fréquence de lancement de votre cron pour récupérer l'intégralité des photos d'un compte qui publie régulièrement.
 

 <form method="POST" action="etape2.php">
	<?php
	if (isset($_POST["compte"]))
	{
	echo "Compte : ".$_POST["compte"];
	echo '<input type="text" name="compte" value="'.$_POST["compte"].'">'; 
	echo '<ol>
		<li>Cliquer sur <a href="https://www.instagram.com/'.$_POST["compte"].'/?__a=1" target=\"_blank\">ce lien</a> qui va ouvrir une nouvelle fenetre</li>
		<li>Cliquer sur le bouton copier et revenez ici</li>
		<li>Coller le contenu dans le cadree ci-dessous</li>
		<li>Valider en cliquant sur le bouton</li>
		</ol>';
	}
	?>
	
    <p>
        <label>Coller le JSON</label>
        <textarea name="json" rows="10" cols="30" required></textarea>
		
    </p>
 
    <input type="submit" name="submit" class="Save" />
</form>

<?php
 /**
 * Code de départ fourni par Truong SA
 * https://gist.github.com/shrimp2t
 * */
if (isset($_POST["submit"]))
{
    echo "Nom : ".$_POST["compte"];
    // decode  le flux JSON dans un tableau d'objets
    $content = json_decode($_POST["json"]);

   // Récupère tous les derniers posts possibles
    $edges = $content->graphql->user->edge_owner_to_timeline_media->edges;
    @mkdir($_POST["compte"]); //@ pour ne pas renvoyer d'erreur si le dossier est déja créé
	

    // Boucle sur tous les derniers posts
    foreach ($edges as $edge)
    {
        // Récupérer UN post
        $node = $edge->node;
 
        // On récupère son shortcode
        $url = $node->shortcode;
 
        //On récupère son caption si présent 
$caption = @$node->edge_media_to_caption->edges[0]->node->text;
// On récupère le nombre de liKES
$likes = $node->edge_liked_by->count;
// On récupère le nombre total de commentaires
$comments = $node->edge_media_to_comment->count;
// On sauvegarde l'image
$image_path = "./".$_POST["compte"];
if (!is_null($node->display_url)) {
$image_path = $_POST["compte"]."/" . $url . ".png";
file_put_contents($image_path, file_get_contents($node->display_url));
}
}
echo "<p>Fini</p>";
}
?>

Dans cet article, je vous relate un test que j'ai fait ce 25 décembre sur la possibilité de mettre en place par des outils très simples fournis par le géant Google, de jeux de données diffusables.
Je ne vais pas jusqu'à qualifier ces jeux de données OpenSource, car je n'ai pas été jusqu'à lire les licences complètes de Google. Il est en effet fort possible qu'une fois les données saisies sur Google Sheets, ces dernières deviennent la propriété de Google. Je ferme cette parenthèse mais il faut avoir ceci en tête pour la suite de cet article

Quel est le but ?

Au travers de cet article, je souhaite simplement montrer comment il peut être super simple pour un néophyte en informatique, de mettre en place un jeu de données accessibles et réexploitables par d'autres sites web. Nous allons prendre comme fil rouge un jeu de données tout fait, pour ne pas avoir à resaisir les données, un jeu de données existante : la liste des "Morts pour la France" durant la deuxième guerre mondiale. Ce jeu de données étant en opendata, j'ai réintégré les données dans une feuille Google Sheet pour gagner du temps, mais j'aurais tres bien pu faire ma propre feuille Google Spreadsheet de l'ensemble des timbres de ma collection personnelle, l'ensemble des plats goutés à l'étranger,...

Petite parenthèse : l'import des données

Comme je viens de l'expliquer, j'utilise un extrait d'un jeu de données existant que vous pouvez retrouver sur l'OpenDataSoft https://public.opendatasoft.com/explore/dataset/morts-pour-la-france/export/?flg=fr
L'import ne sert juste, dans mon exemple, à ne pas avoir à resaisir des données, mais si vous utilisez cet article à des fins de construction de votre propre jeu de données, il vous faut créer un fichier Google Sheet vide et vous devez le remplir.
Mais nous sommes bien d'accord que la réutilisation de données dans cet exemple n'a pour but que de ne pas resaisir des données. J'obtiens, après import dans mon cas, ou  aprés création de votre jeu de données, un tableau de la sorte, avec vos colonnes à vous :

firefox VZ3htRuHws

 Voila, nous avons notre point de départ de ce tutoriel, un jeu de données. Je publierai ultérieurement un autre tutoriel pour fabriquer, toujours avec les outils de Google, un tutoriel expliquant comment fabriquer un formulaire de saisie permettant de saisir votre jeu de données, mais surtout de faire saisir par d'autres des données. 

Rendre accessible le jeu de données

Pour des raisons évidentes de sécurité, vos fichiers stockés dans Google Sheet/Google Drive ne sont accessibles qu'à vous seul. Or, notre but est bel est bien de rendre accessible le jeu de données à tous (attention, je parle bien du jeu de données, pas du fichier !). Pour ceci, il faut spécifier à Google que nous sommes d'accord pour le partage

 En retour, Google Spreadsheet vous retourne une URL d'accès au fichier.

URL acces

Notez que vous trouverez aussi ici, outre la possibilité de partager votre fichier avec les différents sharers proposés (GMail, Facebook et Twitter), un champs primordial pour ce tuto, celui placé juste au dessus des sharers. C'est ce lien que nous allons utiliser. Sélectionnez-le et copiez le dans votre presse papier ou dans un fichier texte de travail.

Sur cette copie d'écran, j'utilise le format de données CSV maisd'autres formats sont disponibles.comme le TSV, Les autres formats proposés ne permettent pas (facilement) une réexploitation des données comme nous voulons faire. Remarquez que le format choisi n'est en fait qu'un pramètre dans l'URL !

Maintenant, votre jeu de données est déjà prêt. Publiez le pour bien le rendre accessible ! Et partagez votre URL à celles et ceux qui le désirent. Un bémol dans cette méthode est que l'URL n'est pas personnalisable pour rendre partageable ou non le fichier.

Et si vous voulez vous assurer que ca marche, téléchargez mon fichier CSV  !

Désormais, vous pouvez utiliser Google form pour générer un formulaire de saisie

L'idée est de créer un élément d'un menu qui affiche tous les articles d'une catégorie, mais aussi ses sous éléments de cette "sous-catégorie". Pour afficher ces éléments, il faut appliquer sur le menu, une restriction particulière. En effet, au moment de la création du menu, il faut choisir un menu de type "blog de catégorie".

blog de actegorie

Ensuite, sélectionner la catégorie sur laquelle appliquer ce menu

Une fois cette sélection effectuée, il faut appliquer les options dans l'onglet catégorie

blog de actegorie2

Le contenu des articles est affiché, (je n'ai pas trouvé comment le masquer) mais un ptit coup de CSS là dessus permet de masquer le contenu de l'article

Vous venez d'installer l'outil de sauvegarde Akeeba backup et vous êtes très fier d'avoir lancé et exécuté votre première sauvegarde avec cet outil. Cependant, vous vous posez la question : mais où est donc sauvegarder mon fichier de sauvegarde ?

Comme dans la majorité des cas, vous ne faites pas forcément attention à la configuration de cet outil (je dis ça mais je suis exactement pareil), vous ne mémorisez pas l'endroit où le fichier de sauvegarde est stocké. Toutefois, lorsque vous lancez la configuration d'Akeeba Backup dans votre administration, vous remarquerez que vous avez cette configuration, laissée par défaut lors de la pré configuration de votre profil de sauvegarde.
1. Rendez-vous dans le menu composants Akeeba backup,
akeeba1
 
2. Sélectionnez l'icône configuration, dans le deuxième cadre dénommé Basic configuration,
akeeba2
3. Vous trouverez sur la première ligne output Directory. Répertoire de destination de votre sauvegarde :
akeeba3
vendredi, 17 décembre 2021 08:49

Comment construire une URL Joomla content

Pour accèder à un article Joomla content, il faut utiliser une URL codé de la sorte :

index.php?option=com_content&view=article&id=id_article

La composition de l'URL est donc :

  • index.php : le fichier "pivot" de tout site (le contrôleur en quelque sorte)
  • option : nom du composant vers lequel Joomla "redirige" (ou plutot nom du composant que Joomla va charger. Ici : Joomla content, donc com_content)
  • id_article : le numéro de l'article

S'il existe plusieurs templates, ou que des soucis d'assignations de modules subsistent, il est possible d'ajouter l'itemid du menu à l'URL

index.php?option=com_content&view=article&id=id_article&Itemid=item_id_du_menu

Voilà déjà quelques mois que j'ai appris à créer des modules pour Joomla, et je me rends compte que la création repose généralement sur une architecture très classique, du moins pour l'ensemble des modules que je amené à écrire.

Dans la mesure où j'ai dévié un ordinateur spécifiquement à la programmation, ce dernier tournant sur Windows, et la fainéantise légendaire d'un programmeur étant avéré, je viens d'écrire un script qui vous permet de générer en un clic, l'architecture d'un beau dur de votre CMS préféré.
 
Le principe, je vous ai détaillé sur une petite vidéo, vous permet de lancer un fichier BAT, ce dernier vous demandant le nom du Bluetooth ou été créé, et, dans le dossier courant dans lequel vous avez enregistré mon fichier BAT, va se créer l'architecture et l'organisation globale de votre module.
Une fois mon programme lancé sur votre machine, il ne vous reste plus ouvrir l'ensemble deux vos fichiers venant d'être générer, après bien entendu les avoir de place est dans le bon répertoire des modules de votre CMS préférée, afin de pouvoir commencer à programmer ce que bon vous semble.
Je suis entièrement, ce script est fait pour les feignants dont je fais parti.
Ce scripit est téléchargeable. Il doit porter l'extension BAT
PS : j'ai redécouvert qq bugs, corrections en cours
mercredi, 15 décembre 2021 06:40

Module de réinitialisation des statistiques

J''ai cherché partout comment réinitialiser les statistiques de consultation des articles Joomla Content et nul part j'ai trouvé de d'outil tout fait. La seule solution trouvée et simple pour tout informaticien est de lancer une requête SQL sur la base, remettant ainsi à jour les données. Mais quid pour  les non informaticiens ? Rien, noting, nada.... 

Alors allez vous me dire, quelle en est l'utilité ? Je travaille sur un projet depuis un an, projet pro, où je code et rempli un gros site Joomla, sur un serveur local. Une fois mon travail migré sur un serveur de prod, toutes les données statistiques ayant été elles aussi migrées, les statistiques de consultation l'ont aussi été et sont donc fausses. Elles doivent être réinitialisées.

Comme j'ai voulu faire un outil simple, pratique et destiné à un webmaster, pas de chichi sur l'interface graphique ni même le dialogue entre l'utilisateur et cet outil. Le fonctionnement est super rudimentaire mais super focntionnel, aussi voici comment l'utiliser (l'ordre à àson importance) : 

 

  1. Coté backoffice:
    1. Installer ce module dans Joomla
    2. Affecter votre module à un article spécifique 
    3. Activez le module
  2. Coté front office
    1. Connecté vous à l'article auquel le module est affecté
  3. Coté backoffice
    1. Désactivez le module

Sans cette dernière action, la réinitialisation des stat s'effecctuera à chaque connexion à l'article où le module a été créé. Il y aurait une autre manière de faire, c'est à dire créer un article de réinitialisation avec ce module et dont les droits (de l'article) ne seraient affectés qu'à l'administrateur. A vous de voir

 

Page 1 sur 41