Archives mensuelles : novembre 2004

U2, pour une escale à Lyon?

On aimerait y croire Depuis une semaine je lis à droite à gauche que U2 pourrait faire escale à Lyon en Juin prochain pour un concert au stade de Gerland. Vraie rumeur ou fausse joie?

En tout cas, sur le forum des fans, il semblerait que la venu du Groupe Irlandais en terre des Gônes ne soit que pure utopie. En attendant d’en savoir plus, je reste à l’écoute.

Congratulations Sir Alex!

Sir Alex Ferguson

Mardi soir pour le compte de la 5ème journée du premier tour de qualification de la Ligue des Champions : Lyon se déplaçait à Manchester.

Les locaux ont fêté dignement le millième match de leur entraineur à la tête des Red Devils (victoire 2-1 face à l’OL). Cerises sur le gateau, les Mancuniens s’emparent de la première place du groupe D et mettent fin à la série d’invincibilité de l’Olympique Lyonnais en Champion’s League.

Lyon n’a pas démérité mais est tombé sur plus fort que lui. Maintenant les Gônes doivent se ressaisir pour un rendez vous capital samedi à Gerland. L’OL accueille les hommes de Guy Roux.

Allez l’OL et bonne continuation Sir Alex!

PS: Bravo à Monaco (1-0 face à Liverpool) et Bonne chance à Paris :D

PSS: France 1 – 1 Angleterre ^^

Mes excuses!

Je tiens à m’excuser pour le bazard qu’aurait pu produire mes fils RSS. Ils renvoyaient des liens bizarres et vos lecteurs pouvaient être amené à annoncer de nouveaux billets alors qu’il n’en était rien.

Tout est rentré dans l’ordre maintenant. L’erreur est corrigée ^^

A bientôt.

Pseudo Frames en pratique : includes sécurisés

En PHP, on a souvent recours à ce qu’on appelle communément les pseudo frames. Elles permettent de gagner un temps appréciable au niveau de la maintenance et également dans le travail d’intégration.
Il est fort possible d’aller plus loin et d’améliorer considérablement la maintenance, et c’est ce que nous allons voir.

Mise en situation

Rien de mieux qu’un exemple:

Essayons de mettre en place une documentation concernant quelques fonctions PHP. A chaque fonction correspondra une page dans laquelle il y aura une description la concenant.
Afin d’intégrer cette documentation au design général de mon site, j’utilise un système d’inclusion de fichier.
Les pages décrivant les fonctions seront quand à elles stockées dans un sous répertoire includes.


Voici la structure des fichiers:

Arborescence des fichiers

Méthode répandue

Le plus souvent voici comment les pseudos frames sont géréés:

	// Contrôle du paramètre passé via l'URL
	if (isset($_GET["page"])) {
		switch ($_GET["page"]) {
			case "in_array":
				$includePage = "in_array.inc.php";
			break;
			case "glob":
				$includePage = "glob.inc.php";
			break;
			case "str_pad":
				$includePage = "str_pad.inc.php";
			break;
			default :
				// Gestion de l'erreur : soit inclusion d'une page par défaut soit message d'erreur
			break;
		}
	}
 
	// Inclusion de la page demandée
	include "./includes/" . $includePage;

Il existe aussi une variante consistant à n’utiliser que des structures de contrôles à base de if ;-)

Dans les deux cas cela peut devenir vite complexe à gérer surtout si on a un grand nombre de pages à inclure. Aussi voici une technique pour que la quantité de pages ne soit plus un souci.

Quel est le tableau?

Après avoir au préalable adopté une norme pour les noms des pages – ici le nom de la fonction suivi de « .inc.php » – Il nous suffit de lister tous les fichiers répondant au filtre dans le répertoire includes. Les résultats seront alors stockés dans un tableau dans lequel nous aurons la liste de toutes les pages autorisés :D

Grâce à la fonction glob(), la moitié du chemin est faite. Ensuite il suffit de chercher si la page demandée est présente dans la liste ainsi générée.

	define("PATH", "./includes/");
	// Tableau contenant les pages autorisées
	$tableau = glob(PATH . "*.inc.php");
	if (isset($_GET["page"]) && in_array(PATH . $_GET["page"] . ".inc.php", $tableau)) {
		$pageInclude = PATH . $_GET["page"] . ".inc.php";
	}
	else {
		$pageInclude = PATH .  "default.inc.php";
	}
	include $pageInclude;

Grâce à cette méthode vous n’aurez pas à vous soucier du nombre de pages à inclure, il suffira de les nommer selon le masque défini.

Si vous vous sentez l’âme d’un « geek« , vous pouvez toujours écrire le code sous cette forme:

	define("PATH", "./includes/");
	// Tableau contenant les pages autorisées
	include (isset($_GET["page"]) && in_array(PATH . $_GET["page"] . ".inc.php", glob(PATH . "*.inc.php"))) ?  PATH . $_GET["page"] . ".inc.php" :  PATH . "default.inc.php";

Le résultat sera le même mais le tout tient sur deux lignes ::mrgreen.

Ne pas oublier

  • Pour voir l’exemple, cliquez ici
  • Télécharger l’exemple complet : ici
  • Je vous renvoi à ce petit tutorial d’ElMoustiko si vous désirez en savoir plus sur les pseudos frames.

Mise à jour

La moitié de ma vie: Half Life 2 dans les bacs!

[imgLeft=Half Life 2]/img/blog/divers/half-life-2.jpg[/img] Voilà, il ne manquait que ça pour détruire ma vie de couple, pour me faire oublier mon rôle de père, pour ne plus répondre à ma mère au téléphone, pour fermer la porte à mes amis, et pour ne plus aller travailler …

Une re-révolution à n’en pas douter

Lorsque Doom 3 est sorti à la Fnac, je n’ai même pas bronché devant les stands dédiés au jeu. Et pourtant je suis de la génération de ceux qui ont fraggé à Doom 2 durant les heures de pauses sur les DX 486 de l’IUT. Mais le FPS qui m’a marqué à jamais reste bien sûr Half-Life. Je n’étais pas le seul à l’époque.

C’est donc toute une communauté voué au culte de Gordon Freeman qui prenait son mal en patience depuis l’annonce de la sortie d’Half-Life 2.

Ben voilà, ne rongez plus votre mal, sortez la CB et hop faites péter THE Artefact

De la maitrise de soi

Pour ma part, je ne vais pas l’acheter tout de suite. Je contrôle mes pulsions ^^

..

..

..

Euh non en fait ma carte graphique n’acceptera jamais de faire tourner ne serait-ce qu’en 640*480 ce jeu. Donc, j’attends le feu vert de ma banque … un jour… :(

Connaître ses backlinks

Ce matin en cherchant la barre Google pour mon IE, je suis tombé sur la page parlant des fonctions de Google. J’ai découvert une fonctionnalité très intéressante qui permet de rechercher les backlinks externes d’un site lambda.

Intéressant lorsqu’on désire savoir si un référenceur a bien fait son boulot ^^

Usage:

Dans le champ de recherche, tapez:

link:{URL_DU_SITE}

Connaître ses referers

En regardant mes statistiques, je me suis aperçu que beaucoup de visiteurs ont été amené sur mon blog après avoir tapé le mot clé « HTTP_REFERER » dans google. Ils arrivent donc sur une de mes pages qui affiche les backlinks de sutekidane. Voici donc un petit script pour les mémoriser :D

Voici un petit script que vous pouvez inclure à vos pages PHP. Il permet de créer un fichier par jour avec la liste des référants à votre site. Il filtre bien sûr les pages et ne sauvegarde que les URLs externes. Aucun intérêt en effet de prendre en compte vos liens internes :D


$refererInfo = parse_url($_SERVER["HTTP_REFERER"]);
$serverInfo = parse_url($_SERVER["HTTP_HOST"]);
if($refererInfo["host"] != $serverInfo["host"] && strpos($_SERVER["HTTP_REFERER"], $_SERVER["HTTP_HOST"]) === false) {
// Ouverture ou création d'un fichier avec la date du jour
$handle = fopen("r-" . date("ymd") . ".txt", "a");
// Sauvegarde du référant
fputs($handle, $_SERVER["HTTP_REFERER"] . "\n");
// Fermeture du fichier
fclose($handle);
}

Afficher un calendrier, en PHP et CSS

mEga (mEga-Box), m’a inspiré pour ce petit billet dans lequel je vous propose un petit script pour générer un calendrier en PHP et le mettre en page en CSS.

Présentation

Dans mon exemple j’ai séparé le code en un fichier index principal et trois fichiers à inclure (string.inc.php, calendrier.inc, calendrier.css). Le calendrier généré ne contient pas de tableau mais une liste d’éléments.

string.inc.php contient des fonctions de gestion de chaines:

	// fonctions utiles, $valeur représente une date au format AAAA-MM-JJ
	function getSecond($valeur) {
		return substr($valeur, 17, 2);
	}
 
	function getMinute($valeur) {
		return substr($valeur, 14, 2);
	}
 
	function getHour($valeur) {
		return substr($valeur, 11, 2);
	}
 
	function getDay($valeur)	{
		return substr($valeur, 8, 2);
	}
 
	function getMonth($valeur)	{
		return substr($valeur, 5, 2);
	}
 
	function getYear($valeur) {
		return substr($valeur, 0, 4);
	}
 
	function monthNumToName($mois) {
		$tableau = Array("", "Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aôut", "Septembre", "Octobre", "Novembre", "Décembre");
		return (intval($mois) > 0 && intval($mois) < 13) ? $tableau[intval($mois)] : "Indéfini";
	}

calendrier.inc.php, contient le script générant le calendrier:

	// Fonction pour afficher le calendrier
	function showCalendar($periode) {
		$leCalendrier = "";
		// Tableau des valeurs possibles pour un numéro de jour dans la semaine
		$tableau = Array("0", "1", "2", "3", "4", "5", "6", "0");
		$nb_jour = Date("t", mktime(0, 0, 0, getMonth($periode), 1, getYear($periode)));
		$pas = 0;
		$indexe = 1;
 
		// Affichage du mois et de l'année
		$leCalendrier .= "\n\t<h2>&raquo; " . monthNumToName(getMonth($periode)) . " " . getYear($periode) . "</h2>";
		// Affichage des entêtes
		$leCalendrier .= "
		<ul id=\"libelle\">
			\t<li>L</li>
			\t<li>M</li>
			\t<li>M</li>
			\t<li>J</li>
			\t<li>V</li>
			\t<li>S</li>
			\t<li>D</li>
		</ul>";
		// Tant que l'on n'a pas affecté tous les jours du mois traité
		while ($pas < $nb_jour) {
			if ($indexe == 1) $leCalendrier .= "\n\t<ul class=\"ligne\">";
			// Si le jour calendrier == jour de la semaine en cours
			if (Date("w", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == $tableau[$indexe]) {
				// Si jour calendrier == aujourd'hui
				$afficheJour = Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode)));
				if (Date("Y-m-d", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) == Date("Y-m-d")) {
					$class = " class=\"itemCurrentItem\"";
				}
				else {
					// 1 est toujours vrai => on affiche un lien à chaque fois
					// A vous de faire les tests nécessaire si vous gérer un agenda par exemple
					if (1) {
						$class = " class=\"itemExistingItem\"";
						$afficheJour = "<a href=\"\"?phpMyAdmin=f8aa7401db868c47ec1c5040c0d7b43d>" . Date("j", mktime(0, 0, 0, getMonth($periode), 1 + $pas, getYear($periode))) . "</a>";
					}
					else {
						$class = "";
					}
				}
				// Ajout de la case avec la date
				$leCalendrier .= "\n\t\t<li$class>$afficheJour</li>";
				$pas++;
			}
			//
			else {
				// Ajout d'une case vide
				$leCalendrier .= "\n\t\t<li>&nbsp;</li>";
			}
			if ($indexe == 7 && $pas < $nb_jour) { $leCalendrier .= "\n\t</ul>"; $indexe = 1;} else {$indexe++;}
		}
		// Ajustement du tableau
		for ($i = $indexe; $i <= 7; $i++) {
			$leCalendrier .= "\n\t\t<li>&nbsp;</li>";
		}
		$leCalendrier .= "\n\t</ul>\n";
 
		// Retour de la chaine contenant le Calendrier
		return $leCalendrier;
	}

Utilisation

Il suffit d’appeler la fonction showCalendar() en passant en paramètre le mois et l’année sous la forme YYYY-MM.

Pour le mois en cours:

	echo showCalendar(date("Y-m"));

Ne pas oublier

  • Pour voir la feuille de style, cliquez ici
  • Pour voir l’exemple, cliquez ici