nyroBlog
Ban NyroBlog, by Emi
Image by Emi - ?

Tag: Programmation


WikiJournal est en ligne

Wiki JournalSur certains projets, on s'investit tellement qu'on a envie qu'ils marchent.
Bien sûr, on passe par des phases de doutes, on ne sait pas trop si ça va marcher, on ne sait plus. Mais on fait quand même.

Ce projet est une commande de La Communication Directe, qui m'a trouvé sur google au mois de décembre dernier. Il m'a fourni un cahier des charges que j'ai lu et annoté pendant un week-end à Lyon. Retour sur Besançon pour lui faire un devis. J'étais en concurrence avec 2 autres entreprises (pas des freelance) : j'étais plus cher et plus long. J'ai eu le contrat car j'avais donné la sensation de maîtriser plus ses attentes que les autres. En effet, je travaillais déjà (et je travaille toujours) sur la refonte d'un site du même genre.

Parlons un peu du projet à proprement parlé : WikiJournal est un site national désireux d'être proche de vous. Pour cela, tous les contenus sont localisés par régions, départements et 'pays'; on peut consulter le site au niveau national ou bien au niveau de chaque région. C'est la vision du client. Dans ce journal, on y trouve des articles présentant les régions, ce qu'on peut y faire, etc... Il y a aussi des petites annonces gratuites pour vendre ou acheter ce que vous voulez, un agenda local pur annoncer vos manifestations ou trouver de quoi faire ce week-end et un annuaire professionnel pour trouver votre plombier.

Dans chaque partie, vous pouvez soit consulter les ajouts effectués par les utilisateurs par catégories et/ou par localisations, mais aussi en ajouter par des formulaires qui sont à la fois simples, concis et faciles d'utilisation. Tous les ajouts et modifications doivent être validés pour apparaître sur le site.
Pour ce faire, le client dispose d'une administration protégée, dont j'ai fait le graphisme depuis un design récupéré sur OSW. Voici le résultat :
Administration WikiJournal
Ici pour les petites annonces. Evidemment, il n'y en a pas beaucoup, le site vient tout juste d'être lancé.
Comme à mon habitude, j'utilise TinyMCE (que j'affectionne particulièrement) dans l'administration pour gérer des pages fixes du site, ou le contenu des articles.

Il y a beaucoup d'Ajax dans le site. Par exemple, pour recharger les liste déroulantes lorsqu'on sélectionne une nouvelle localisation. Ce n'est pas la première fois que j'en fait, mais c'est le premier projet où il y en a autant.

Un gros travail a été fait pour optimiser le référencement. Si vous regarder les URLS des pages de résultats, vous verrez par exemple ceci :
http://www.wikijournal.fr/articles,r11,Midi_Pyrenees.html
http://www.wikijournal.fr/articles,r16,Provence_Alpes_Cote_d_Azur.html
On ne sait pas encore trop ce que va donner cet URL Rewriting, mais c'est toujours plus beau que des paramétres passé en GET. Bien sûr, un travail similaire a été fait sur les titres des pages, qui reprennent à peu près le même principe.

De plus, tous les formulaires d'ajout de données (ou de contact) utilise un captcha fait maison pour éviter tout pourrisage par des robots malveillant. En voici un exemple :
Captcha

Et où gagne-t-il de l'argent ?
Il mise tout sur 2 choses :

  • Les Google Ads qui sont présentes un peu partout, plus ou moins dominantes. Personnelement, je les trouve pas vraiment envahissante.
  • Les bandeaux publicitaires, qu'il n'est pas encore possible d'acheter; ce sera possible un peu plus tard, quand le site aura grandi. Lorsqu'on achète un bandeau, la personne désirant affichée sa pub pourra sélectionné la partie du site, la catégorie de la partie, mais aussi la localisation où il veut afficher sa pub. Ainsi, il peut cibler ces affichages et avoir un retour sur les clics plus intéressants

J'ai aussi mis en place PhpMyVisites pour qu'il puisse suivre ses visite au jour le jour. Il commence déjà à regarder quelles recherches tapent les visiteurs qui arrivent son site, et à le paramétrer pour ne pas se prendre en compte dans les stats. Cet outil est vraiment adaptéà n'importe qui !

Sortie de TinyMCE 2.1.1

Une dernière verion du célèbre éditeur WYSIWYG TinyMCE vient de sortir.

Enormément de corrections de bug pour les liens, l'édition en plein écran et d'autres encore.
Quelques petits apports aussi, entre autres :

  • Ajout simpfilifé des vidéos de Youtube ou Google Vidéo en passant simplement l'URL de celle-ci
  • Les boutons d'annulation fonctionnement maintenant avec les plugins
  • Un nettoyage du code inutile et réécriture de certaines parties
  • Une nouvelle option qui permet de charger un fichier template, pas forcément sur le même site : il est donc possible d'utiliser un même fichier template pour plusieurs sites.

L'annonce de la sortie
Le changelog complet
TinyMCE

Backup d'une base de donnée MySQL

Quand on veut faire une sauvegarde d'une base de donnée MySQL, il n'y a pas 36 solutions.

Soit on prend son courage à 2 mains et on décide de se faire un script de backup manuellement. C'est long, et on est pas à l'abri d'oublier quelque chose, si on ajoute des tables par la suite.

Soit on se dit qu'une base de données, ce n'est que des fichiers et on décide de sauvegarder dans un tar gzippé le dossier contenant ces fichiers. Pour les remettre, c'est moins évident.

Soit on cherche un peu dans la doc MySQL et dans les commandes Bash commençant par mysql, et on découvre des choses toutes faites, qui, en une ligne, nous permettent de faire la sauvegarde de toute une base, voir de plusieurs.

Vous l'attendez tous, voici la ligne de commande :

mysqldump --user=LOGIN --password=PASSE --add-drop-table NOMBASE

Cette commande vous écrit toutes les requêtes MySQL à exécuter pour retrouver votre base de données. Le --add-drop-table permet d'ajouter les instructions de suppression de tables, si elles existent.

Là, je vous ai donné pour ne sauvegarder qu'une seule base. Pour en sauvegarder plusieurs, il faut remplacer NOMBASE par --databases NOMBASE1 NOMBASE2 NOMBASE3.

Pour sauvegarder toutes les bases de données, il faut remplacer NOMBASE par --all-databases.

Bon avec tout ça, vous allez avoir toutes les requêtes qui vont défiler sur votre écran. Pas très pratique pour restaurer... Un simple pipe vers un fichier pour sauvegarder le tout et le tour est joué :

mysqldump --user=LOGIN --password=PASSE --add-drop-table NOMBASE > FICHIER.sql

Enfin, pour restaurer, vous pouvez utiliser la technique que je vous ai déjà donné pour les grosses requêtes MySQL.

Validation W3C et JavaScript

Je me prenais la tête pour faire passer la validation W3C en XHTML 1.0 Transitional d'une page contenant un formulaire et ses vérifications javascript.

J'avais des erreurs dans mon javascript, sur cette ligne :

for (var i=0;i

Une simple boucle for en somme. La validation me disait que l'attribut length n'existait pas et que je n'avais pas le droit d'utiliser de ; à cet endroit.

En réfléchissant, j'ai compris qu'il m'interprétait mon comme un début de balise.

Donc, la solution pour pallier à ça est toute simple : il suffit d'inverser le test ! Ma boucle devient donc :

for (var i=0;champ.length>i;i++) {

Super simple, mais tellement pratique !

PHP/MySQL : Faire une pagination sur un tri aléatoire

J'ai été confronté tout à l'heure à un problème simple, mais qui peut poser problème : On vous demande de lister les éléments d'une table MySQL sur une page, et d'en faire une pagination. Tout ce qu'il y a de plus normal. Pour faire ça, vous allez jouer sur les LIMIT de votre requète.

Exemple :

SELECT * FROM utilisateur LIMIT 20,10

Où on afficherai la seconde page des utilisateurs, avec 10 affichages.

Maintenant, imagninez qu'on veuille trier cette requête selon les nom des utilisateurs. Il suffirait de faire :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY nom ASC

Bon, jusque là, pas de problème particulier.

Maintenant vous ne voulez pas un affichage trié par nom, mais aléatoire. Intuitivement, on ferait simplement :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY RAND()

Ce qui n'est pas totalement faux. Le problème avec cette solution, c'est que lorsque vous allez changer de page, le tri va changer, et il sera donc impossible aux visiteurs d'afficher tous les noms, ce sera complètement cahotique.

La solution consiste à générer un nombre aléatoire en PHP, à l'enregistrer en session, et à le passer à la requête MySQL, dans les parenthèses du RAND, et le tour est joué. Ainsi le nombre alétoire généré sera toujours le même pour la session en cours, et on se retrouver avec le même tri sur toutes les pages.

Le code pour générer et enregistrer le nombre aléatoire en PHP :

$rand = $_SESSION['rand'];
if (empty($rand)) {
srand((float)microtime()*1000000);
$rand = "0.".rand();
$_SESSION['rand'] = $rand;
}

Bien sûr, il faudra que la session soit démarrer avec session_start() plus haut et qu'aucun header n'ai déjà été envoyé (ou bien utiliser ob_start())

Enfin, la requête MySQL devient :

SELECT * FROM utilisateur LIMIT 20,10 ORDER BY RAND($rand)

Et voilà, vous avez une belle pagination avec un tri aléatoire.

English Version of this post