Path_info sur dotclear2 et serveur dédié ovh

aucun commentaire - Post le samedi 14 juin 2008 a 00h01 - Script & BDD

Après avoir eu beaucoup de difficulté à mettre en place le path_info (méthode de lecture d'url) sur dotclear 2 de l'un de mes serveurs (ovh - release 2) dû au fait que la variable $_SERVER ne renvoi pas de donnée pour PATH_INFO ni pour ORIG_PATH_INFO, voilà ce qu'il faut faire :

Dans le .htaccess de la racine du site :

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?$1

Dans le fichier config.php du dossier inc/ remplacer :

// If you have PATH_INFO issue, uncomment following lines
if (!isset($_SERVER['ORIG_PATH_INFO'])) {
  $_SERVER['ORIG_PATH_INFO'] = '';
}
$_SERVER['PATH_INFO'] = $_SERVER['ORIG_PATH_INFO'];
par :
// If you have PATH_INFO issue, uncomment following lines
if (!isset($_SERVER['REQUEST_URI'])) {
  $_SERVER['REQUEST_URI'] = '';
}
$_SERVER['PATH_INFO'] = urldecode($_SERVER['REQUEST_URI']);

Et bien sûr mettre la méthode de lecture d'url de la configuration de votre blog à path_info et ne mettre que le nom du domaine avec le / à la fin dans l'url du blog (ex : http://blog.aurabox.com/). Une fois cela fait, tout devrait normalement fonctionner.

Recadrer une image en javascript et php

54 commentaires - Post le jeudi 11 janvier 2007 a 16h12 - Script & BDD

Voici un nouveau script permettant de recadrer une image directement à partir d’internet. Son fonctionnement est “relativement” assez simple, à partir de d’une page, le script javascript récupère la position du cadre de redimmensionnement selon x et y ainsi que la dimension du dit cadre. Il suffit ensuite de recadrer l’image avec imagemagick (ou GD) et ensuite si vous le souhaitez de la réduire afin d’avoir des vignettes de même taille et non déformé.

Pour vous rendre compre parfaitement de la possibilité de ce script, vous trouverez un exemple sur cette page : http://blog.aurabox.com/script/recadrer-image-javascript.html.

Pour récupérer le code javascript : http://blog.aurabox.com/script/function/recadrer-image-javascript.js

Le code HTML et du fichier CSS de la page :

//
// Fichier HTML
//
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 <link rel="stylesheet" href="styles.css">
 <script type="text/javascript" src="votre-fichier.js"></script>
</head>
<body onLoad="fnOnLoad();" onMouseDown="fnOnMouseDown();" onMouseUp="fnOnMouseUp();">

<div id="conteneur" style="background: url(adresse-de-votre-image.jpg) no-repeat; width: 500px; height: 500px; margin: 0 auto;">
 <div id="bloc_recadre" name="bloc_recadre" onMouseOver="fnOnMouseOver('bloc_recadre', 'conteneur');" onMouseOut="fnOnMouseOver();"></div> 
</div>

<form action="recadre-img-membre.form.php" method="post">
<br /><br />
CurrentX : <input type="text" id="sx" name="sx" value="" />
CurrentY : <input type="text" id="sy" name="sy" value="" /><br />
ConteneurX : <input type="text" id="ex" name="ex" value="" />
ConteneurY : <input type="text" id="ey" name="ey" value="" /><br />
<input type="submit" value="ok" />
</form>

</body>
</html>

//
// Fichier CSS
//
#bloc_recadre {
 width: 100px;
 height: 100px;
 position: absolute;
 background: url(transparent.png);
 filter: alpha(opacity=50);
 border: 1px solid #000;
}

Le code php utilisé pour le recadrage de l’image avec imagemagick :

<?php
// Avec création d'une miniature
$command_magick = "/usr/local/bin/convert +profile \"*\" adresse-de-votre-image.jpg -quality 100 -crop ".$_POST['ex']."x".$_POST['ey']."+".$_POST['sx']."+".$_POST['sy']." +repage +resize 100x100 adresse-de-votre-image-mini.jpg";
exec($command_magick);

// Sans création d'une miniature
$command_magick = "/usr/local/bin/convert +profile \"*\" adresse-de-votre-image.jpg -quality 100 -crop ".$_POST['ex']."x".$_POST['ey']."+".$_POST['sx']."+".$_POST['sy']." +repage adresse-de-votre-image-mini.jpg";
exec($command_magick);
?>

Le code php utilisé pour le recadrage de l’image avec GD 2 (Merci à Endorsen ;) ) :

<?php
//définition des variables
$base = "/home/aurabox/sd/blog/www/script/image/";
$imgfile = $base."image-gd.jpg";
$dest_small = $base."mini-image-gd.jpg";
$cropStartX = $_POST['sx'];
$cropStartY = $_POST['sy'];
$cropW = $_POST['ex'];
$cropH = $_POST['ey'];

// création des deux images temporaires
$origimg = imagecreatefromjpeg($imgfile);
$cropimg = imagecreatetruecolor($cropW,$cropH);

// résolution de l'image
list($width, $height) = getimagesize($imgfile);

// Crop
imagecopyresized($cropimg, $origimg, 0, 0, $cropStartX, $cropStartY, $width, $height, $width, $height);

// copie vers répertoire
imagejpeg($cropimg, $dest_small, 80);

// Début du redimensionnement
$thumb = imagecreatetruecolor(100, 100);
$source = imagecreatefromjpeg($dest_small);
imagecopyresized($thumb, $source, 0, 0, 0, 0, 100, 100, $cropW, $cropH);

// copie vers répertoire
imagejpeg($thumb, $dest_small, 80);
// Fin du redimmensionnement
?>

Pour ce qui est de la gestion de la taille de l’image, il suffit de modifier les dimmensions du style #bloc_recadre dans le fichier CSS.

Les 2 seuls bugs que j’ai avec pour l’instant sont :

  • L’impossibilité de déclarer un DOCTYPE transitionnal ou strict avec, sinon le recadrage ne fonctionne plus.
  • Le cadre de redimmensionnement peut dépasser si l’on commence à le tirer à partir du milieu de l’image vers à la droite d’image.

Il est sûrement possible d’améliorer ce script mais n’étant pas un super pro du javascript, je vous laisse faire. Pour ce qui est des idées d’utilisation d’un tel script, voici quelques idées :

  • Dans un site d’hébergement d’image afin de permettre aux internaute de redimmensionner l’image (avec une légère adaptation du script)
  • Dans l’envoi d’image sur téléphone portable (mais pour cela il faut quand même connaître les résolutions des écrans)
  • Ou alors tout simplement comme moi, dans l’admin de votre site afin de gérer plus facilement les images.

Je tiens quand même rendre à césar ce qui lui appartient, la base du script javascript est basé sur celui proposer sur javascriptfr à cette page : http://www.javascriptfr.com/codes/DRAG-AND-DROP-REDIMENSIONNEMENT_39451.aspx

Si vous utilisez ce script ou avez des idées d’amélioration, n’hésitez pas à laisser un commentaire ci-dessous pour voir ce que cela donne.

Calcul de l'age à partir de la date de naissance

aucun commentaire - Post le mercredi 20 décembre 2006 a 15h40 - Script & BDD

Dans le style de petite fonction intéressante et assez pratique en voici une qui permet de calculer l’age d’une personne. Pour cela 2 solutions se profil, une en php et une autre directement dans la requête sous MySql.

En php, il suffit juste de cette petite ligne :

echo floor((strtotime(’now’) - strtotime(’1990-12-20′)) / 31557600);

Elle vous retournera l’age d’une personne né le 20 décembre 1990, il est aussi possible de passer l’âge de différente façon grâce à la fonction strtotime (cf documentation sur la fonction).

L’autre méthode est de la calculer directement sous MySql, si vous récupérer la date de naissance à partir d’une base de données bien sûr.

SELECT TIMESTAMPDIFF(YEAR, DATE_NAISSANCE, CURDATE()) FROM MA_TABLE

Pour info, le temps de traitement (4 secondes pour plus de 500 000 enregistrements avec un update) sous MySql est très rapide donc n’hésitez pas à faire le calcul ici.

Limiter le nombre de checkbox coché

9 commentaires - Post le lundi 11 décembre 2006 a 15h41 - Script & BDD

Suite à un besoin pour le projet de site de rencontre j’ai eu besoin d’un petit script en javascript permettant de limiter le nombre de checkbox coché mais malheureusement n’ayant rien trouvé sur les sites de codes-source javascript (editeurjavascript, javascriptfr etc…) j’ai du développer le miens. Donc en voici la source pour ceux que ça intéresse :

//
// Fonction javascript
//
function limite_check(nom_champ, nbre_limit) {
var nbre = 0;
var nbre_check = 0;

nom = document.getElementById('form_profil').elements[nom_champ];
nbre_check = nom.length;

for(i = 0; i < nbre_check; i++) {
if(nom[i].checked == true)
nbre++;
}

if(nbre >= nbre_limit) {
for(i = 0; i < nbre_check; i++) {
if(nom[i].checked == false)
nom[i].disabled = true;
}
}
else {
for(i = 0; i < nbre_check; i++) {
if(nom[i].checked == false)
nom[i].disabled = false;
}
}
}
//
// Partie HTML
//
<form class="formulaire-profil" id="form_profil" action="form/profil-style.php5" method="post">
<p><b>Sortie</b> (3 choix maximum)</p>
<ul>
<li><input type="checkbox" name="champ[]" value="1" onclick="limite_check(this.name, 3);" /> Bowling / Billard</li>
<li><input type="checkbox" name="champ[]" value="2" onclick="limite_check(this.name, 3);" /> Bars / Pubs</li>
<li><input type="checkbox" name="champ[]" value="3" onclick="limite_check(this.name, 3);" /> Cinéma</li>
<li><input type="checkbox" name="champ[]" value="4" onclick="limite_check(this.name, 3);" /> Concert</li>
<li><input type="checkbox" name="champ[]" value="5" onclick="limite_check(this.name, 3);" /> Discothèque</li>
<li><input type="checkbox" name="champ[]" value="6" onclick="limite_check(this.name, 3);" /> En famille</li>
<li><input type="checkbox" name="champ[]" value="7" onclick="limite_check(this.name, 3);" /> Opéra</li>
<li><input type="checkbox" name="champ[]" value="8" onclick="limite_check(this.name, 3);" /> Restaurant</li>
<li><input type="checkbox" name="champ[]" value="9" onclick="limite_check(this.name, 3);" /> Spectacle de danse</li>
<li><input type="checkbox" name="champ[]" value="10" onclick="limite_check(this.name, 3);" /> Soirée entre amis</li>
<li><input type="checkbox" name="champ[]" value="11" onclick="limite_check(this.name, 3);" /> Soirée Télé</li>
<li><input type="checkbox" name="champ[]" value="12" onclick="limite_check(this.name, 3);" /> Théatre</li>
<li><input type="checkbox" name="champ[]" value="13" onclick="limite_check(this.name, 3);" /> Autres</li>
</ul>
<p><b>Cuisine 2</b> (3 choix maximum)</p>
<ul>
<li><input type="checkbox" name="champ2[]" value="1" onclick="limite_check(this.name, 3);" /> Chinoise</li>
<li><input type="checkbox" name="champ2[]" value="2" onclick="limite_check(this.name, 3);" /> Diététique</li>
<li><input type="checkbox" name="champ2[]" value="3" onclick="limite_check(this.name, 3);" /> Fast Food / Pizza</li>
<li><input type="checkbox" name="champ2[]" value="4" onclick="limite_check(this.name, 3);" /> Française</li>
<li><input type="checkbox" name="champ2[]" value="5" onclick="limite_check(this.name, 3);" /> Indienne</li>
<li><input type="checkbox" name="champ2[]" value="6" onclick="limite_check(this.name, 3);" /> Italienne</li>
<li><input type="checkbox" name="champ2[]" value="7" onclick="limite_check(this.name, 3);" /> Japonaise</li>
<li><input type="checkbox" name="champ2[]" value="8" onclick="limite_check(this.name, 3);" /> Mexicaine</li>
<li><input type="checkbox" name="champ2[]" value="9" onclick="limite_check(this.name, 3);" /> Végétarienne</li>
<li><input type="checkbox" name="champ2[]" value="10" onclick="limite_check(this.name, 3);" /> Chocolat et sucreries</li>
<li><input type="checkbox" name="champ2[]" value="11" onclick="limite_check(this.name, 3);" /> Glaces et crèmes glacées</li>
<li><input type="checkbox" name="champ2[]" value="12" onclick="limite_check(this.name, 3);" /> Autres</li>
</ul>
<p><input type="submit" value="Ok" /></p>
</form>

Les seuls choses susceptible de devoir modifié dans ce script sont l’id du formulaire “form_profil” dans les deux parties (javascript et html) et le nombre de case à cocher qui est configuré à 3 actuellement. L’avantage de ce script est surtout qu’il vous est tout à fait possible de mettre plusieurs groupes de checkbox sur la même page et de donner une limite différente pour chaque groupe.

Attention tout de même car ce script ne vous empêche pas de vérifier le nombre de checkbox cocher sur votre page de traitement de votre formulaire car une personne qui aurait désactivé le javascript sur son navigateur (environ 15%) pourrait tout à fait cocher toute les checkbox qu’il souhaite.