nyroBlog
Ban NyroBlog, by Nyro
Image by Nyro - ?

Categorie: Programmation


SlideShow FlickR, suite

Tellement énervé de mettre cet iframe sur mon blog que j'ai regardé du côté de l'API PHP que FlickR.

Et tellement les exemples sont simples et clair que je n'ai pu m'en empécher...

Donc, pour commencer, je code PHP :

$set = $_GET['set'];

$params = array(
'api_key' => 'YOUR_FLICKR_API_KEY',
'method' => 'flickr.photosets.getPhotos',
'photoset_id' => $set,
'format' => 'php_serial',
);

$encoded_params = array();

foreach ($params as $k => $v){
$encoded_params[] = urlencode($k).'='.urlencode($v);
}

function urlImg($farm, $server, $id, $secret) {
return 'http://farm'.$farm.'.static.flickr.com/'.$server.'/'.$id.'_'.$secret.'.jpg';
}

$url = "http://api.flickr.com/services/rest/?".implode('&', $encoded_params);
$rsp = file_get_contents($url);
$rsp_obj = unserialize($rsp);

if ($rsp_obj['stat'] == 'ok') {
$ret = "countArticle = 0;
var mySlideData = new Array();";
foreach($rsp_obj['photoset']['photo'] as $photo) {
$url = urlImg($photo['farm'], $photo['server'], $photo['id'], $photo['secret']);
$ret.= "mySlideData[countArticle++] = new Array('$url', '#', '".$photo['title']."', '');\n";
}
$ret.= "function startSlideshow() {
var slideshow = new timedSlideShow($('mySlideshow'), mySlideData);
}
addLoadEvent(startSlideshow);";
echo $ret;
} else {
echo "Call failed!";
}
?>

(Oups, pas de commentaires...)

Et ensuite, il suffit de l'appeler comme un fichier source JavaScript, en donnant en paramètre le set_id que l'onveut afficher et l'id de la div dans laquelle on veut afficher le SlideShow. Enfin, il faut que tous les éléments nécessaires au Smooth SlideShow soient présents, et c'est tout bon...

Le résultat :

 

Grosse requête MySQL, comment faire

Il arrive parfois qu'on est besoin de transférer énormément de données d'une base de donnée MySQL vers une autre (passage en production, changement de serveur...)

Or, ce qui arrive quelques fois dans ces cas-là, c'est que le fichier sql soit tellement gros qu'on ne peut pas l'envoyer via phpMyAdmin ou bien que le php mette trop de temps et arrive au timeout de la page... Bref, on n'y arrive pas. La solution utilisé quelques fois et le tranchage en parties du fichier sql et l'envoi par petits morceux : très laborieux.

La solution que je vous propose marche du tonnerre, mais uniquement si vous avez un accès SSH au serveur. Le principe est simple : vous allez envoyer votre fichier sql sur le serveur par FTP, puis l'exécuter directement avec la commande mysql. Et donc, voici ce que vous attendez tous, la commande à utiliser :

# mysql -h HOTE -u LOGIN --password=PASSE BASE < fichier.sql

Bien sûr, à vous de modifier HOTE, LOGIN, PASSE, BASE et fichier.sql selon ce que vous faites, mais ça, vous saurez le faire. J'ai déjà utiliser ce système sur Client Roi dans un script bash qui fait la mise à jour des données journalières. Et puis hier soir, c'était pour transférer la base de données des régions, départements, cantons et villes de France de mon EasyPhp vers le serveur de production.

Et si vous n'avez pas d'accès SSH, vous pouvez toujours créer un script PHP qui vous lira votre fichier.sql et vous exécutera N requêtes pas appel, mais c'est déjà plus contraignant...

JavaScript : Faire une infobulle

Pour un site en construction, j'ai du mettre en place une infobulle sur des images.

J'ai d'abord commencé par chercher à droite à gauche ce qui se faisait, pour voir si je ne pouvais pas trouver un script à réutiliser tout simplement.

Après bien des tests, aucun ne fonctionnait dans mon cas, dans un site tout en Div/CSS.

Donc, j'ai commencé par rechercher comment déplacer une div par rapport à la souris. J'ai trouvé ce dont j'avais besoin sur Tout Javascript. Enfin presque : le seul soucis de ce code, c'est qu'il ne tient pas compte des barres de défilement; autrement dit, si vous descendez dans votre page, votre 'infobulle' changera de place, mais en haut, et donc vous ne la verrez pas. Voici donc le code modifié :

function mouseMove (evt) {
	var x = 0;
	var y = 0;
	var plusX = 0;
	var plusY = 0;
	if (document.layers) {
		x = evt.x;
		y = evt.y;
		plusX = window.pageXOffset;
		plusY = window.pageYOffset;
	} else	if (document.all) {
		x = event.clientX;
		y = event.clientY;
		plusX = document.body.scrollLeft;
		plusY = document.body.scrollTop;
	} else if (document.getElementById) {
		x = evt.clientX;
		y = evt.clientY;
		plusX = window.pageXOffset;
		plusY = window.pageYOffset;
	}
	document.getElementById("popBox").style.left = (x+plusX+15)+"px";
	document.getElementById("popBox").style.top = (y+plusY+5)+"px";
} 
if (document.layers)
	document.captureEvents(Event.MOUSEMOVE); 
if (document.layers || document.all) 
	document.onmousemove = mouseMove; 
if (document.addEventListener) 
	document.addEventListener('mousemove', mouseMove, true);

Vous l'aurez compris, j'ai placé juste derrière mon une div vide avec comme id popBox, qui a comme attribut CSS position: absolute (et d'autres si vous en avez besoin...)

C'est quasiment fini. En effet, j'ai à ma disposition une div qui suit la souris tout le temps. Il ne me reste plus qu'à la cacher par défaut, et à l'afficher au survol des éléments qui doivent avoir une infobulle, et à y insérer le contenu que je veux. Dans mon cas, il s'agissait d'afficher un zoom sur une image au survol de sa vignette. J'ai donc décider d'afficher cette image dans une div invisible; de cette façon, le chargement de l'image commence avant que la personne passe dessus l'image. Et lorsque je dois afficher le contenu, je copie simplement le contenu de la div cachée dans ma div popbox. Le code :

function montre(id) {
 var elt = document.getElementById('popBox');
 elt.style.display = "block";
 elt.innerHTML = document.getElementById(id).innerHTML;
}
function cache() {
 var elt = document.getElementById('popBox');
 elt.style.display = "none";
}

La fonction montre est appellée sur le onMouseOver de l'image, avec en paramètre l'id de la div à recopier. La fonction cache est quant à elle appelée sur le onMouseOut de la même image.

Et voilà, une belle infobulle qui fonctionne super bien avec IE et FireFox.

PHP : envoyer un mail au format Texte et HTML

L'envoi des emails est souvent délicat, car on ne sait pas quel client mail utilise le destinataire : serait-il capable d'afficher l'HTML, ne prend-t-il en charge que le texte ?

Pour palier à ce problème, il existe une méthode simple qui permet d'envoyer le mail à la fois en Texte et en HTML, et le client mail choisir la partie qui l'intéresse.

Au début, je me suis beaucoup inspiré de cette fonction de Nexen qui marche bien dans la plupart des cas, mais pose encore des cas dans certains webmail (Free de mémoire).

Donc en cherchant un peu, je me suis mis à tester les emails dans tous les sens pour arriver à une fonction qui marche bien.

Il suffit donc d'avoir une variable pour le contenu en texte et une autre pour le contenu en HTML et le tour est joué. (En passant par une fonction qui le fait, c'est super rapide...)

Voici donc le bout de code (brut de pomme, c'est extrait d'une grosse classe...) : a vous de remettre ça en fonction ou de l'utiliser comme bon vous semble !

$site = "www.machin.com";
$from = "exp@machin.com";
$nom = "Expéditeur";
$to = "dest@machin.com";
$sujet = "Hello !";
$text = "Hello every Body !!!";
$html = "

Hello !

";

$from = $nom." <".$from.">";

$limite = "_----------=_parties_".md5(uniqid (rand()));

$header = "Reply-to: ".$from."\n";
$header .= "From: ".$from."\n";
$header .= "X-Sender: <".$site.">\n";
$header .= "X-Mailer: PHP\n";
$header .= "X-auth-smtp-user: ".$from." \n";
$header .= "X-abuse-contact: ".$from." \n";
$header .= "Date: ".date("D, j M Y G:i:s O")."\n";
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/alternative; boundary=\"".$limite."\"";

$message = "";

$message .= "--".$limite."\n";
$message .= "Content-Type: text/plain\n";
$message .= "charset=\"iso-8859-1\"\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";
$message .= $text;

$message .= "\n\n--".$limite."\n";
$message .= "Content-Type: text/html; ";
$message .= "charset=\"iso-8859-1\"; ";
$message .= "Content-Transfer-Encoding: 8bit;\n\n";
$message .= $html;

$message .= "\n--".$limite."--";
mail($to, $sujet, $message, $header);

Vous l'aurez compris, le contenu en texte doit être dans $text et celui en HTML dans $html Vous pouvez aussi modifié pour changer le mail de l'abuse (je ne sais pas si c'est bien efficace, si les anti-spam se base dessus à 1 moment donné ou pas.) Enfin, le fait de dire de quel site vient le mail permet d'éviter dans la plupart des cas d'être considéré par du spam par Hotmail.

Enfin, on fait la coupure entre les 2 mails (car c'est bien ça : un mail en texte et un mail en HTML dans un seul) grâce à Content-Type: multipart/alternative; boundary="$limite" qui indique que le mail contient différents formats et que ces parties sont délimités par $limite. Puis dans l'email en lui-même, après mettre la fameuse limite, on indique le type du mail (texte ou html). Et voilà le tour est joué !

Si vous avez des problèmes, des suggestions ou bien si vous utilisez ce bout de code, merci de laisser un commentaire ;)

MySQL : Procédures stockées

Depuis que j'ai découvert les procédures stockées sur SQL Server, j'attends ça sur MySQL avec impatience.

Avec la version 5 de MySQL, c'est disponible !