Installation de l’API de paiement Sogenactif (ou SIPS) sur Boutik-one

Publié dans CMS | Laisser un commentaire

Ce billet intervient dans le cadre de mon travail. Il résume les actions à effectuer pour installer un système de paiement sécurisé sur le système d’e-commerce Boutik-one. Il n’a pas pour but d’expliquer franchement comment faire, mais agit plutôt comme une aide-mémoire pour moi (et pour vous peut-être) et me permet de mettre des mots derrière ce que je comprend. Le système d’e-commerce utilisé est Boutik-one. C’est plutôt codé à l’arrache et c’est assez dur à bien appréhender, mais le résultat est la : ça à l’air de fonctionner pas mal. L’API de payement utilisée est celle de la Société Générale : Sogenactif aussi nommée SIPS. Elle fournit un environnement sécurisé pour payer avec tout type de banque et de carte de crédit. C’est la première API utilisée pour sécuriser les paiements en ligne, suivi par celle du Crédit Mutuelle. (réputée plus difficile à installer) !

Où afficher le bouton

Payer par Sogenactif ? Dans le fichier /select_payment.php -> vers la ligne 512 il y a des tests pour savoir quels systèmes de payement doivent être affichés.

<?php
if($paypalPayment == "oui") { ... }

Il n’y a plus qu’à rajouter en dessous notre bloc « Payement par carte de crédit sécurisé » et le bouton correspondant qui nous amène à la page de Confirmation (par exemple sogenactif_payement.php) pour débuter l’accès aux pages sécurisées de Sogenactif. Pour rendre cela configurable via l’interface d’administration, il suffit de d’ouvrir le fichier /admin/site_config.php. Il y a 3 choses à modifier :
Continuer la lecture

Rendre __construct() comptatible PHP 4

Publié dans PHP objet | Laisser un commentaire

La méthode magique __construct() est apparue dans PHP5, par conséquent PHP4 (ou inférieur) ne la reconnait pas. Auparavant, au lieu d’utiliser __construct(), on utilisait une méthode qui portait le même nom que la classe elle-même. Donc pour avoir une compatibilité PHP4 et PHP5, on peut utiliser le code suivant :

<?php
class MaClass
{
  var $app;

  function MaClass($app)
  {
    $this->__construct($app);
  }

  function __construct($app)
  {
    $this->app = $app;
  }
}

Ainsi, si on est en PHP5, le __construct() est bien compris et utilisé. Si on est en PHP4 (ou inférieur), on utilise MaClass() qui utilise une nouvelle méthode que l’on définie : __construct().
Alors pourquoi ne pas laisser tomber __construct() et n’utiliser que MaClass()__construct() c’est l’avenir le présent. Un développeur de la boîte où j’ai effectué un stage m’a appris que si on est en PHP5, ce dernier va sauter sur le __construct() et lira ensuite plus tard le MaClass() (et donc le zappera), on gagne un peu de temps pour une exécution en PHP5. Par conséquent ce bout de code utilise les avantages du PHP5 et est compatible PHP4 (et inférieur) 😀

Modifier un thème Dotclear

Publié dans Dotclear | Laisser un commentaire

Hier soir, (un peu tard je l’avoue) je me suis dit que le design de ce blog était bien fixe et que cela rendait assez désagréable la lecture de mes codes d’exemple. Alors j’ai utilisé la fonction d’édition de thèmes de Dotclear pour modifier un peu le CSS du design GlossyBlue que j’utilise.

Je suis franchement étonné par la clarté du code CSS, je l’ai très rapidement pris en main, d’autant plus que la manière de coder (d’abord les balises d’usages body, a, hx suivi des parties principales header, page, content, footer, puis tout ce qui est relatif à de plus petites parties du design) ressemble fortement à ce que j’essaie de faire lorsque je code (avec plus ou moins de succès ;-)). La système d’édition est de plus bien construit : on ouvre un fichier, il apparait dans un textarea, on le modifie, on enregistre, reste à actualiser la page ! Simple, mais efficace. Bon alors c’est vrai qu’une petite coloration syntaxique, et une numérotation des lignes seraient super chouette (éh, ils le font bien chez Mozilla), mais bon, c’est pas vraiment fait pour ça ! Bref, j’ai rendu le design GlossyBlue extensible (pour le coup j’ai de la place. Peut-être un peu trop…), et le truc qui est pas mal avec Dotclear c’est que dans la galerie de thèmes, il y a aussi des gabarits de thèmes. On peut donc modifier la forme de son design assez rapidement et sans se prendre la tête.

Avec tout ça, il faudrait quand même que j’améliore un petit peu mon header.

Le clonage n’est pas une référence

Publié dans PHP objet | Laisser un commentaire

Aujourd’hui j’ai fini le cours de PHP 5 sur Developpez.com consacré au PHP objet. Il y a encore quelques trucs que je détaillerai dans les billets des prochains jours, mais en somme, mis à part mon problème avec self et parent, je pense avoir compris l’essentiel. Il se trouve que je suis actuellement en stage et que je vais avoir l’occasion de me confronter au framework maison de la boîte où je travaille, et, ô miracle, c’est un framework objet ! Il a l’air bigrement complet et bien fichu, mais aussi peut-être un petit peu compliqué pour moi… ça va être l’occasion de voir ce que j’ai compris ! Mais bref… parlons un peu de l’instanciation d’une classe et clonage d’objets.

Instanciation d’une classe et destruction d’objets

Lorsqu’on instancie une classe avec le mot clé new, on créé une référence de cette instanciation. Et si on fait une copie de cet objet avec le symbole =, on créé une nouvelle référence vers cette instanciation. Or pour supprimer une instanciation d’une classe, avec la fonction unset(), il faut que toutes les références de cette classe soient supprimées. Pour bien comprendre, reprenons l’exemple de Développez.com. Pour cela, il faut savoir que la méthode magique __destruct() est déclenchée lorsqu’on supprime une instance d’une classe.

<?php
class Blog {
  function __destruct()
  {
    echo 'Je me meurs !';
  }
}
$monBlog = new Blog();
$monAutreBlog = $monBlog;
echo 'Allons soldats, tuons monBlog !';
unset($monBlog);
echo 'Puisqu\'il résiste, éliminons donc son frère !';
unset($monAutreBlog);

Cet exemple affichera :

Allons soldats, tuons monBlog !
Puisqu'il résiste, éliminons donc son frère !
Je me meurs !

Continuer la lecture

Interfaces : plus utiles qu’il n’y parait

Publié dans PHP objet | Laisser un commentaire

C’est en regardant le détails des interfaces prédéfinies sur le Manuel PHP que j’ai mieux compris l’intérêt des Interfaces. Prenons comme exemple l’interface Traversable : elle signifie que les classes l’implémentant doivent pouvoir parcourir des objets avec foreach. Pour cela, il faut que les classes en question implémentent, par exemple, l’interface prédéfinie Iterator qui définit les itérateurs. Ces itérateurs doivent pouvoir utiliser les fonctions rewind (retour arrière), next (au suivant), current (position actuelle), etc… Et le manuel nous montre des exemples d’implémentations de ces interfaces.
En somme, j’ai envie de dire que les interfaces sont aux classes ce que sont les types aux variables en programmation « classique ». Un peu quoi… En structurant sa manière de programmer (en utilisant des types et/ou des interfaces) on diminue le risque d’erreurs ou de bugs, on améliore la lisibilité, la relecture et la réutilisation du code et ça : c’est quand même tout l’enjeu d’un code durable !!!
Ah, il est à noter qu’une interface peut hériter d’une autre. L’interface Iterator hérite de Traversable par exemple. Si on devait créer cette interface, on écrirait :

<?php
interface Iterator extends Traversable
{ }

Même syntaxe qu’avec les classes en fait !
Et une classe peut aussi implémenter plusieurs interfaces, alors pour faciliter l’écriture, il est possible de séparer les interfaces par des virgules :

<?php
class RecursiveCachingIterator extends CachingIterator implements Countable , ArrayAccess , Iterator , Traversable , OuterIterator , RecursiveIterator
{ }

Comme toujours, le Manuel PHP m’aura été d’une grande aide ! Je l’utilise beaucoup pour le procédural (i.e. la programmation non-objet), j’aurai dû y penser plus tôt pour l’objet !

Je me demande s’il est possible de définir une classe qui hérite de plusieurs autres classes en les séparant par des virgules. En théorie oui. Une classe ne peut hériter de plusieurs classes. Bref l’héritage multiple est impossible en PHP, mais l’interfaçage multiple existe. Nuançons cette seconde partie de ma sentence : une classe ne peut pas implémenter deux interfaces partageant des noms de méthodes.

Interface, les Mousquetaires sont toujours de la partie

Publié dans PHP objet | Laisser un commentaire

Je n’ai pas encore bien saisi l’intérêt des Interfaces dans la POO. Si je comprend bien, une interface liste toutes les méthodes que doivent impérativement « connaître » les classes si elles veulent implémenter cette Interface. Pour moi, cela permet de structurer légèrement le code (si on a plusieurs classes qui implémentent une Interface, il suffit d’aller voir cette Interface pour connaitre toutes les méthodes importantes), et … bah franchement, non, je ne vois pas. A voir…
On créé une Interface avec le mot clé interface ! Facile jusqu’ici 🙂 Puis il reste à préciser qu’une classe l’implémente avec le mot clé implements.

<?php
interface Joli
{
  public function design();
  public function autoCompleter();
}

class BlogDeBN implements Joli
{
  public function design()
  {
    echo 'Je suis un joli design !';
  }
  public function autoCompleter()
  {
    // Appel à l'auto-completer de Scriptaculous :D
  }
}

Des Interfaces sont prédéfinies en PHP, et il est possible de les connaitre à l’aide du code suivant :

<?php
print_r(get_declared_interfaces());

Qui affichera :

<?php
Array (
    [0] => Traversable
    [1] => IteratorAggregate
    [2] => Iterator
    [3] => ArrayAccess
    [4] => reflector
    [5] => RecursiveIterator
    [6] => SeekableIterator )

Il existe aussi des class prédéfinies :

<?php
print_r(get_declared_classes());

Qui affichera :

<?php
Array (
    [0] => stdClass
    [1] => __PHP_Incomplete_Class
    [2] => Directory )

Aero, l’aéroglisseur

Publié dans Geekeries | Laisser un commentaire

C’est un ami qui a fait ça avec des zamis pour son PPE (Projet Pluridisciplinaire Encadré) et ça vaut le coup d’oeil : [((http://ppe09.aero.free.fr/pub/signature%20email2.jpg))|http://ppe09.aero.free.fr]

Une seule et même fonction pour différents systèmes de gestion de base de données

Publié dans PHP objet | 3 commentaires

Je suis depuis longtemps déjà un féru utilisateur de FluxBB (anciennement PunBB), un système de forum bien fichu, valide W3C, très léger et donc configurable à souhait. En ce moment ce projet open source bat un peu de l’aile, mais de nouvelles mises à jours sortent encore assez régulièrement et la nouvelle version (attendue depuis des années) semble de nouveau repartir sur de bonnes bases. Mais bref, je parle de cela car FluxBB gère les bases de données MySQL, PostgreSQL (ou PgSQL) et même SQLite je crois. Pour se faire, au lieu d’avoir un switch ou des if else à chaque requête à effectuer, ils ont créé une class qui regroupe toutes les fonctions utiles (connect, query, fetch_array, …) et dans le code ils y font appelle après avoir instanciée cette class : $db->query, $db->fetch_array. Reste à sélectionner le type de sa base de données dans la partie administration et hop, on change de SGBD sans rien changer au code ! Pratique ! Je n’ai pas encore fini d’apprendre le PHP objet, mais j’avais envi de pratiquer un peu, alors sans regarder ailleurs, j’ai commencé à coder. Et voici une première version. Ma classe oublie surement pas mal de fonctions, et je n’ai pas pu la tester partout, et puis il manque la gestion des erreurs, j’aurai pu ajouter un compteur de requêtes, mais c’est ma première véritable class, alors soyez indulgent ^^

<?php
class Sgbd {
	public $nom;
	public function __construct($nom) {
		$this->nom = $nom;
	}
	public function connect($hote, $port, $nomBdd, $utilisateur, $mdp) {
		switch ($this->nom) {
			case 'pg':
			$requete = 'host='.$hote.' port='.($port == NULL ? '5432' : $port).' dbname='.$nomBdd.' user='.$utilisateur.' password='.$mdp;
			pg_connect($requete);
			break;
			default:
			mysql_connect($hote.($port == NULL ? ':3307' : ':'.$port), $utilisateur, $mdp);
			mysql_select_db($nomBdd);
		}
	}
	public function close() {
		switch ($this->nom) {
			case 'pg':
			pg_close();
			break;
			default:
			mysql_close();
		}
	}
	public function query($requete) {
		switch ($this->nom) {
			case 'pg':
			$result = pg_query($requete);
			break;
			default:
			$result = mysql_query($requete);
		}
		return $result;
	}
	public function fetch_array($result) {
		switch ($this->nom) {
			case 'pg':
			$arr = pg_fetch_array($result);
			break;
			default:
			$arr = mysql_fetch_array($result, MYSQL_BOTH);
		}
		return $arr;
	}
	public function fetch_row($result) {
		switch ($this->nom) {
			case 'pg':
			$row = pg_fetch_row($result);
			break;
			default:
			$row = mysql_fetch_row($result);
		}
		return $row;
	}
	public function num_rows($result) {
		switch ($this->nom) {
			case 'pg':
			$num_rows = pg_num_rows($result);
			break;
			default:
			$num_rows = mysql_num_rows($result);
		}
		return $num_rows;
	}
}
$sgbd = new Sgbd('mysql');
?>

Modifier le fichier à charger en premier sur un site Web

Publié dans Apache | Un commentaire

Habituellement, sur votre site Web vous avez un fichier nommé index qui se charge par défaut lorsque l’on arrive sur votre nom de domaine. Et vous avez peut-être remarqué que si vous avez un fichier index.html et un autre index.php, c’est généralement le index.html qui se chargera le premier. Mais tout cela est configurable dans Apache (si c’est le système que vous utilisez) en modifiant ou en ajoutant la ligne suivante dans un fichier de configuration d’Apache, par exemple : /etc/apache2/conf.d/nouveau_fichier.conf.

DirectoryIndex index.html index.php index.cgi nom_d_un_fichier.extension

Je vous laissez configurer votre indien préféré 😀
Merci à TC pour m’avoir fourni cette astuce bien pratique !

Fin de transfert des articles

Publié dans Informations | Laisser un commentaire

J’ai fini de transférer tous les articles de Joomla vers la nouvelle version de ce blog. Je suis assez satisfait de Dotclear pour l’instant, la mise en place du blog s’est fait assez rapidement, et ce CMS répond bien à ce que j’attendais. J’ai encore quelques soucis pour prendre en main le format du texte (wiki ou xhtml), il faut dire que j’ai tellement été habitué à d’autres outils qu’instinctivement j’aimerai faire les choses très différemment. Mais enfin, je m’y ferai bien un jour, sinon je coderai un système pour que Dotclear gère le BNcode. Il me reste encore à modifier le design du site (histoire de me l’approprier un peu), et de réussir à faire fonctionner Geshi pour coloriser mes exemples de code, et j’en aurai fini avec la mise en place de ce blog ! Ah, j’aimerai rajouter des smilies aussi 😀