Choisir la bonne librairie PDF en PHP

Générez des fichiers PDF via PHPIl y a un certain nombre de librairies PDF qui peuvent vous aider à générer des fichiers PDF via PHP : FPDF, TCPDF, DOMPDF, CEZPDF…

J’ai longtemps travaillé avec FPDF qui est une classe très légère (le fichier fpdf.php pèse 49ko), facile à implémenter mais avec des fonctions un peu basiques.

TCPDF m’a tout d’abord conquis parce qu’elle permet d’envoyer de l’HTML (tableaux, css,…) à la classe. Ceci est une grande avancée puisqu’il n’est plus nécessaire de définir les abscisses et ordonnées de toutes les informations à faire apparaître sur le PDF. Le tableau HTML est affiché comme dans une page Web. Elle offre aussi des outils de transformation qui permettent par exemple d’afficher du texte à 90 degrés, par exemple. Mais la classe TCPDF est beaucoup trop lourde : 963 ko. J’utilise des scripts AJAX pour générer une grande quantité de fichiers PDF et ces scripts doivent charger la classe de 1Mo à chaque AJAX call, ce qui rend le temps de génération des fichiers PDF extrêmement long. J’ai bien essayé d’alléger la classe et enlevant tous les commentaires mais il restait quand même un fichier de 500Ko à charger.

J’ai donc décidé de revenir à FPDF et ai trouvé une classe qui étend la classe FPDF pour autoriser la rotation de texte sur le fichier PDF.

Ce tuto décrira l’implémentation de la classe FPDF (et ses classes de rotation) dans le framework PHP Codeigniter 2.0.3.

Tout d’abord, téléchargez la classe FPDF. Vous la trouverez sur la page de téléchargement de http://www.fpdf.org. Avec la classe PHP fpdf.php, vous trouverez des tutoriels et des docs dans le fichier téléchargé.

Copiez simplement le fichier fpdf.php dans /Codeigniter_2.0.3/application/libraries/ et copiez le répertoire font/ dans /Codeigniter_2.0.3/application/third_party/fpdf/

Allez ensuite sur http://www.fpdf.org/fr/script/script2.php où vous trouverez 2 classes à copier dans le même répertoire libraries/ :

  • la classe FPDF_Rotate, une extension de la classe FPDF
  • la classe PDF, une extension de la classe FDPF_Rotate

En créant ces 2 classes dans Codeigniter, suivez bien les conseils de CI concernant la création de libraries. Au besoin, vous trouverez les fichiers attachés en bas de ce tutoriel.

Vous définirez ensuite le chemin vers le répertoire font de FPDF dans /Codeigniter_2.0.3/application/config/config.php :

//FPDF FONT DIRECTORY
$config['fonts_path'] = APPPATH.'third_party/fpdf/fonts/';

Enfin, dans votre controller, appelez simplement la librairie et définissez les items nécessaires :
define('FPDF_FONTPATH',$this->config->item('fonts_path'));
$this->load->library(array('fpdf','fpdf_rotate','pdf'));
$this->pdf->Open();
$this->pdf->SetFont('Arial', '', 12);
$this->pdf->SetDrawColor(0);
$this->pdf->RotatedText(10,40,'Hello World!',90);
$this->pdf->MultiCell(100,5,"Test\nSecond line");
$this->pdf->Output('./pdfs/test.pdf', 'F');

Vous pouvez télécharger les fichiers nécessaires : fichiers de la classe pdf

Webliography :

FPDF Class

TCPDF

DOMPDF

Un formulaire sous Codeigniter avec Ajax

codeigniterCodeIgniter (CI), le framework PHP, est passé à la version 2.0. Cette version a été réécrite pour fonctionner en PHP5 exclusivement : les helpers des versions antérieures étaient en PHP4. Une belle amélioration attendue en soi. Ce framework est léger et aide les développeurs à travailler plus vite. Cet article traitera de :

  • la configuration du framework
  • la création d’un formulaire de login avec requête Ajax.

1. installation de CI

Téléchargez la version 2.0 à partir du site http://codeigniter.com/. Décompressez l’archive et placez les fichiers dans un sous-répertoire de votre /www/. Quand vous chargez la page http://localhost:8888/codeigniter/, vous verrez la page suivante (j’ai installé CI sur ma machine locale et le port MAMP (solution Mac Apache-Mysql-PHP) par défaut est 8888. Si vous travaillez sous windows avec une solution WAMP http://localhost/codeigniter/ suffira :

Ouvrir Codeigniter dans votre navigateur

La page affichée est /application/views/welcome_message.php qui est chargée via /application/controllers/welcome.php. Ce contrôleur contient la classe Welcome qui est définie comme le contrôlleur par défaut dans /application/config/routes.php. Si vous voulez appeler ce contrôleur dans l’url, vous devrez utiliser http://localhost:8888/codeigniter/index.php/welcome. Dans cette url, index.php est le contrôleur principal de CI que vous trouverez dans le répertoire root /codeigniter/. Ce fichier devra rester mais vous pouvez l’enlever de l’url : pour cela :

  • ouvrez /config/config.php et changez le index_page : $config['index_page'] = «  »;
  • puis ajoutez un fichier .htaccess file à la racine de votre projet /codeigniter/ :

SetEnv MAGIC_QUOTES 0
SetEnv PHP_VER 5
Options +FollowSymlinks -MultiViews
RewriteEngine On
DirectoryIndex index.php
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule (.*) index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index\.php|images|robots\.txt|css)
RewriteRule (.*) index.php?/$1 [L]

Ainsi, vous activerez le Mod_rewrite d’Apache et serez capable de charger http://localhost:8888/codeigniter/index.php/welcome via http://localhost:8888/codeigniter/welcome.

Ouvrons maintenant quelques fichiers de configuration CodeIgniter pour configurer la connexion à la base de données et quelques autres points.

1.1. La structure des fichiers Codeigniter : un framework MVC

En jetant un oeil au répertoire /www/codeigniter/ vous constaterez la structure suivante :

Structure MVC des fichiers Codeiginiter

Comme vous les voyez, CI est un framework MVC :

  • le répertoire /application/ contient les fichiers de votre projet :
  • le répertoire /application/controllers/ contient les fichiers des contrôleurs (pour recevoir des informations et effectuer des requêtes aux modèles)
  • le répertoire /application/models/ contient les fichiers de requêtes à la base de données
  • le répertoire /application/views/ contient les vues (fichiers Html, formulaires,…)

Un autre répertoire important est /system/ : il contient tous les fichiers CI (librairies, helpers,…)

Les fichiers de configuration de CI se trouvent dans /application/config/. Ouvrez /config/config.php et changez les lignes suivantes :

  • site url : $config['base_url'] = « http://localhost:8888/codeigniter/ »;
  • index file : $config['index_page'] = «  »;

Puis ouvrez /application/config/database.php pour configurer les informations de connexion à la base de données :

  • $db['default']['hostname'] = ‘localhost’;
  • $db['default']['username'] = ‘root’;
  • $db['default']['password'] = ‘root’;
  • $db['default']['database'] = ‘codeigniter’;

et adaptez les valeurs à votre propre configuration.

Nous pouvons aussi charger des librairies ou helpers CI de manière automatisée. Vous ne devrez donc pas les ouvrir dans chaque contrôleur. Ouvrez /config/autoload.php et modifiez les lignes suivantes :

  • $autoload['libraries'] = array(‘database’); //pour charger la librairie CI de connexion à la base de données de manière automatique
  • $autoload['helper'] = array(‘url’,'form’); //pour charger les helpers url et formulaire

1.2. Configurer la base de données

Ouvrez votre navigateur et chargez PhpMyAdmin : http://localhost:8888/phpmyadmin/ puis exécutez les requêtes suivantes :
CREATE DATABASE codeigniter;
CREATE TABLE users ( user_ID int unsigned not null auto_increment primary key, username varchar(20), password varchar(32) );

2. Création du formulaire de login

Le formulaire Html que nous allons créer est simple. Codeigniter possède des librairies et helpers que vous trouverez dans le réperoire /system/. Nous avons précédemment chargé le helper « form » de manière automatique (en modifiant le fichier /application/config/autoload.php) pour nous aider à construire notre formulaire.

Créez le fichier /application/views/v_login.php (j’utilise le préfixe ‘v_’ pour différencier plus aisément les vues (‘v_’) des modèles (‘m_’) et contrôleurs (‘c_’)) :
<!DOCTYPE html>
<html lang="fr">
<head>
<title>Login</title>
<meta name="robots" content="index,follow" />
<meta name="description" content="Login" />
<meta http-equiv="Content-type" content="text/html; charset=iso8859-1" />
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<style type="text/css">
p { margin: 0; padding: 0; }
input.textbox { width: 120px;color: #777;height: 18px;padding: 2px;border: 1px solid #E5E5E5;vertical-align: top; }
input.button { width: auto;height: 22px;padding: 2px 5px;vertical-align: top; }
</style>
</head>
<body>
<?php
echo form_open('login');
?>
<div id="message">
</div>
<p>
<label for'username'>username</label>
<?=form_input(array('name'=>'email','value'=>'','class'=>'username textbox','style'=>'width:150px;'))?><br />
</p>
<p>
<label for'password'>password</label>
<?=form_password(array('name'=>'password','value'=>'','class'=>'password textbox'))?><br />
</p>
<p>
<?='<br />'.form_submit('submit','Login','id="submit"')?>
</p>
<?=form_close("\n")?>
</body>
</html>

Vous constatez que nous faisons ici appel à des fonctions du helper « form » : ‘form_open()’, ‘form_close()’ qui génèrent les <form> et </form>.

La balise <head> de cette vue contient aussi le lien vers le fichier Jquery.js dont nous aurons besoin pour faire fonctionner notre script Ajax : <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>

La div « message » sera utilisée pour afficher la réponse du script Ajax.

Le formulaire Html est prêt mais il nous faut maintenant créer le contrôleur qui chargera cette vue.

3. Création du contrôleur de login

Créez le fichier /application/controllers/c_login.php.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class C_login extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->library('form_validation');
}
function index() {
$this->load->view('v_login');
}
}
/* End of file c_login.php */
/* Location: ./application/controllers/c_login.php */

Le constructeur de ce contrôleur charge la librairie form_validation que nous utiliserons pour vérifier le contenu des champs du formulaire postés.

Pour charger ce contrôleur dans un navigateur, appelez la page http://localhost:8888/codeigniter/c_login

La méthode de ce contrôleur qui sera appelée par défaut est la méthode index() qui charge la vue du formulaire (v_login.php)

Pour que le contrôleur c_login devienne le contrôleur par défaut, et puisse être appelé http://localhost:8888/codeigniter/, vous devrez changer /application/config/routes.php et saisir c_login comme contrôleur par défaut :

$route['default_controller'] = « c_login »;

Si vous désirez que ce contrôleur soit accessible via http://localhost:8888/codeigniter/login, éditez /application/config/routes.php et ajoutez :

$route['login'] = ‘c_login’;

4. Création de la requête Ajax

Retournons maintenant au fichier /views/v_login.php.

Nous allons rédiger un script javascript qui :

  • s’exécutera lorsque l’utilisateur cliquera sur le bouton submit
  • n’enverra pas les données du formulaire au contrôleur via une requête http mais via une requête ajax
  • récupérera les contenus des champs du formulaire en javascript
  • passera ces valeurs au contrôleur via une requête Ajax

Ajoutez le code suivant juste avant la balise de fermeture </head> :

<script type="application/javascript">
$(document).ready(function() {
$('#submit').click(function() {
var form_data = {
username : $('.username').val(),
password : $('.password').val(),
ajax : '1'
};
$.ajax({
url: "<?php echo site_url('login/ajax_check'); ?>",
type: 'POST',
async : false,
data: form_data,
success: function(msg) {
$('#message').html(msg);
}
});
return false;
});
});
</script>

Jquery nous permet d’exécuter une fonction dès que le document DOM a été chargé : $(document).ready

Le script sera activé dès que l’utilisateur clique sur le bouton submit : $(‘#submit’).click : le signe # identifie l’attribut « id » d’un élément de la page (le bouton submit dans ce cas).

Puis nous stockons les variables du formulaire (username et password que nous récupérons grâce à la classe de style $(‘.username’)) dans l’array form_data. Cet array contient également la clé « ajax » avec « 1″ comme valeur. Cette valeur sera testée dans le contrôleur.

Puis vient la requête $.ajax qui contient le tableau suivant :

  • url : l’url vers laquelle la requête sera envoyée
  • type : les variables seront postées au contrôleur
  • data : l’array des variables à passer au contrôleur
  • success : ce que le script doit faire si la requête est réussie : le contrôleur renverra un commentaire qui sera affiché dans la div $(‘#message’).

return : false; est utilisé pour empêcher l’envoi du formulaire par http quand l’utilisateur clique sur le bouton submit.

Dans cet exemple, l’url « login/ajax_check » ne sera accessible que dans le cas où vous ajoutez le code suivant dans /config/routes.php :

$route['login/ajax_check'] = 'c_login/ajax_check';

5. La fonction ajax_check du contrôleur : création de la méthode de traitement des données reçues via Ajax

Nous créons ensuite une seconde méthode du contrôleur c_login : ajax_check() pour vérifier les données postées via Ajax.

function ajax_check() {
if($this->input->post('ajax') == '1') {
$this->form_validation->set_rules('username', 'username', 'trim|required|xss_clean');
$this->form_validation->set_rules('password', 'password', 'trim|required|xss_clean');
$this->form_validation->set_message('required', 'Please fill in the fields');
if($this->form_validation->run() == FALSE) {
echo validation_errors();
} else {
echo 'login successful';
}
}
}

Le script vérifie d’abord si la variable « ajax » est égale à ’1′. Si c’est le cas, nous utilisons la librairie CI de validation des formulaires pour vérifier les champs requis et afficher les erreurs de validation éventuelles.

6. Exécuter le script

Ouvrez Fifrefox et installez l’addon Firebug s’il n’est pas encore installé : https://addons.mozilla.org/fr/firefox/addon/firebug/

Cet addon vous permettra de vérifier pas à pas la progression de votre requête ajax. Lancez Firebug via Menu Outils / Firebug. Puis activez la console :

Firebug - console

Ouvrez la page de login : http://localhost:8888/codeigniter/login et cliquez sur le bouton « submit ». Vous verrez la réponse Ajax suivante :

Ajax response

7. Vérifier l’utilisateur dans la base de données : utilisation des modèles

Nous allons changer la méthode ajax_check du contrôleur c_login pour charger un modèle et vérifier si l’utilisateur existe dans la base de données :
function ajax_check() {
if($this->input->post('ajax') == '1') {
$this->form_validation->set_rules('username', 'username', 'trim|required|xss_clean');
$this->form_validation->set_rules('password', 'password', 'trim|required|xss_clean');
$this->form_validation->set_message('required', 'Please fill in the fields');
if($this->form_validation->run() == FALSE) {
echo validation_errors();
} else {
$this->load->model('m_access');
$user = $this->m_access->check_user($this->input->post('username'),$this->input->post('password'));
if($user == '1') {
echo 'login successful';
} else {
echo 'unknown user';
}
}
}
}

Ce script charge le modèle m_access, puis nous appelons la méthode check_user et lui envoyons les variables username et password.

Voici le modèle /application/models/m_access.php :
<?
class M_access extends CI_Model {
public function check_user($username,$password) {
$this->query = $this->db->select('COUNT(*)')->from('users')->where(array('username'=>$username,'password'=>$password))->limit(1)->get();
return $this->query->row_array();
}
}

Vous pouvez télécharger les fichiers : codeigniter

Code Igniter, un framework PHP

Choisir un Framework PHP pour développer des sites web peut vous faire gagner des efforts et du temps. Je ne désire pas écrire ici une liste exhaustive des avantages et inconvénients des différents frameworks PHP disponibles mais veut simplement mettre en évidence pourquoi je crois qu’ils valent la peine qu’on les essaie.

Dans mon cas personnel, le choix d’un framework PHP m’a aussi aidé à acquérir une meilleure pratique de programmation.

Code Igniter - PHP FrameworkKohana - PHP5 FrameworkZend Framework

Le framework avec lequel j’ai développé plusieurs projets Web est Code Igniter (v.1.7.2). J’ai aussi approché Kohana3 (pour le plaisir) parce que je cherchais un framework léger et PHP5 strict. Je n’ai pas approfondi Zend Framework parce qu’il m’a l’air un peu lourd et je cherche un système plus léger. Cela dit, produit développé par Zend Technologies Ltd., il est également une référence dans le domaine des Frameworks PHP.

Si vous ne vous êtes jamais frotté à un framework PHP et être prêt à jeter un oeil à oeil en quelques minutes, visionnez un des tutoriels vidéos officiels sur http://codeigniter.com/tutorials/ : absolument convaincant!

Au départ, j’étais assez frileux de choisir un framework et préférais coder mes propres scripts parce que je pensais qu’un framework me forcerais à utiliser une pratique de programmation que je pourrais regretter ultérieurement (utiliser des règles de programmation propres au framework, efficacité à long terme,…). Tel était mon état d’esprit avant d’en avoir essayé un.

Après ma première expérience avec Code Igniter, j’ai changé d’avis et pense désormais que les framework nous facilitent la vie. Et même si le framework que j’ai choisi n’était plus développé, je pourrais aisément en choisir un autre pour développer mes sites web sans devoir révolutionner ma pratique.

Selon moi, ce qui rend un framework crédible, efficace est :

  • un framework PHP5
  • une architecture MVC (Modèle-Vue-Contrôler)
  • un lot de helpers (scripts qui vous font gagner du temps car ils contiennent des classes pour gérer les urls ou les éléments de formulaire, par exemple)
  • la possibilité de scripter vos propres contrôleurs, vos propres bibliothèques de classes, vos propres helpers
  • une pratique bien documentée (off- et/ou online)
  • un système léger (donc au chargement rapide)

Tout est une question de puissance…

PHP5-powered

La puissance de framework PHP5 comme Kohana est qu’ils sont strictement OOP (Object Oriented Programming), signe d’une meilleure pratique de programmation. Code Igniter est partiellement écrit en PHP5 OOP, les helpers n’incluent pour l’instant que des fonctions PHP4.

MVC-powered

Une architecture MVC vous permet de structurer votre code : vos scripts PHP ne sont plus mêlés à votre HTML et vos requêtes MySql comme ils l’étaient dans des scripts faits maison sans framework. Dans une architecture MVC, vous pouvez définir des répertoires spécifiques qui contiendront vos classes de contrôleurs, vos classes de modèles et vos vues. Pratiquement parlant, une page Web appellera un contrôleur. Ce contrôleur peut définir des variables, appeler un modèle qui se connectera à la base de données pour en extraire des données, par exemple. Donc, le modèle exécute une requête MySql, obtient les données de la base de données et renvoie le résultat au contrôleur. Le contrôleur passera ensuite les résultats à la vue qui est comme un template HTML.

MY_Controller.php : écrire vos propres contrôleurs

Un Framework PHP vous laisse scripter vos propres contrôleurs. Dans Code Igniter, le contrôleur principal se trouve dans /system/libraries/Controller.php. Pour utiliser votre propre contrôleur, créez un fichier dans /system/application/libraries/MY_Controller.php. Ce fichier contient une classe MY_Controller qui étend le contrôleur principal :

<?php if ( ! defined(‘BASEPATH’)) exit(‘No direct script access allowed’);
class MY_Controller extends Controller {
public function __construct() {
parent::__construct();
$this->load->helper(array(‘my_html’,'my_url’,'my_date’));
}
}
?>

Mon contrôleur personnel charge le constructeur du contrôleur principal puis charge quelques helpers. Ces helpeurs ne sont pas les helpers par défaut de Code Igniter qui se trouvent dans /system/helpers/ mais mes propres helpers réécrits : my_html_helper.php, my_url_helper.php et my_date_helper.php qui sont des copies des helpers originaux auxquels j’ai ajouté quelques fonctions personnelles.

Développer des sites Web avec Code Igniter m’a permis d’écrire des scripts très courts, faciles à mettre à jour et redoutablement efficaces.

Webliography

Code Igniter

Code Igniter Video Tutorials

Code Igniter Tutorials

Derek Allard’s tutorials

Kohana