dimanche 29 juillet 2007

PHP+gettext

Quand cela fonctionne, c'est facile. Le problème, c'est qu'il suffit d'un grain de sable pour que cela ne fonctionne pas et c'est impossible à débugger (cela fonctionne ...ou non). Comme d'habitude, je ne garantis pas que c'est exactement ce qu'il faut faire, mais ça fonctionne 'chez moi'... (remarquez les 'echo'; quand il y a une erreur, c'est le silence; quand tout va bien, on obtient un texte)

Sur Ubuntu/Dapper Drake/6.06, soit un fichier /var/www/tests/xgt.php

<html>
<head> </head>
<body>
<?php
echo setlocale(LC_ALL, "fr_BE.utf8")."<br/>";
echo bindtextdomain('xgt', './xoflocale')."<br/>";
echo textdomain('xgt')."<br/>";
print(_("coucou"));
?>
</body>
</html>

Quelques remarques :

  • Le 'fr_BE.utf8' se trouve dans la liste donnée par '$ locale -a'

  • Le répertoire './xoflocale' est relatif à l'endroit où se trouve le fichier .php; dans ce cas-ci : /var/www/tests/xoflocale/.

  • Le fichier de traduction se trouve alors en /var/www/tests/xoflocale/fr/LC_MESSAGES/xgt.mo


Le fichier 'xgt.mo' est généré comme suit

cd /var/www/tests
mkdir -p xoflocale/fr/LC_MESSAGES
# extraire les textes à traduire
xgettext -o xoflocale/fr/LC_MESSAGES/xgt.po xgt.php
#
cd xoflocale/fr/LC_MESSAGES
# éditer le fichier .po pour
# - changer CHARSET par UTF-8
# - mettre la traduction
# "coucou"
# "traduction de coucou"
msgfmt -o xgt.mo xgt.po

Ensuite, (probablement,) redémarrer 'apache'

sudo /etc/init.d/apache2 restart

Et, si tout va bien, http://localhost/tests/xofgettext.php donne

fr_BE.utf8
/var/www/tests/xoflocale
xgt
traduction de coucou


xof

vendredi 27 juillet 2007

PHP+mySQL

On suppose que l'on a une table 'code_postal' avec les champs 'code' et 'nom' dans une base de données locale...


<html>
<head>
<title>Simple Test mySQL/PHP</title>
</head>
<body>
<h1>Le plus simple...</h1>
<?php
$link = mysql_connect("localhost", "nom_utilisateur", "mot_de_passe");
mysql_select_db("nom_base_de_donnee", $link) or die(mysql_error());
$query = "SELECT * FROM `code_postal` order by 'nom'";
$result = mysql_query($query, $link) or die($query . " - " . mysql_error());

$nbResults = mysql_num_rows($result);
echo "Nombre de lignes : ". $nbResults;
echo "<br /><br />";

while ($tab = mysql_fetch_array($result))
{
echo $tab['code']." - ".$tab['nom'];
echo "<br />";
}
mysql_close($link);
?>
</body>
</html>


NB: Pour des raisons pratiques et de sécurité, il est préférable de mettre les paramètres 'user', 'password' et 'database' dans un fichier inclu, inaccessible via le web:


<-- fichier "messecrets.inc" -->
<?php
$db_user="monlogin";
$db_password="monmotdepasse";
$db_name="mabasededonnees";
?>

et de faire un

<?php
include("messecrets.inc");
?>


Pour créer un utilisateur sur mySQL, on peut simplement faire :

mysql -p -u root
mysql> grant select on mabasededonnee.* to monlogin@localhost identified by 'monmotdepasse';


Où 'root' est le super-utilisateur mySQL (ou, quelqu'un ayant les privilèges suffisants pour faire un 'grant select' sur 'mabasededonnee').

mardi 24 juillet 2007

La base d'AJAX : XMLHttpRequest()

Un exemple très (trop) simple d'utilisation de XMLHttpRequest() sous Firefox (*). Quand on clique sur 'click-me', la fonction click() va chercher la page supplement.php avec XMLHttpRequest(). Le résultat s'affiche dans une boîte d'alerte...


<html>
<head>
<title>Simplest AJAX</title>
<script>
function click()
{
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function()
{
if (xmlHttp.readyState == 4)
{
alert(xmlHttp.responseText);
var resp = xmlHttp.responseXML;
var z = resp.getElementsByTagName("tagada");
alert(z[0].childNodes[0].nodeValue);
}
}
xmlHttp.open("GET", "http://localhost/tests/supplement.php");
xmlHttp.send(null);
}
</script>
</head>
<body>
<h1>A (very) simple use of XMLHttpRequest()</h1>
<p style="background-color:yellow;" onclick="click()">click-me</p>
</body>
</html>


Avec, sur le serveur, supplement.php qui fournit une page de type 'text/xml' pour pouvoir utiliser responseXML.


<?php
header("Content-Type: text/xml");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
?>
<xml>
<tagada>
haha...
</tagada>
<tagb> Ho </tagb>
</xml>



(*) Pour IE et Firefox, il faut remplacer la ligne

var xmlHttp = new XMLHttpRequest();

par

var xmlHttp = null;

if(window.XMLHttpRequest) // Firefox
xmlHttp = new XMLHttpRequest();
else if(window.ActiveXObject) // Internet Explorer
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
else { // XMLHttpRequest non supporté par le navigateur
alert("Votre navigateur ne supporte pas les objets XMLHTTPRequest...");
return;
}

...Quand on peut faire simple...