Archives par mot-clef : PHP

Ainsi cron cron cron, les petites marionnettes

Catégorie : Geekeries | Laisser un commentaire

((/public/Divers/cron-grafiti.png|ça cron ?|L|ça cron ?, fév. 2010))Voilà 3 mois que j’ai écris un billet intitulé avec autant de mauvais goût que celui que vous êtes en train de lire : [ça cron !|/post/2009/ca-cron] Mise à part leur entrée en matière un peu pilotractée, ces 2 billets abordent le même sujet : les crons. __Cron__, c’est un système sous Linux qui permet de déclencher un événement à intervalle régulier. Par exemple on peut exécuter tous les jours un script PHP qui nettoie une base de données, ou une ligne de commande Shell qui ouvre un lecteur audio et joue un titre au hasard. Bref, c’est un outils permettant de faire pas mal de choses intéressantes et qui font un peu rêver. Comme je l’expliquais précédemment, j’ai trouvé mon bonheur pour apprendre à utiliser cron sur le site Code18 : [Installer un cronjob|http://code18.blogspot.com/2009/10/installer-un-cronjob.html], mais à l’époque, je n’avais pas eu le temps de tester. Aujourd’hui, c’est chose faites ! Ce petit billet a donc pour but de retracer les grands étapes d’utilisation d’un cron. !!!Ce dont on a besoin * Un serveur accessible en ligne de commande sur lequel cron est installé Pour vérifier si cron est utilisable, il faut utiliser la ligne de commande qui liste les événements programmés : /// crontab -l /// Si cron est utilisable la liste des événements programmés s’affichera, ou s’il n’y en a pas, un message du style : @@no crontab for ******@@.%%% Dans le cas contraire : @@-bash: /usr/bin/crontab: Permission denied@@ ou @@-bash: crontab: command not found@@. Pour cela, il faut bien sûr se connecter auparavant au serveur en SSH : /// ssh user@serveur /// !!!Ajouter ou modifier un événement Il faut utiliser la ligne de commande : /// crontab -e /// Celle-ci ouvrira le fichier crontab (contenant les événements programmés) sous l’éditeur par défaut, vim par exemple.%%% Pour ma part, sachant que je suis chez 1and1, ce fichier contient : /// # m h dom mon dow command * * * * * /usr/local/bin/php /kunden/***/htdocs/sites /// [infinite loop|http://code18.blogspot.com/2009/10/installer-un-cronjob.html] (l’auteur de Code18) explique ce que signifie cette ligne de commande. Pour résumer on peut remplacer chaque étoile par les valeurs suivantes (l’étoile signifiant « toutes les \[minutes|heures|...]« ) : * 0-59 ou * -> minute * 0-23 ou * -> heure * 0-31 ou * -> jour du mois * 0-12 ou noms ou * -> mois * 0-7 ou noms ou * -> jour de semaine Pour ma part, j’ai remplie le deuxième argument (/usr/local/bin/php) en utilisant : @@which php@@ sur mon serveur 1&1. Et le dernier (/kunden/***/htdocs/sites) en utilisant simplement @@pwd@@ dans un de mes répertoires nommé sites/. !!!Quelques idées d’utilisation Pour ma part les cron risquent de bien me servir pour mettre à jour une base de données à partir de flux RSS sans ralentir mon site durant la journée. Cet été, cela m’aurait bien servi pour mettre à jour le cache ou les sitemaps mais bon trop tard. La question que je me pose, c’est si cela vaut le coup de faire un site proposant un service pour programmer l’envoi d’e-mails en différé. Fonction utile, non disponible sous Gmail par exemple, et à ma connaissance peu utilisé sous Outlook ou autre. A voir…

jquery-non-transparent

Utiliser une fonction PHP avec jQuery à l’aide de get

Catégorie : Javascript | 2 commentaires

En ce moment, je m’amuse un petit peu avec jQuery et l’Ajax. C’est un domaine dans lequel, je ne me sens vraiment pas à l’aise, donc j’essaie de faire des progrès. Aujourd’hui, je suis tout content car j’ai réussi à utiliser une fonction PHP avec jQuery en utilisant les principes d’Ajax ! J’ai découvert la méthode get() dans jQuery, et c’est exactement ce que je cherchais.

Démarche générale

J’ai un formulaire contenant un champ titre et un champ url. Le champ url contient normalement le titre mais parsé par une fonction PHP maison parserUrl(). Pour faciliter la vie de l’utilisateur, je voulais ajouter un petit bouton « Actualiser » à côté du champ Url, afin de pouvoir actualiser l’url avec un nouveau titre à n’importe quel moment. Voici un démo pour voir le fonctionnement : démo Utiliser une fonction PHP avec jQuery.

Démo utilisation get() en jQuery

Démo utilisation get() en jQuery

Continuer la lecture

Montre mécanique

Transformer une date en langage naturel, en timestamp

Catégorie : PHP | Laisser un commentaire

En ce moment, je m’amuse avec des flux RSS, et il se trouve que dans un flux RSS, on tombe souvent sur une date de la forme : « Fri Oct 30 17:17:00 2009″. Bref, une date en langage naturel ! Mais voilà, ce dont j’ai besoin c’est d’une date au format timestamp (le nombre de secondes depuis le 1er janvier 1970 à minuit, aussi appelé l’epoch). Je pars donc avec mes grands sabots : des regex pour séparer heures, minutes, …, et un p’tit coup de mktime !
C’est pas mal, mais en fouillant dans la doc, j’ai trouvé une petite fonction fort sympathique : strtotime ! Cette fonction prend une chaine de caractères en argument et renvoie, si possible, le timestamp correspondant. Plusieurs mots clefs sont pris en compte, par exemple now, ou next Thursday. Et le format de date précédemment cité est bien reconnu, chouette, non ? Pour se convaincre :

$str = 'Mon Nov 2 07:01:11 2009';
$timestamp = strtotime($str);
$str2 = date('D M j H\:i\:s Y', $timestamp);
echo 'Date d\'origine : '.$str.'<br />Timestamp après strtotime : '.$timestamp.'<br />Date réécrite après strtotime : '.$str2;

Ce qui affiche bien :

Date d’origine : Mon Nov 2 07:01:11 2009
Timestamp après strtotime : 1257145271
Date réécrite après strtotime : Mon Nov 2 07:01:11 2009

Magique, non ?
Bon, je retourne à mes flux RSS.

javascript

Uploadify : uploader facilement avec Jquery

Catégorie : Javascript | Un commentaire

Voilà déjà quelques temps que j’entretiens, en parallèle de mon script « toolbar BBcode » un script d’upload de fichiers. Il contient une interface d’administration bien complète, et l’interface utilisateur permet d’uploader facilement un ou plusieurs fichiers à la fois, en renommant, écrasant, sélectionnant un dossier particulier, et bien sûr la gestion des fichiers déjà uploadés permet d’en faire autant. Récemment, en apprenant des notions d’Ajax, j’ai même appris à faire des uploads sans rechargement de pages, c’est beaucoup plus zoulie !

Alors forcément, le jour où j’ai découvert Uploadify, un plugin d’upload super zoulie, super pratique, super rapide à installer, via jQuery, bah… oui, ça m’a fait un choc. Je l’ai testé aujourd’hui pour de vrai, et y a pas à dire : c’est cool ! Un script javascript (jQuery), et un fichier swf (i.e. flash) se chargent de l’interface et d’afficher une file d’attente des fichiers en cours d’uploads, et une petite barre de progression, pour la forme, bien entendu (pourquoi se contenter d’un petit gif de chargement… ? *soupir*) ! Reste à écrire le fichier PHP (ou autre. Un exemple sommaire est fournie avec le plugin) pour uploader vos fichiers comme vous voulez (création de miniatures et tout le tintouin) en renvoyant 1 si tout va bien, et 0 si ça bug.
Alors, c’est vrai que mon premier test n’est pas des plus jolies, mais en environ 30 minutes, j’ai réussi à installer le plugin (je ne connais quasiment pas jQuery), à le faire fonctionner, et ajouter une petite liste défilante pour modifier à la volée le dossier récepteur. Reste à améliorer le design, l’ergonomie, à pouvoir créer des répertoires à la volée, et surtout à améliorer le script d’uploads. (créations de miniatures, dézippage de fichiers compressés, etc, etc…)
Bref, un peu d’amusement en perspective ! Au passage, je n’ai pas réussi à le faire fonctionner en local. Le dossier de réception ne prenait pas en compte les alias que j’ai configuré sur mon EasyPHP. Hum, mouais, à voir… Voici les avantages/inconvénients que j’ai pu lister :

  • Facile à installer et à configurer
  • Facile à utiliser et vraiment jolie

Par contre :

  • Brut de forme, les utilisateurs ayant désactivé Javascript ne peuvent utiliser le formulaire d’upload
  • Pour des actions un peu poussé (choix d’un dossier différent pour chaque upload en cours par exemple), on peut se retrouver bloquer
  • Le plugin est en anglais par défaut. Heureusement, Code18 (encore lui) nous explique comment changer ça. On espère avec lui que sa fonctionnalité sera ajouté dans les versions à venir. Have fun!

Comment faire

En relisant ce billet, je me suis aperçu qu’il ne servait pas à grand chose. Pourtant, il semble ressortir pas mal dans les recherches Google. Je me dois donc de l’agrémenter de quelques lignes, par exemple en présentant mon code, pour qu’il soit un peu plus utile. Le but est d’obtenir le résultat précédant. Commençons par le code HTML :

<div id="fileAttente"></div>
<input id="uploadify" type="file" name="uploadify" />
<select id="folder" name="folder" onchange="changeFolder(this)">
  <option value="data/media">Media</option>
  <option value="data/rss">RSS</option>
</select>

<a href="javascript:$('#uploadify').uploadifyUpload();">Lancer l'upload</a>
|
<a href="javascript:jQuery('#uploadify').uploadifyClearQueue()">Effacer la liste</a>

On peut voir qu’il y a un div pour la file d’attente, un champ de type upload, un sélecteur de dossier, et des liens pour lancer l’upload et effacer la liste d’attente. Bref, en remplaçant les liens par des boutons cliquables, on a tout ce qu’il faut pour rendre l’upload accessible aux personnes ayant désactivées Javascript.

J’ai encore un onchange qui traine, mais c’est juste que je ne maîtrise toujours pas suffisamment jQuery pour le retirer. Bon maintenant, le code Javascript qui se trouve sur la même page :

<script type="text/javascript" language="javascript" src="./themes/global/js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="./themes/global/js/swfobject.js"></script>
<script type="text/javascript" src="./themes/global/js/jquery.uploadify-2.1.0.min.js">
</script>
/* ... */
<script type="text/javascript">
// <![CDATA[
$(document).ready(function() {
  $("#uploadify").uploadify({
    'uploader': './include/classes/upload/uploadify.swf',
    'script' : './include/classes/upload/uploadify.php',
    'cancelImg' : './themes/global/img/cancel.png',
    'folder': 'data/media',
    'queueID' : 'fileAttente',
    'multi' : true,
    'buttonText' : 'Parcourir'
  });
});

function changeFolder(select) {
  var numero = select.selectedIndex;
  var valeur = select.options[numero].value;
  $('#uploadify').uploadifySettings('folder', valeur);
}
// ]]>
</script>
  • uploader : correspond au fichier flash pour l’affichage de la barre de défilement
  • script : c’est le script PHP qui se chargera de l’upload (et donc des vérifications, de la miniturisation, l’enregistrement en BDD, …)
  • cancelImg : url vers l’image pour annuler une upload de la file d’attente (avant que celle-ci n’est démarrée)
  • folder : c’est le dossier par défaut où seront uploadées les fichiers. C’est cette valeur que l’on changera avec changeFolder
  • queueID : l’id de la balise pour la file d’attente
  • multi : pour uploader plusieurs fichiers en même temps
  • buttonText : Texte à afficher sur le bouton Parcourir

On a donc initialisé Uploadify. Et juste avant, dans le header, on a appelé les différents fichiers : le design CSS pour l’affichage, JQuery, le fichier Javascript Uploadify, et un fichier javascript swfobject pour régler un p’tit souci avec la gestion du flash en PHP et Javascript. Quant à la fonction changeFolder, elle est appelée dès qu’un utilisateur change la valeur du sélecteur de dossiers, et comme vous pouvez le voir, elle modifie la valeur de la variable folder. Bref, tout est là ! Si le fichier uploadify.php fonctionne correctement, les fichiers seront uploadés comme il faut au bon endroit !

Pour ma phase de tests, mon fichier d’upload était minimaliste :

if (!empty($_FILES)) {
  $tempFile = $_FILES['Filedata']['tmp_name'];
  $targetPath = $_SERVER['DOCUMENT_ROOT'] . $_REQUEST['folder'] . '/';
  $targetFile = str_replace('//','/',$targetPath) . $_FILES['Filedata']['name'];
  move_uploaded_file($tempFile,$targetFile);
  echo "1";
}

Pour aller plus loin

Singleton(s) !

Catégorie : PHP objet | Commentaires fermés

Voilà bien longtemps que je n’avais pas fait de billets sur le PHP Objet. A vrai dire, je suis en train d’apprendre la programmation orientée objet en cours (au travers du Java et du C++), donc ça fixe vraiment les idées et permet de comprendre pas mal de petites choses, notamment l’utilité de certaines notions, comme les singletons, qui me paraissaiebt bien douteuse auparavant. Un [singleton|tag:singleton], c’est une classe que l’on ne peut instancier qu’une seulenfois. Par exemple, en cours on a créé une classe liste dont hérite la classe liste vide, et la classe listeNonVide. Clairement, il n’existe qu’une et une seule liste vide (sinon, on ne s’en sort pas), donc cette classe ne peut être instanciée qu’une seule fois, donc c’est un singleton. Je n’ai pas encore trouvé d’exemples plus parlant, par contre sur [Apprendre-PHP|http://www.apprendre-php.com], l’exemple est celui d’une classe PresidentDeLaRepublique qui, en effet, ne peut être instanciée qu’une seule fois) !!Comment faire ? L’idée est la suivante : le constructeur de la classe est [private|tag:private], on ne peut donc instancier la classe en passant directement par lui. Par contre, une variable [static|tag:static] possède un accessor (@@getMachin()@@) qui est [public|tag:public] et qui appelle le constructeur si la classe n’est pas encore instanciée (variable static == null), ou retourne l’instance sinon. En somme, voilà ce que ça donne : /// class Singleton { /** * Variable static valant null si la classe n’est pas encore instanciée * ou contenant l’instance si la classe est instanciée. * On y accède avec self::$_instance */ private static $_instance = null; /** * Constructeur private inaccessible en dehors de la classe */ private function __construct() { // On instancie ce qu’il faut } /** * Accessoir static, donc accessible sans être instancié, renvoyant * l’instance, en la créant si besoin */ public static function getInstance() { if(self::$_instance == null) { self::$_instance = new Singleton(); } return self::$_instance; } } /// Notez qu’en Java ce serait la même chose, mais sans les @@self::@@. %%% Bon, bah voilà, ce n’était pas si compliqué que ça ! !!Pour en savoir plus * [Article sur les singletons en Java|http://smeric.developpez.com/java/uml/singleton/] (Developpez.com) * [Article sur les singletons en PHP|http://www.apprendre-php.com/tutoriels/tutoriel-45-singleton-instance-unique-d-une-classe.html] (Apprendre-PHP)

BBcode Toolbar en PHP Objet – Version 1

Catégorie : Projets | Laisser un commentaire

C’est vers fin juillet, que j’ai écrit un billet intitulé [Documentation module toolbar en PHP objet|http://30minparjour.la-bnbox.fr/post/2009/Documentation-module-toolbar-PHP-objet] qui parlait d’un système que je suis en train de concevoir : un module de toolbar BBcode en PHP objet, facilement instalable sur tout type de site Web et totalement paramétrable. J’ai terminé ce module, et j’en sors donc la version 1. Une version stable (enfin, avec les essais que j’ai fait) et relativement satisfaisante à mon goût. Je l’ai installé dernièrement sur un site (qui n’est malheureusement pas encore en ligne) et cela ne m’a pas posé de problèmes. (même si ça m’a donné plein d’idées d’améliorations) Si vous souhaitez [tester ce module sur votre site|http://30minparjour.la-bnbox.fr/public/Projets/BBcode-toolbar/Toolbar.zip], pas de problèmes : téléchargez-le, puis suivez le readme.txt pas à pas. Et surtout, n’hésitez pas à me faire des retours. Ce module permet : * De créer, puis de générer différentes barres de boutons cliquables, à afficher au dessus de n’importe quel champ textarea * De paramètrer ces boutons, notamment leur action (création de balises \[un]\[/un] ou \[deux=trois]\[/deux], en passant par un pop-up, ou autre) Et il est fait en PHP (orienté Objet), Javascript (utilisant le framework Prototype pour l’instant) [((/public/Projets/BBcode-toolbar/.toolbar_back_bouton_m.jpg|Paramétrage des boutons cliquables|C|Paramétrage des boutons cliquables, sept. 2009))|/public/Projets/BBcode-toolbar/toolbar_back_bouton.png] [((/public/Projets/BBcode-toolbar/.toolbar_front_m.jpg|Exemple de toolbar|C|Exemple de toolbar, sept. 2009))|/public/Projets/BBcode-toolbar/toolbar_front.png] J’espère qu’il vous donnera entière satisfaction ! En tout cas, à moi, il m’est bien utile, et je compte bien continuer à l’améliorer. !!Annexes * [Documentation module toolbar en PHP objet|http://30minparjour.la-bnbox.fr/post/2009/Documentation-module-toolbar-PHP-objet] * [Télécharger BBcode Toolbar version 1|http://30minparjour.la-bnbox.fr/public/Projets/BBcode-toolbar/Toolbar.zip]

Taille d’une image avec getimagesize

Catégorie : PHP | Laisser un commentaire

Ouhahou, ça faisait longtemps ! Il faut dire que je suis parti en vacances tout une semaine, que c’est un peu le rush au boulot ces derniers temps, et accessoirement que j’ai de moins en moins Internet chez moi. Bref, j’ai reussi cahin caha à apprendre de nouvelles choses pendant au moins 30 minutes chaque jour, mais pour mettre ces découvertes à l’écrit, il m’aurait fallu un peu plus de temps. Hier, je cherchais à connaitre les dimensions (largeur et hauteur) d’une image. J’ai d’abord pensé à @@imagesx()@@ et @@imagesy()@@ que j’avais déjà utilisé et qui renvoie respectivement la largeur et la hauteur de l’image dont le descripteur est passé en argument. C’est justement là le problème, puisque pour ce servir de ces fonctions il faut d’abord utiliser @@imagecreatefromjpeg(‘nom du fichier image’)@@ ce qui n’est quand même pas très pratique. Surtout quand on tombe sur [getimagesize('nom du fichier image')|http://fr2.php.net/manual/fr/function.getimagesize.php] ! Cette fonction retourne non seulement la largeur et la hauteur de l’image étudiée, mais aussi son format (notamment au format mime), son type de coloration (RGB ou CMYK) ! C’est plutôt beau, non ? Voyons un petit exemple : /// ‘; print_r(getimagesize(‘test.gif’)); echo ‘

'; ?> /// Ce qui retourne : /// Array ( [0] => 45 [1] => 45 [2] => 1 [3] => width="45" height="45" [bits] => 7 [channels] => 3 [mime] => image/gif ) /// Voilà ce qui peut être utile : * Le champ 0 retourne la largeur en pixel. On retrouve cette largeur dans le champ 3 dans une chaine de caractères directement utilisable dans du code HTML * Le champ 1 retourne la hauteur en pixel. On retrouve cette hauteur dans le champ 3 dans une chaine de caractères directement utilisable dans du code HTML * Le champ 2 et mime retournent le format de l'image. Le champ 2 par son numéro, le champ mime au format mime utilisable directement dans les entêtes HTTP. C'est quelque chose que je cherchais depuis quelque temps, le problème c'est que j'ai oublié dans quel projet j'en avais besoin... Et 2 autres informations dont je pense ne jamais me servir : * Le champ bits retourne le nombre de bits par couleur. ça peut bugguer avec le format Gif. J'ai pas trop compris ce que cela voulait signifier * Le champ channels retourne le type de coloration (3 pour RGB, 4 pour CMYK)

Forcer le téléchargement d’un fichier

Catégorie : PHP | Laisser un commentaire

Lorsque j’ai conçu [la Bnbox v.3|http://la-bnbox.fr] j’aurais bien aimé savoir ce que j’ai découvert il y a peu. Comment forcer le téléchargement d’un fichier sur un site Web ? Par exemple un fichier PDF (so beautiful!) ou un fichier mp3 sont en général directement lus par les navigateurs récents. Mais il peut être pratique, parfois, d’éviter au visiteur la manipulation  »Clic droit > Enregistrer la cible du lien sous… ». /// /// Pour cette fonction, je m’inspire pas mal d’un billet (du même nom que le mien) sur [Apprendre PHP|http://www.apprendre-php.com/tutoriels/tutoriel-25-forcer-le-telechargement-d-un-fichier.html], mais j’ai essayé de comprendre un peu mieux tous les paramètres que l’on fournit à la fonction @@header@@, notamment en lisant la documentation PHP pour [header|http://fr2.php.net/manual/fr/function.header.php] et [readfile|http://fr2.php.net/manual/fr/function.readfile.php]. Mais il faut avouer que le manuel est plutôt avare à ce sujet (pour une fois), ou alors c’est moi qui cherche au mauvaise endroit. * Content-Description : la description qui apparaitra lors du téléchargement. * Content-Type : type du fichier à télécharger. Si je comprend bien, @@application/octet-stream@@ fonctionne toujours, mais il peut être intéressant pour éviter tous problèmes, de préciser le type. Pour faire cela automatiquement, il faut voir du côté de [pathinfo|http://fr2.php.net/manual/fr/function.pathinfo.php] (qui est vraiment une fonction magique !) et la compléter avec un switch pour avoir le type sous la bonne forme. (je n’ai pas encore trouvé une fonction renvoyant directement @@application/octet-stream@@) * Content-Length : taille du fichier en octet. Un petit [filesize|http://fr2.php.net/manual/fr/function.filesize.php] fera l’affaire. * Content-disposition: attachment; \[filename=nom_fichier] : c’est le mot clef @@attachment@@ qui fait en sorte qu’il y ait une fenêtre de téléchargement. En effet, avec @@Content-disposition@@, on précise le buffer de sortie, @@attachment@@ pour une fenêtre de téléchargement, @@inline@@ pour la fenêtre principale. Quant à filename, il permet de spécifier, si on le souhaite, un nouveau nom pour le fichier que l’utilisateur va télécharger. * Pragma : aucune idée. Mais apparement la gestion du cache dépend beaucoup du navigateur, donc il vaut mieux préciser partout que l’on ne souhaite pas de cache. * Cache-Control : permet de gérer la mise en cache * Expires : en fournissant une date dans le passé, on est de plus en plus sûr de ne pas mettre en cache Maintenant que l’on a précisé le buffer de sortie, le nom du fichier que l’utilisateur va télécharger, et le type de ce fichier, il n’y a plus qu’à ouvrir le fichier dans le buffer en question avec @@readfile@@.%%% Et voilà le travail ! Il n’y a plus qu’à mettre tout ça dans un fichier PHP, et à faire un système pour récupèrer le nom du fichier à télécharger à l’aide d’une variable GET ou POST. Il serait peut-être bon d’ailleurs d’avoir une table SQL listant les fichiers qu’il est possible de télécharger, pour éviter que l’utilisateur puisse télécharger n’importe quoi simplement en donnant une valeur de variable GET ou POST de son cru.

Comment importer une grosse base de données

Catégorie : SQL | Un commentaire

Ce billet aurait aussi pu se nommer « Vive la ligne de commandes ! ».%%% Je pense arriver au bout de mes peines avec ma grosse tables de 3 millions de tuples (qui n’en fait d’ailleurs toujours pas 3 millions, alors j’espère que ça tiendra le coup quand tous les tuples seront là), et j’ai notamment pas mal galéré pour la transférer d’une base de données à une autre. (local -> serveur de développement) Si on utilise PHP, ou PhpMyAdmin, pour transférer sa BDD, on se retrouve vite avec de très long temps d’attentes et avec une machine qui rame jusqu’à la mort. Quelques idées pour survivre entier à ce calvaire : * Préférer le transfert à l’aide de fichiers. Car le copier/coller de requêtes fonctionnent pour de petites tables, mais ça fait très vite ramer votre machine de course pour de grosses tables. Il suffit d’exporter les tables de son choix via PhpMyAdmin (à l’accueil d’une base > exporter : pour exporter les tables de son choix. A l’accueil d’une table > exporter : pour exporter directement la table en question), puis dans les importer via PhpMyAdmin, ou en ligne de commandes. Il vaut mieux éviter de cocher la case « Insertion Complète » qui créé une seule requête @@INSERT INTO table (val1, val2) VALUES (‘blabla’, ‘bloublou’), (‘blibli’, ‘bleble’), …, (‘blublu’, ‘bloblo’);@@ ce qui peut être un peu trop lourd. Mieux vaut créer autant de requêtes qu’il y a d’insertions dans ce cas. (le mieux serait de faire une requête pour une trentaine d’insertions, c’est vraiment plus rapide, mais cela oblige à coder tout ça soit même) * Préférer l’utilisation des lignes de commandes. Pour plusieurs raisons : plus de problèmes avec les timeout de MySQL ou de PHP puisqu’on effectue une commande à la fois. (sauf si on commande est trop lourde. Dans le cas d’une insertion complète par exemple), on contrôle réellement tout ce qui se passe en temps réel et on peut réellement tout arrêter en temps réel. (suffit de fermer le terminal quoi !), on ne passe par aucun intermédiaire et c’est donc vraiment plus rapide. !!!Quelques rappels sur les lignes de commandes MySQL Avant toute chose, il va falloir se mettre en condition pour utiliser les commandes MySQL. Pour cela, il nous faut un prompt @@mysql>@@. !!Sous Linux Il suffit d’ouvrir un terminal (de préférence son préféré) et de se connecter à son serveur distant via SSH si besoin. Puis il faut se positionner dans le dossier qui connait le commande @@mysql@@, pour mon cas c’était @@/usr/lib/mysql@@. !!Sous Windows Si vous souhaitez travailler en ligne, il suffit d’utiliser Putty et de se connecter au serveur distant (qui tourne en général sous Linux).%%% Si vous travaillez en local, Wamp et Xxamp possède une console MySQL, vous avez donc directement un prompt @@mysql>@@. Il y aussi moyen de le faire avec la console Windows (si vous travaillez avec EasyPHP par exemple), mais je vous redirige vers [ce billet|http://bluegyn.free.fr/spip/spip.php?article491]. !!Commandes MySQL Pour se connecter à une base de données ///[apache] connect -u username -p nombdd [-h localhost] /// Le mot de passe vous sera de toute façon demandé si vous ne le précisez pas directement. (et s’il n’y en a pas, il suffit d’appuyer sur Entrée) On aurait aussi pu faire, au moment d’avoir le prompt mysql : ///[apache] mysql -u username -p nombdd [-b motdepasse] /// On peut désormais taper toutes les commandes SQL que l’on voit en les terminant par un point virgule. ///[mysql] INSERT INTO table (val1, val2) VALUES (‘blabla’, ‘bloublou’); /// Ou alors importer un fichier : ///[apache] source cheminVersLeFichier.sql /// On aurait aussi pu faire, au moment d’avoir le prompt mysql : ///[apache] mysql -u username -p nombdd [-h localhost] < cheminVersLeFichier.sql /// Et voilà, il n’y a plus qu’à voir les lignes défilées et à attendre.

Documentation d’un module toolbar en PHP objet

Catégorie : Projets | Laisser un commentaire

Je parle ici d’une toolbar, ou BBcodeBar, permettant d’utiliser facilement du BBcode (du BNcode pour être précis) lorsque l’on écrit un article ou que l’on poste sur un forum, un commentaire… (que sais-je encore !) Bref, quelque chose qui ressemble à ça : ((/public/Divers/toolbar.png|Exemple de toolbar|C|Exemple de toolbar, juil. 2009)) Voilà déjà pas mal de temps que j’utilise la même toolbar sur mes sites Internet. C’est une toolbar que j’ai créé et qui est basé sur une mod conçue à l’origine pour le système de forum [FluxBB|http://punbb.fr] (ex-PunBB) par [Vin100|http://forx.fr/]. A chaque fois, je la modifie et je galère pour l’intégrer correctement au site du momenet, et surtout je me retape tout le travail dès que je dois modifier quelque chose. Voilà pourquoi depuis quelques jours, quand l’envie me prend, je développe une version PHP objet de cette toolbar de façon à la rendre plus portable, plus paramétrable et aussi plus performante. J’approche désormais de la fin, et donc de la première publication d’une version 1. Voici donc un premier jet de documentation, entre autre, pour vérifier que rien n’a été oublié. !!!But * Créer une toolbar permettant d’utiliser facilement du BBcode (user friendly) * Créer un système de gestion de toolbars complet et paramètrable : génération de plusieurs toolbars, paramétrage du contenu des toolbars, désactivable ou désinstalable en 1 clic (surtout coder friendly) * Mettre en pratique mes connaissances en PHP objet, et améliorer celles en Javascript !!!Côté programmeur Le module toolbar est constitué d’une classe tout simplement nommée __Toolbar__. Une fois instanciée, cette classe contient toutes les attributs et méthodes nécessaire pour créer et utiliser des toolbars.%%% Certaines méthodes permettent une utilisation basique et simple de ce module : * traitement_administration() : permet d’afficher le module d’administration. * afficher_administration(option d’affichage encore à préciser) : permet d’effectuer les traitements du module d’administration. (à placer après la connexion à la BDD et avant tout affichage) * afficher_toolbar(‘nom_toolbar’) : permet d’afficher la toolbar ayant pour nom ‘nom_toolbar’. (le fichier correspondant sera @@tlb_nom_toolbar.php@@ dans le dossier de cache) Mais il existe d’autres méthodes pour effectuer des actions plus fines : * generer_cache_toolbar(nom_toolbar, id_textarea, chemin_img_bouton, chemin_img_smilie, nb_smilie, chemin_fichier_js) : permet de générer une toolbar. * generer_cache_smilie() : permet de générer un fichier de cache des smilies. * set_chemin_cache, get_chemin_cache : pour modifier et afficher la valeur de l’attribut cheminCache. (chemin vers le dossier de cache contenant le fichier de configuration, les toolbars générés, et les fichiers pour les pop up) Certains paramètres sont modifiables via la partie d’administration mais tous les paramètres systèmes (nom des tables, chemin vers le dossier de cache, …) ne sont modifiables qu’à l’aide de méthodes (@@set_table_bouton@@, @@set_table_smilie@@, @@set_fichier_config@@, @@set_chemin_cache@@, …) ou directement en modifiant la valeur des attributs concernés dans la classe @@Toolbar@@. !!!Côté administrateur !!Installation Une fois les fichiers du module copié au bon endroit sur un serveur, l’installation se fait facilement via la partie d’administration. Elle se résumé en la création de 2 tables MySQL @@tlbr_bouton@@, @@tlbr_smilie@@, et d’un fichier de configuration @@tlbr_param.php@@ (dans le dossier de cache) contenant les configurations par défaut. Le noms des tables, du fichier de configuration, ainsi que des configurations par défaut, peuvent être modifiés en changeant la valeur d’attributs de la classe Toolbar. !!Désinstallation La désinstallation se fait très facilement via la partie administration. Il suffit de supprimer les 2 tables MySQL @@tlbr_bouton@@, @@tlbr_smilie@@, ainsi que le fichier de configuration @@tlbr_param.php@@ (dans le dossier de cache). !!Gestion des paramètres par défaut Les paramètres par défaut sont : état du module toolbar (si le module est désactivé, toutes les toolbars seront désactivés), chemin vers le dossier où se trouvent les images des boutons, chemin vers le dossier où se trouvent les images des smilies, nombre de smilies à afficher sur la toolbar avant de mettre un lien « Plus d’infos » (si besoin), chemin vers le fichier javascript servant à afficher la toolbar.%%% Ce sont les paramètres utilisés par défaut lorsque l’on essait de générer une toolbar. Ils sont aussi utilisés lorsque l’on gère les boutons ou les smilies. !!Gestion des boutons et des smilies Les gestionnaires de boutons et de smilies permettent de créer une banque de données de boutons et smilies utilisable dans une toolbar et qui apparaitront dans une toolbar s’ils sont activés lors de sa génération. !Gestion des boutons Pour ajouter un bouton il faut : * Préciser son nom. Ce nom sera utilisé pour la balise BBcode (par exemple : \[nom]\[/nom]), et pour le fichier image correspondant (par exemple : nom.png). Vous pouvez préciser ce nom, ou uploader directement une image, le nom de l’image sera alors utilisé. Mais vous pouvez aussi uploader une image et préciser un nom (ne vous souciez pas de l’extension du fichier), l’image sera alors renommée. * Préciser son état. (activé ou non) * Préciser son type : bouton standard (ajoute simplement \[nom]texte\[/nom]), bouton Javascript (avec 1 ou 2 fenêtes Javascript possible dont le texte est paramètrable. Utile par exemple pour \[nom=texte]texte\[/nom]), bouton PopUp (ouvre le pop up nom.php du dossier @@include/@@. Un color picker est préintégré pour les valeurs color, et bgcolor. Un système d’upload est en cours de conception pour la valeur upload), bouton barre (affiche une barre suplémentaire d’icône lorsque l’on clique sur le bouton. Une barre de smilies est déjà configurée pour la valeur smilie. De même qu’une qu’une barre math pour la valeur math, si latex est installé) bouton séparateur (espace de 10px permettant de mettre en page sa toolbar) * Préciser un message d’aide. Il est possible de préciser plusieurs phrases d’aide en les séparant par des pipes (ctrl+alt+6 donne | ). La première phrase d’aide apparaitra au survol du bouton (par exemple :  »Mettre en gras : \[b]texte\[/b] »), la deuxième phrase d’aide apparaitra dans le première fenêtre Javascript (si bouton de type Javascript), la troisième phrase apparaîtra dans la deuxième fenêtre Javascript (si bouton de type Javascript). Les phrases d’aides peuvent aussi être utilisées dans les boutons de type PopUp. * Préciser l’ordre dans la toolbar. L’ordre est calculé automatiquement s’il n’est pas précisé. Les boutons créés sont modifiables et supprimables à la volet. (/!\ la suppression d’un bouton n’entraine pas la suppression de l’image correspondante) !Gestion des smilies Pour ajouter un smilie il faut : * Préciser son nom. Ce nom sera utilisé pour le fichier image correspondant (par exemple : nom.png). Vous pouvez préciser ce nom, ou uploader directement une image, le nom de l’image sera alors utilisé. Mais vous pouvez aussi uploader une image et préciser un nom, l’image sera alors renommée. Dans tous les cas, ne vous souciez pas de l’extension du fichier. * Préciser son symbôle. C’est-à-dire les caractères qu’il faut écrire (l’émoticône) pour ajouter un smilie à un message. Il est possible de préciser plusieurs symbôles en les séparant par des pipes (ctrl+alt+6 donne |). En effet, un fichier de cache des smilies est généré lors de la génération d’une toolbar et permet donc de créer automatiquement un programme de transformation d’émoticônes en smilies. (système encore non implémenté) * Préciser son état. (activé ou non) * Préciser l’ordre dans la toolbar. L’ordre est calculé automatiquement s’il n’est pas précisé. Les smilies créés sont modifiables et supprimables à la volet. (/!\ la suppression d’un smilie n’entraine pas la suppression de l’image correspondante) !!Générer une ou plusieurs toolbars Lors de la génération d’une toolbar (ce qui va générer en réalité un fichier tlbr_nom_toolbar.php dans le dossier de cache), il est possible de préciser des paramètres (qui sont pré-remplis avec les valeurs par défaut) : * chemin vers le dossier où se trouvent les images des boutons * chemin vers le dossier où se trouvent les images des smilies * nombre de smilies à afficher sur la toolbar avant de mettre un lien « Plus d’infos » (si besoin) * chemin vers le fichier javascript servant à afficher la toolbar. La toolbar générée va donc contenir tous les boutons et smilies activés au moment de sa génération, et utiliser le chemin vers les dossiers où se trouvent les images des boutons et des smilies, et le fichier Javascript, précisé au moment de sa génération. !!!Côté utilisateur L’utilisateur simplement une toolbar au dessus des champs textes dans lesquels il peut écrire. Lorsqu’il passe sa souris sur les boutons un message d’aide s’affiche et s’il clique dessus, l’action demandée s’exécute. Si l’utilisateur n’a pas activé Javascript, un message le prévient qu’il pourrait écrire plus facilement s’il l’activait. !!!Divers A la lecture de cette documentation, on voit que ce module fonctionne très bien tout seul et a été conçu pour s’implanter de manière transparente dans n’importe quel site Web. Cela dit, ce module ne se charge pas du parsage du BBcode. (ou similaire) On peut aussi remarquer que dans ce module, j’ai prévu la base pour pouvoir ajouter un système de parsage BBcode généré automatiquement. A vrai dire, j’ai un projet de BNcode (langage similaire au BBcode) déjà bien avancé, donc un couplage de ces 2 projets est tout à fait envisageable? !!!A faire * –Passer les valeurs par défaut du fichier de conf dans les attributs.– * –Ajouter un champ d’upload lorsqu’on modifie les smilies et les boutons– * –Etat désactivé du module– * –setCheminCache….– * –Erreur bouton espace– * –Cleaner appellation fichier config– * –afficher_administration(option d’affichage encore à préciser)– * –generer_cache_toolbar(‘tlbr_nom_toolbar.php’, ) -> refaire le nom si besoin– * cleaner la documentation et la procédure d’installation (en éparpillant moins les fichiers peut-être)