exakat, static analysis for PHP (@exakat) #phptip #phptrick
On en apprend tous les jours...
<?php
dirname(__DIR__).'../a/b/c';
peut-être fait avec
dirname(__DIR__, 3).'a/b/c';
Merci TImo ! (merci Timoooo)
On en apprend tous les jours...
<?php
dirname(__DIR__).'../a/b/c';
peut-être fait avec
dirname(__DIR__, 3).'a/b/c';
Merci TImo ! (merci Timoooo)
Tiens... et si je faisais un bot pour poster une citation par jour tirée des passages de romans que j'ai sélectionnés et stockés su ma Kobo ?!
C'est par ces mots que j'ai commencé à galérer... comme quoi, il suffit d'une idée à la con pour se lancer dans tout un merdier pourtant parfaitement facultatif ...
Je veux qu'un BOT mastodon poste une citation de mes bookmarks de liseuse DONC il faut récupérer ces passages bookmarkés.
Donc, il faut trouver le fichier de base de donnée.
Puis il faut extraire les données intéressantes.
Puis utiliser ces données dans un BOT qui sera appelé une fois par jour.
En fouillant un peu, on trouve un fichier sqlite (JOIE) dont le chemin est .kobo/KoboReader.sqlite
Un passage par DBBrowser pour SQlite permet de jeter un oeil sur la structure des données.
Idéalement, il me faut deux informations: la citation et le titre du bouquin dont elle est extraite.
En fait les titres se trouvent dans la table content
et les annotations dans la table Bookmark
Je pourrais utiliser Calibre et chercher un moyen de faire un export complet de ces deux données uniquement. Pas sûr que ça marche. Ou alors faire un export via le DBexplorer pis me retaper le truc à chaque export...
En vieux programmeur qui bricole, je vois là un prétexte pour coder une petite appli en python qui se chargera de l'extraction.
Mon problème, c'est que je me sers des notes de la Kobo pour retenir des passages intéressants mais aussi, parfois, pour noter vite fait un mot de vocabulaire espagnol que je ne connaissais pas et dont je veux conserver la traduction. Mais ces mots de vocabulaire ne sont pas des citations: il faudrait donc les virer à la main à chaque fois. C'est chiant.
L'appli devra donc permettre de filtrer les citations avant de générer un fichier exploitable par le bot.
J'ai fait l'appli en question: elle permet donc de récupérer les données, filtrer en fonction de la longueur de la citation ou du fait qu'elle est ou pas accompagnée d'une note personnelle...
On peut formater les données selon plusieurs modèles (HTML, Json, Markdown, TXT brut, BOT) voire même créer son propre format (genre %title:«%quote» )
Rien d'extraordinaire ici: je fais un script qui parse le fichier obtenu à l'étape précédente, tire une citation au hasard et la poste sur le compte Masto du Bot.
Le point le plus intéressant du bouzin est plutôt la fonction servant à poster sur un compte mastodon:
define('TOKEN','letokendesécuritéquetuchopesdansmastodon');
define('MASTODON_URL','https://botsin.space/'); // Ici, il faut coller l'url de votre serveur mastodon
define('HEADER',"Citation du jour:");
function post2Mastodon($data=null){
if (!$data){return false;}
$headers = [
'Authorization: Bearer '. TOKEN
];
$data=[
'status'=> HEADER.$data,
'language'=>"fr",
'visibility' => 'public'
];
$ch_status = curl_init();
curl_setopt($ch_status, CURLOPT_URL, MASTODON_URL.'/api/v1/statuses');
curl_setopt($ch_status, CURLOPT_POST, 1);
curl_setopt($ch_status, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch_status, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch_status, CURLOPT_HTTPHEADER, $headers);
$output_status = json_decode(curl_exec($ch_status));
curl_close ($ch_status);
return $output_status;
}
Aller sur le compte mastodon en question, puis dans les préférences.
Cliquer sur «developpement» puis «Nouvelle application».
Remplir le formulaire simplissime puis valider. Cliquez ensuite sur le nom de votre application dans la nouvelle page et copiez votre jeton d’accès. C'est celui-ci qu'il faut coller dans le script PHP (dans la constante TOKEN)
Direction le panneau de config de votre hébergement, rubrique cronjob. Sur Cpanel c'est là :
Définissez la fréquence (pour moi une fois par jour) et l'heure (8:00).
Ensuite, il faut définir la commande qui va appeler le script du BOT: wget fera l'affaire...
wget -qO /dev/null http://xxxxxxxxxxx.xx/index.php
L'option -q pour quiet et -O /dev/null pour éviter d'avoir un fichier de sortie qui se crée à la racine.
Une fois tout ça terminé, j'ai bien un bot qui poste une citation à 8:00 tous les jours.
Bon, elles ne seront pas toujours bien formatées vu que la sélection de texte sur liseuse c'est un peu touchy... mais c'était plus pour apprendre à le faire qu'autre chose...
Le cadeau du jour: un script qui permet d'automatiser l'optimisation d'une image pour le ouaibe sans passer par une appli quelconque.
Tout le monde est d'accord pour affirmer qu'il est indispensable de minimiser le poids des pages web et que dans cette optique, le premier geste - après avoir viré les bibliothèques inutiles bien entendu - reste l'optimisation des images.
J'avais vu passer un article fort bien écrit sur ce sujet mais hélas, j'ai omis de le bookmarker et paf: le voilà perdu dans les méandres de mon historique sur un des ordinateurs que j'utilise.
Tout le monde est d'accord sur le principe mais souvent, c'est comme l'écriture de la doc ou les tests unitaires: on a la flemme de s'y coller...
L'idéal serait bien sûr que l'optimisation soit transparente et automatique... genre: tu te contentes de passer à la balise img l'URL de l'API avec celle de l'image et POF, tu as l'image en version optimisée.
Optipic est donc un script auquel on passe l'URL d'une image, le format souhaité, le niveau de qualité et -éventuellement - la largeur maximum pour obtenir en retour l'image transformée.
Le script renvoie directement l'image transformée avec le header adéquat et du coup, c'est transparent pour HTML/CSS.
Notez que l'image optimisée est sauvée dans le dossier rendered/ afin d'éviter une charge inutile: si une image a déjà été optimisée, le script la sert directement au lieu de la refaire à chaque fois.
Même si ce script est déjà à ce stade absolument fabuleux (si, si !), je me suis dit que les paramètres risquaient de se répéter et qu'il pouvait s'avérer fastidieux de retaper le tout à chaque fois. Par conséquent, j'ai ajouté la possibilité de créer des scripts d'optimisation - un peu comme dans scriptopic.
Ainsi, si vous placez un fichier PHP contenant les paramètres dans le dossier scripts/ , vous pouvez l'appeler via le paramètre $_GET script
:
Exemple: je cree scripts/webp.php et je mets dedans:
// webp 50%
$params=[
'format' =>'webp',
'quality' =>50,
'maxwidth' =>null
];
Puis je l'appelle en faisant : api.url/?script=webp&i=http:/image.url/pic.jpg
Pour le moment, il y a quatre scripts: jpg80,jpg70,avif,webp... à vous de créer les vôtres en fonction de vos besoins...
Ben j'ai fait un test dans ce blog pour voir avec mon image de titre LOL:
qui pèse 113 ko en jpg
Puis avec son optimisation via le script webp ci-dessus:
qui ne pèse plus que... 18 ko en webp 50%
Et ça juste en rajoutant https://api.warriordudimanche.net/optipic/?script=webp&i=
dans le chemin de l'image.
Si Optipic ne parvient pas à créer l'image, il crée une image d'erreur à la place, histoire de voir le souci quand même...
Ce comportement peut être débrayé avec la constante ERROR_PIC
ligne 29.
Comme pour toutes les api de ma page, le script est téléchargeable via le ?download : https://api.warriordudimanche.net/optipic/?download et testable au même endroit: https://api.warriordudimanche.net/optipic/?i=...
DEFAULT_FORMAT
ligne 28Au passage, ce script utilise une classe que j'avais codée pour scriptopic: pictools. Grâce à elle, le travail d'optimisation tient en
$picture=new pictool($params);
$picture->load($url);
if (!empty($params['maxwidth'])){
$picture->resize($params['maxwidth']);
}
$picture->save($generated_picture_path);
$picture->display();
Cadeau !
Hier, je me suis aperçu que le bookmarklet que j'avais fait pour trouver le flux RSS d'une chaîne youtube ne fonctionnait pas toujours 🤬: en effet, si l'URL de la chaîne n'est pas du type www.youtube.com/channel/xxxCHANNEL_IDxxx
ça ne fonctionne pas... Or, les chaînes peuvent être aussi sous une forme dans laquelle le channel_id n'apparaît pas.
Au lieu de laisser youtube me chier dans les bottes, je me suis dit que, si le channel_id n'est pas dans l'URL, il doit être planqué quelque part dans le html de la page.
En fouillant un peu, twingo bongo jannielongo bingo 🥳 J'ai trouvé ça en parsant avec (presque) la même regex que pour l'URL.
J'ai donc codé vite fait une «api» qui renvoie l'URL du flux RSS d'une chaîne Youtube dont on fournit l'adresse.
On peut l'utiliser avec le frontend minimaliste prévu, en faisant une requête GET ou via le bookmarklet qui va bien.
Le tout est bien entendu utilisable, autohébergeable et modifiable, comme d'habitude
Allez !
Il y a quelques jours, lassé de reprendre à zéro à chaque fois que je dois faire un truc avec GD sur PHP, je me suis dit que je pouvais faire une classe pour ça. Comme, exceptionnellement, j'avais un peu moins de deux heures de tranquillité, je m'y suis collé.
Au bout du compte, une fois la classe codée, il faut bien la tester...😬
C'est le problème des codeurs : ils ont du mal à arrêter de coder 🤩. Du coup, me voilà en route pour un script exploitant pictools.php... et ce qui aurait du prendre deux heures a pris plusieurs jours de papa codeur (petit rappel: 1 h de papa codeur = 7,2 heures de codeur normal en zone de guerre, au cours actuel 💣)
Bref, j'ai donc pondu une «api» avec un frontend permettant d'appliquer des transformations à une image à partir de son URL.
Donc, on fournit l'URL de l'image puis on ajoute des actions les unes à la suite des autres. Certaines n'ont pas besoin de paramètres (emboss, sepia etc) et d'autres si (contrast, resize etc)
Quand on clique sur un bouton action, on ajoute cette action à la liste avec, le cas échéant, l'input qui va bien pour les paramètres avec un placeholder de rappel.
Ainsi, on peut resize l'image à une taille précise ou à un pourcentage de la taille normale: tous les paramètres de coordonnées et de taille peuvent être précisés en pixels ou en pourcentages.
De plus, si on veut redimensionner l'image à une largeur en conservant le ratio automatiquement, il suffit de mettre -1 à la place de la hauteur: le script se démerdera tout seul.
La config ci-dessus donne le résultat ci-dessous:
Donc, scriptopic permet de retoucher une image automatiquement. OK.👍
Mais cette image est utilisable directement depuis son URL de génération: si on colle l'URL précisée dans le cadre résultat, ça fonctionne. Avec un peu d'habitude, on peut le faire en direct (genre pour une image d'en-tête...). Comme les images retouchées sont
sauvegardées avec un hash de l'url de requête, si on l'appelle à nouveau, elle ne sera plus générée mais simplement renvoyée (visible soulagement du serveur )
Comme des fois on a la flemme de faire une balise image, Scriptopic vous la donne directement: un double-clic et c'est copié prêt à coller...
Un truc rigolo, c'est que, comme pour Stamp, le front de scriptopic génère un bookmarklet en temps réel (c'est la deuxième ligne du cadre résultat): une fois satisfait de votre script, le bookmarklet généré permet de l'appliquer à l'image en cours: vous ouvrez l'image dans un onglet et clic-clac merci kodak.
Si vous voulez simplement envoyer l'image en cours pour travailler dessus, le bookmarklet de base est dispo en footer.
Histoire d'ajouter encore une feature, vous pouvez stocker des scripts, à la main, dans le dossier ... scripts/ . Vous utiliserez le nom du fichier dans l'url avec ?script=[nomdefichier]
Ainsi, en sauvant le json de l'exemple (cadre «Script au format JSON») dans un fichier scripts/sepia.json
vous pouvez ensuite l'appeler avec&script=sepia
Vous pouvez vous faire une bibliothèque de scripts pour tout et les appeler directement au lieu de vous taper du json dans l'URL
Tout est expliqué dans l'aide : https://api.warriordudimanche.net/scriptopic/?help
Ben parce que pour sauver sur le serveur, il faudrait un compte admin, donc un espace sécurisé et tout le toutim... et là, on parle pas du même projet
Le bouzin est testable là: https://api.warriordudimanche.net/scriptopic/
Et téléchargeable ici: https://api.warriordudimanche.net/scriptopic/?download
Je n'ai pas nettoyé le code, vu que je subis un harcèlement constant à la maison (lol), mais je le ferais, promis ! Le tout est en beta à l'arrache en licence amusez-vous avec.
$picture=new pictool();// on peut mettre un array contenant les valeurs initiales des attributs : ['format'=>'png'] par exemple)
$picture->load('www.moncul.sur/la_commode.jpeg');
$picture->contrast(20);
$picture->sepia();
$picture->save("fichier.jpeg");
$picture->display();
Le script matrix qui alterne sketch et gaussian à plusieurs reprises puis colorise en vert
Pas flippant du tout.
Dans la catégorie débranchement de cerveau, je vous propose une appli vigoureusement inutile mais totalement défoulatoire: Stamp.
Cette appli/api vous donne la possibilité d'ajouter un tampon sur une image en un minimum d'opérations. Ainsi, vous pourrez passer :
de ça
à ça
En partant de là : https://api.warriordudimanche.net/stamp/ vous remplissez l'URL et le texte, vous validez et hop.
Comme toujours, le bookmarklet vous permet d'envoyer l'URL courante à Stamp: ouvrez l'image dans un nouvel onglet et cliquez sur le bookmarklet.
Bande de coquins, vous avez sans doute remarqué un autre bookmarklet à côté du premier... c'est un bookmarklet dynamique: grâce à lui vous pouvez créer des bookmarklets avec un texte spécifique.
Par exemple, si vous envisagez d'utiliser souvent le tampon «dans ton cul», pourquoi le retaper à chaque fois ? Glissez ce lien dans la barre de favoris et let's the fun begins !
Fait à l'arrache, interrompu toutes les minutes mais avec amour, dévotion à l'absurdité du monde et mon ordi.
Tiens, je ne savais pas que la bibliothèque GD avait une fonction imagecreatefromstring()
qui permet de créer une ressource image à partir d'une chaîne.
C'est très utile dans le cas où on récupère une image via une URL sur un site et qu'on veut lui appliquer un traitement.
En effet, quand on veut faire ça «normalement», on a recours à imagecreatefrom[FORMAT]
(imagecreratefromPng() par exemple), ce qui oblige à connaître l'extension ou au moins le type mime de l'image... et des fois, ça couille : l'URL ne contient pas l'extension ou alors il y a des paramètres GET dedans, bref, ça fait chmir.
Avant, je partais vers la récupération de l'extension du fichier pour appeler la fonction adaptée... c'est chiant, sale et pas parfait comme solution (bugs de nom et besoin de télécharger localement l'image sous forme de fichier)
$downloaded_pic=file_get_contents($url);
file_put_contents($local_path_pic,$downloaded_pic);
$ext=pathinfo($url)['extension'];
$fun=$ext=='jpg'?'jpeg':$ext;
$function_name='imagecreatefrom'.$fun;
$img = $function_name($local_path_pic);
Avec imagecreatefromstring(), ça passe tout seul, c'est plus propre, plus lisible et surtout, pas besoin du type de l'image ou d'un fichier local...
if ($downloaded_pic=file_get_contents($url)){
$image=imagecreatefromstring($downloaded_pic);
}else{
exit("Erreur de téléchargement de l'image");
}
On peut même récupérer les dimensions de l'image avec un équivalent de getimagesize()
: getimagesizefromstring()
!
Parfois un pouet sur Mastodon pour partager une URL et une idée concorde avec un truc que t'avais déjà fait : https://framapiaf.org/@bronco/108423992250980547
Ainsi, Gilles me fait passer une adresse de métamoteur de recherche d'ebooks ( https://recherche-ebook.fr/ ) tout en notant que ce serait bien de faire une version qui soit plus propre... (pas de JS, de redirections, de pubs etc..)
Il se trouve que je m'étais fait un script dont le but était justement de charger des urls, de les parser, de récupérer et d'organiser du contenu.
Le pack est un array du type:
$packs['<profil>']=[
[
'url'=>'http://urltoparse.com/',
'pattern'=>'REGEX PATTERN with (?<name>..) capture',
'template'=>'<li> HTML Template where data is inserted to : use %name% '
],
[
'url'=>'http://urltoparse.com/',
'pattern'=>'REGEX PATTERN with (?<name>..) capture',
'template'=>'<li> HTML Template where data is inserted to : use %name% '
],
];
Dans le template de chaque url,
%variable%
pour placer les captures regex : (?<title>[^"]*?)
➜ %title%
%ROOT%
pour accéder à l'url du pack%DOMAIN%
pour accéder au domaine de cette url (pour compléter une URL relative par exemple)J'ai ajouté la possibilité de créer un dossier au nom du pack contenant un header et un footer pour qu'on puisse faire un site à partir d'un profil.
packstemplates/<profil>/
J'ai ensuite créé un pack contenant les principaux sites d'epubs, cherché les patterns regex...
Et voilà: metapub cherche sur six sites en même temps: http://slurp.warriordudimanche.net/?p=ebook
Enjoy !
Ça fait un moment que je parle de certaines de mes applis au fil de billets ou de commentaires, en particulier de celle que j'utilise au boulot. Un très long billet totalement dispensable destiné à ceux que l'enseignement intéresse (ou les logiciels dans l'enseignement)
Je me suis dit que ça pouvait intéresser des gens de voir avec quoi je taffe.
Tout est venu de l'aspect pour le moins instable et aléatoire des logiciels et environnements proposés dans le cadre de mon boulot que ce soit au niveau du ministère, de l'académie, du département ou même du collège.
En gros, on change soit de logiciel soit d'environnement soit de machines à peu près tous les ans ou les deux ans, ce qui induit une certaine appréhension au niveau de la conservation de nos données: les exercices réalisés dans les exerciseurs disparaissent, les données et documents de l'ENT également... bref: c'est du taf inutile à se retaper tous les ans (ou deux ans) 💩
Mon autre souci, c'est que les logiciels proposés sont rarement utilisés par ceux qui les codent puisqu'il s'agit d'applis à caractère administratif (appel/cahier de texte etc) ou pédagogiques (exerciseurs / stockage de données / expos etc)
Résultat, l'UI est merdique et il est impossible de faire la moindre opération sans un nombre de clics qui à lui seul justifierait qu'on vire le bureau d'études. Quand tu dois swapper clavier souris trois fois pour juste une case à cocher, on a un problème. 😬
Ce problème vient du fait qu'à vouloir donner la possibilité de réaliser des choses complexes, on complexifie inutilement la réalisation des choses simples... or, on fait plus souvent des cases à cocher ou des cases de texte à remplir que des formulaires insérés dans des vidéos. 😭
Pour ma part, j'attends d'une appli destinée aux élèves et aux professeurs que:
Pour les élèves:
Pour moi:
Il s'agit d'une appli en ligne de consultation libre des documents utilisés en cours.
Côté élève, un lien de partage conduit à la page que j'utilise en classe pour faire cours: il a donc toutes les ressources pour revoir la leçon ou récupérer le cours en un seul lien.
Cette même page me permet de mettre une image en plein écran en un clic, de faire plusieurs diapos simplement etc.
Côté enseignant, elle fournit un explorateur de fichiers , un éditeur de pages etc. On peut ainsi créer un nouveau dossier de travail pour les 5ème, y déposer en une fois mp3, images etc, y créer une page dans laquelle on organise le tout et même créer des exercices numériques sans que ça prenne plus de temps de le faire là que de le faire sous libreoffice (souvent, la version papier me prend grave plus de temps que la version numérique en fait 😅)
La racine de la page d'accueil donne accès à tous les niveaux
et dans chaque niveau, une page unique liste tous les documents disponibles. Quand le prof cherche le document du jour, il peut filtrer en tapant une partie du nom du dossier contenant lesdits documents.
Une fois sur le document, l'élève (ou le prof en classe) a une page claire avec documentation, questions, liens vers les fiches de révision et pdf éventuellement distribué.
L'enseignant peut également ajouter des éléments de formulaire dynamiques permettant de sélectionner, cocher, ordonner, compléter
J'ai ajouté un bouton servant à changer la police de caractères pour l'opendyslexic:
Le prof a un filemanager pour créer des dossiers et des fichiers simplement, uploader en glisser-déposer, éditer des fichiers. L'accent a été mis sur la rapidité et la simplicité d'utilisation.
Si on se contente d'uploader sans mettre de page, le lien générera une page complète avec les documents. Sinon, on ajoute une page html qu'on édite ensuite (deux clics)
Tous les fichiers constituant un «document de classe» se trouvent dans le même dossier par défaut: si on crée des sous-dossiers dans celui du document, chaque sous-dossier devient une diapo indépendante générée comme des pages individuelles. Lorsqu'on se rend sur la page de partage, on passera de l'une à l'autre avec les flèches du clavier ou celles apparaissant sur les côtés de l'écran... pas besoin de se faire chmir à créer les diapos, les lier que sais-je.
On a donc: ROOT> niveau> document> fichiers ou ROOT> niveau> document> diapo1>fichiers , ROOT> niveau> document> fichiers>diapo2>fichiers etc.
Pour la mise en page, on utilise markdown, donc, du texte brut. Hors de question pour moi de devoir me prendre le chou avec des mises en page compliquées.
Sur ce principe, pas de boîtes de dialogue, de clics multiples pour créer des exos: tout se fait par deux types de «balises» sans lâcher son clavier:
Propres à mon framework perso, je les ai adaptées à Documentos:
Les éléments de formulaire sont générés via des commandes gu genre {{app->flashcards("")}} qui ne sont pas super simple à mémoriser ou sexy à voir. Du coup, j'ai créé des aliases plus simples qui utilisent les crochets. Ainsi:
Le fait de ne jamais quitter le clavier supprime la plupart des clics et la perte de temps du passage entre clavier et souris. ça s'avère redoutable dès qu'on a un peu l'habitude: on ne s'occupe que du contenu sans jamais perdre de temps à chercher comment faire (friction d'utilisation minimale)
T'inquiète, mon con de chef m'a suffisamment fait chier avec ça pour que je ne coure aucun risque (faire une recherche sur ce site avec le mot clé «j'abandonne» 😡):
J'utilise Documentos depuis 2018 et je le modifie régulièrement. L'utilisation au quotidien est top et lors du confinement, je n'ai pas eu à changer grand-chose pour que le distanciel soit possible... je pouvais fournir presque en temps réel et mes élèves ont pu bosser dès les premières minutes de confinement sans être déroutés et depuis n'importe quel appareil (là où l'ENT était à genoux dès 8:10)
Je ne fournis pas le code de Documentos pour plusieurs raisons:
Après, on peut discuter, hein 😉
(wink @Sebsauvage : https://sebsauvage.net/links/?-WagqA )
Je me suis aperçu que mon plugin Plinstagram faisait des trucs étranges et refusait parfois de poster. Pensant à une erreur d'identification, j'ai repris le code mais rien n'y faisait.
J'ai commencé à avoir des problèmes de redirection incompréhensibles: le header("location") ne fonctionnait pas (voir https://warriordudimanche.net/article1635/1635 )
Une fois la ruse très moche appliquée, ça semblait revenu à la normale. Puis j'ai décidé d'aller marcher un peu et j'ai pris des photos dans l'idée de tester à nouveau Plinstagram.
J'ai beau tout essayer, pas moyen d'envoyer le post avec les photos... mais curieusement, j'aboutis à une erreur 404 et pas à une erreur d'exécution. Je me dis que ça doit être un problème de taille de formulaire et je me rappelle que, comme un con, j'ai omis de virer l'input files du formulaire avant envoi. J'explique rapidement comment fonctionne Plinstagram:
1 - l'utilisateur sélectionne des photos sur son ordinateur
2 - pour chaque image, le script js se charge de:
Ainsi on obtient un $_POST[data] et un $_POST[filename] qui contiennent chacun un tableau avec les données de chaque image pour l'un et le nom de chaque image pour l'autre.
Quand on poste, le script vire l'input file pour éviter l'upload de grosses photos.
Vient ensuite le hook AdminArticlePrepend de la page core/admin/article.php vers laquelle pointe le formulaire de plinstagram: celui-ci se charge de :
1 - parcourir l'array des images redimensionnées postées en base64,
2 - récupérer le nom de chaque image
3 - sauvegarder localement chaque image dans un sous-dossier dédié à l'article
4 - générer une galerie qu'il ajoute au corps du post
5 - finaliser la création des données de l'article.
À ce moment-là pluXML reprend la main et s'occupe du stockage de ces données.
Avec une photo, tout se passe normalement. Si j'en mets ne serait-ce que deux, pluXML me renvoie à la page 404, comme si l'URL était fausse: or, il n'en est rien ! L'URL de la barre d'adresse est la bonne, celle du formulaire aussi... pourtant, avec plus d'une photo, la requête n'arrive jamais à core/admin/article.php
Pire, une fois sur la page 404, si je clique dans la barre d'adresse puis que j'appuie sur entrée, j'arrive sans encombre à la page voulue (mais sans les données de formulaire bien entendu): l'URL est donc bonne.
J'ai pensé à une redirection foireuse mais la seule redirection qui reste est celle qui se fait AVANT le formulaire et seulement dans le cas où l'utilisateur n'est pas connecté.
Et puis ça ne semble pas être la faute de mon script PHP vu qu'on n'arrive même pas jusqu'à lui (j'ai collé des exit('moncul'); partout pour voir et rien !)
TOUT FONCTIONNE SANS PROBLEME ! (le fameux «ça marche sur mon ordi»)
J'en suis à me dire qu'il doit y avoir un genre de restriction pour la taille des données contenues dans des inputs et que cette restriction ne doit pas être la même en local.
Une autre piste que je dois explorer est une éventuelle incompatibilité entre deux plugins... Mais je vois pas lesquels et pis là, faut que j'aille pleurer d'abord.
Tiens, la différence entre le local et le distant, c'est la configuration du rewrite URL dans pluXML: activée en distant. Je mets sur OFF et là, j'obtiens une erreur 406:
Not Acceptable: An appropriate representation of the requested resource could not be found on this server.
ça progresse. Je retourne pleurer.
Bon, fô qu'jeul lis... un jour
Pas bête du tout ça: quand on met en place un cache en PHP, on crée le contenu s'il n'existe pas ou on le lit puis le renvoie s'il existe.
Grâce à un .htaccess bien placé, on peut servir directement le fichier s'il existe et on renvoie vers la page php censée le générer s'il n'existe pas (erreur 404)
Du coup, on n'exécute du PHP que si le contenu n'existe pas.
Pas con du tout !
Merci SebSauvage (et le Duke ) pour cette page dans laquelle je découvre que PHP propose
levenshtein()
en natif pour calculer la proximité entre deux chaînes...
En ce qui concerne la réducton phonétique, c'est pas forcément simple, en effet (surtout pour le français ) !
Pour un jeu de rôles que j'avais fait quand j'étais jeune (au tout début du jurassique), j'avais fait un petit algo de «traduction» dans la langue du jeu et ça passait par une réduction phonétique puis par une substitution de voyelles apparentées ou de consonnes apparentées, ce qui donnait toujours quelque-chose de prononçable...
Haaa, c'est intéressant ça ! Merci !
<?php echo date(DateTime::RFC2822); ?>
Le confinement nouveau est arrivé et avec lui plein de nouvelles raisons de se poser des questions exitentielles (non, j'ai pas fait de faute) (GAG)
Pour y répondre et vous guider dans vos choix, plutôt que de vous fier aux oracles, haruspices et autres politiciens qui vous noieront sous des mensonges, des billevesées voire même des promesses électorales, pourquoi ne pas utiliser la bonne vieille 8 ball magique ?
Du coup, je vous en propose une. Sous forme d'API. Oui.
Tu poses ta question dans ta tête, tu vas sur https://api.warriordudimanche.net/8ball et tu as ta réponse. Par contre, elle est parfois un peu franche...