Exemples
De Patchwork.
Dans chaque exemple, nous nous attacherons à donner un exemple simple et efficace. Chaque fois, nous donnerons le contenu de l'agent, le contenu du template ainsi que le rendu HMTL.
Sommaire |
Rappel de la structure de la variation de patchwork
un répertoire contenant les agents tel que l'agent index.php : /class/agent/index.php
un répertoire contenant les templates tel que le template index.ptl : /public/__/index.ptl
Le template permet de faire la mise en page, cela signifie que pour un template qui ne nécessite pas de traitement particulier, il n'est pas nécessaire de faire un agent correspondant.
Afficher une variable
Il existe des modificateurs de variables, cf. : Documentation#Les_modificateurs_de_variable
Afficher une variable générée dans l'agent
agent<?php class agent_test extends agent { function compose($o) { $o->foo= 'Hello World'; return $o; } }template
<!-- AGENT 'header' --> {d$foo} <!-- AGENT 'footer' -->
rendu
Hello World
Afficher une variable générée dans le template
agent Pas besoin d'agent ici
template<!-- AGENT 'header' --> <!-- SET a$foo -->Hello World<!-- END:SET --> {a$foo} <!-- AGENT 'footer' -->
rendu
Hello World
Les tableaux
Les tableaux simples
agent:<?php class agent_test extends agent { function compose($o) { $a = array( 'un' => 1, 'deux' => 2, 'trois' => 3 ); $o->boucle = new loop_array($a); return $o; } }template:
<!-- AGENT 'header' --> <!-- LOOP d$boucle --> {$KEY} : {$VALUE} <br /> <!-- END:LOOP --> <!-- AGENT 'footer' -->
rendu:
un : 1 deux : 2 trois : 3
Les tableaux plus complexes
Un tableau de tableau
agent:<?php class agent_test extends agent { function compose($o) { $a = array( array( 'prenom' => 'Pierre', 'surnom' => 'Pierrot' ), array( 'prenom' => 'Paul', 'surnom' => 'Paulo' ), array( 'prenom' => 'Jacques', 'surnom' => 'Jacquot' ), ); $o->boucle = new loop_array($a, 'filter_rawArray'); return $o; } }template:
<!-- AGENT 'header' --> <!-- LOOP d$boucle --> {$prenom} est surnommé : {$surnom} <br /> <!-- END:LOOP --> <!-- AGENT 'footer' -->
rendu:
Pierre est surnommé : Pierrot Paul est surnommé : Paulo Jacques est surnommé : Jacquot
Un tableau de tableau avec un affichage par catégories
ajouter dans config.patchwork.php
$CONFIG += array('DSN' => 'mysqli://user:password@localhost/dbname');
table CREATE TABLE `individu` ( `individu_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `prenom` varchar(255) NOT NULL, `nom` varchar(255) NOT NULL, PRIMARY KEY (`individu_id`), ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='les utilisateurs' ; -- -- Contenu de la table `individu` -- INSERT INTO `individu` (`individu_id`, `nom`, `prenom`) VALUES (1, 'Tartampion', 'Pierre'), (2, 'Bidule', 'Paul'), (3, 'Tartampion', 'Jacques');agent:
<?php class agent_test extends agent { function compose($o) { $sql = "SELECT nom, prenom FROM individu ORDER BY nom"; $o->boucle = new loop_sql($sql); return $o; } }template:
<!-- AGENT header' --> <!-- SET d$prevNom --><!-- END:SET --> <ul> <!-- LOOP d$boucle --> <!-- IF $nom != d$prevNom --> <!-- SET d$prevNom -->{$nom}<!-- END:SET --> </ul>{$nom}<ul> <!-- END:IF --> <li>{$prenom}</li> <!-- END:LOOP --> </ul> <!-- AGENT 'footer' -->
rendu:
Bidule * Paul Tartampion * Pierre * Jacques
Les formulaires
formulaire simple
agent<?php class agent_test extends agent { function compose($o) { $f = new pForm($o); $f->add('text', 'TEXT', array('maxlength' => 16)); //déclaration d'un champ de type texte de //longueur maximale 16 caractères $send = $f->add('submit', 'send'); //déclaration du bouton d'envoi du formulaire // déclaration du contenu qui sera renvoyé par le formulaire $send->attach( 'TEXT', 'Message si le champ est vide', 'Message si le champ est invalide' ); // gestion du formulaire if ($send->isOn()) { $data = $send->getData(); // récupération des données du formulaire // ici vous faites votre traitement Patchwork::redirect(); // Recharge la page en mode GET (évite les doubles soumissions et améliore l'ergonomie) } return $o; } }template
<!-- AGENT 'header' --> <!-- AGENT d$form --> <!-- AGENT d$f_TEXT _caption_="un champ texte" --> <!-- AGENT d$f_send _caption_="le bouton de validation du formulaire" --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->une variante afin de simplifier la lecture du template pourrait être :
<!-- AGENT 'header' --> <!-- AGENT d$form --> <!-- AGENT d$f_TEXT _caption_="un champ texte" AGENT d$f_send _caption_="le bouton de validation du formulaire" --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->
A vous de jouer!!
remplir les champs avec des valeurs par défaut
agent<?php class agent_test extends agent { function compose($o) { $valeurs = array( 'email' => 'toto@monfai.Com', 'pseudo' => 'toto1' ); $f = new pForm($o); $f->setDefaults($valeurs); // permet de remplir des valeurs par défaut dans les champs du formulaire $f->add('text', 'email', array('valid' => 'email')); $f->add('text', 'pseudo'); $send = $f->add('submit', 'send'); //déclaration du contenu qui sera renvoyé par le formulaire $send->attach( 'email', 'Veuillez renseigner votre email', 'Vous devez renseigner un email valide', 'pseudo', 'Veuillez renseigner votre pseudo', '' ); //gestion du formulaire if ($send->isOn()) { $data = $send->getData(); // ici vous faites votre traitement Patchwork::redirect(); } return $o; } }template
<!-- AGENT 'header' --> <!-- AGENT d$form --> <!-- AGENT d$f_email _caption_="Email" AGENT d$f_pseudo _caption_="Pseudo" AGENT d$f_send _caption_="Envoyer" --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->
rendu A vous de jouer!!
formulaire avec radio bouton
simple
agent<?php class agent_test extends agent { function compose($o) { $f = new pForm($o); $f->add('check', 'radio', array('item' => array( 1 => 'choix 1', 2 => 'choix 2' ))); return $o; } }template
<!-- AGENT 'header' --> <!-- AGENT d$form --> <!-- AGENT d$f_radio --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->
A vous de jouer!!
avec insertion d'image pour chaque choix
Ceci peut-être une solution pour choisir un avatar...
Postulat : les images sont de type .png, rangées dans le répertoire public/__/img/
Il nous faut créer un filtre afin d'attribuer a chaque choix d'image une valeur que nous pourrons récupérer en suite.
<?php class agent_test extends agent { function compose($o) { $images = array( array( 'image' => 'oiseau', 'radiovalue' => 1 ), array( 'image' => 'chat', 'radiovalue' => 2 ), array( 'image' => 'chien', 'radiovalue' => 3 ) ); $f = $this->form = new pForm($o); $o->boucle = new loop_array($images, 'filter_rawArray'); $o->boucle->addFilter(array($this, 'filterLoop')); // nous pouvons maintenant compléter le formulaire $send = $f->add('submit', 'send'); $send->attach('radiobox', '', ''); if ($send->isOn()) { $data = $send->getData(); // traitement des données Patchwork::redirect(); } return $o; } function filterLoop($o) { $o->f_radiobox = new pForm_check($this->form, 'radiobox', array('item' => array($o->radiovalue => ''))); return $o; } }template
<!-- AGENT 'header' --> <!-- AGENT d$form --> <table> <!-- LOOP $boucle --> <td> <img src="{~}img/{$image}.png" alt="{$image}" /><br /> <!-- AGENT $f_radiobox --> </td> <!-- END:LOOP --> </table> <!-- AGENT d$form _mode_='close'--> <!-- AGENT 'footer' -->
A vous de jouer!!
formulaire avec liste de sélection
agent<?php class agent_test extends agent { function compose($o) { $colors = array( 'Les couleurs' => array( (object) array( 'caption' => 'blue', 'style' => 'background-color: blue', 'disabled' => 'disabled', ), 'red', 'green' ) ); $f = new pForm($o); $f->add('select', 'select', array( 'firstItem' => '-- please select one --', 'item' => $colors, )); return $o; } }template
<!-- AGENT 'header' --> <!-- AGENT d$form --> <!-- AGENT d$f_select _caption_='select' --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->
A vous de jouez!!
Contrôle d'accès au site
un agent de contrôle
Nous allons nous appliquer à faire un agent de contrôle afin de s'assurer que l'utilisateur soit identifié afin d'accéder au site. Pour ce faire, nous allons créer un agent qui réorientera le visiteur sur la page d'identification:class/agent.php
<?php class extends self { protected $user; function control() { $user = SESSION::get('user'); if ($user) $this->user = $user; else Patchwork::redirect('login'); } }/class/agent/login.php
<?php class agent_test extends agent { // cet agent n'a pas besoin de control puisque c'est lui qui permet de récuperer les données pour le controle. // donc, création de la fonction control mais vide!! function control() {} function compose($o) { // declaration des elements d'un formulaire $f = new pForm($o); $f->add('text', 'email', array('maxlength' => 20)); $f->add('password', 'password'); $send = $f->add('submit', 'send'); $send->attach( 'email', 'Veuillez renseigner votre identifiant', '', 'password', 'Vous devez renseigner votre mot de passe', '' ); if ($send->isOn()) { $data = $send->getData(); // dans notre exemple d'acces a la base de donnée, nous utilisons PEAR::MDB2 $sql = "SELECT user,password FROM user WHERE email=" . DB()->quote($data['email']); $row = DB()->queryRow($sql); if ($row && Patchwork::matchSaltedHash($data['password'],$row->password)) //verification du mdp crypté { SESSION::set('user', $row->user); Patchwork::redirect('index'); } else Patchwork::redirect(); //pour rester sur la meme page } return $o; } }/public/__/login.ptl
<!-- AGENT 'header' --> <style type="text/css"> label { display:block; float:left; width: 180px; text-align: right; } input.text { width: 250px; } </style> <!-- AGENT d$form --> <!-- AGENT d$f_email _caption_="Identifiant" AGENT d$f_password _caption_="Mot de passe" AGENT d$f_send value="connection" _format_='%1' --> <!-- AGENT d$form _mode_='close' --> <!-- AGENT 'footer' -->
A vous de jouer!!
Header
Il est possible de personnaliser le header. Pour ce faire, il suffit de créer un template header.ptlCe template doit contenir au minimum la ligne suivante:
<!-- INLINE header -->
{* le contenu de votre header *}
- Insérer son fichier CSS
<!-- SET a$css-->{~}css/moncss<!-- END:SET INLINE header -->
- Personaliser le titre de la page
<!-- SET a$title-->Le titre de ma page<!-- END:SET INLINE header -->
- Inserer plusieurs fichiers CSS et/ou JS
<!-- SET a$head --> <link href="{~}css/mon_css1.css" rel="stylesheet" type="text/css" /> <link href="{~}css/mon_css2.css" rel="stylesheet" type="text/css" /> <script src="{~}js/mon_js1.js" type="text/javascript"></script> <script src="{~}js/mon_js2.js" type="text/javascript"></script> <!-- END:SET INLINE header -->
Dans le template 'footer', nous pouvons aussi le personnaliser. Comme le header il faut inclure le INLINE
template{* ici tout votre contenu du footer *}
<!-- INLINE footer -->
Tips
Se passer de index.php dans l'url
Tout d'abord, créer (ou bien modifier) un fichier .htaccess sur votre répertoire web .htaccess<Files maVariation>
ForceType application/x-httpd-php
</Files>
puis créer votre fichier maVariation dans le même répertoire, dont le contenu ressemblera à ce qui suit. Evidemment, il vous faut modifier selon le type d'installation de patchwork que vous avez choisi (dans ou hors répertoire web). maVariation <?php // Chdir to the directory of the application chdir('../patchwork/variations/maVariation'); require file_exists('./.patchwork.php') ? './.patchwork.php' : '../../patchwork.php'; // Path to root patchwork.php
Contourner les notices TZ non renseignées
dans le fichier .htaccess du répertoire web mettre la ligne suivante
php_value date.timezone "Universal" // Remplacer Universal par votre TZ. cf. http://php.net/manual/timezones.php
Un champ de recherche dans le header sur son site
ce moteur de recherche renvoi sur l'index du site, c.A.d que le traitement du moteur se fera dans index.php
agent header<?php class agent_test extends agent { function compose($o) { // Définition du formulaire de recherche $f = new pForm($o, '', false); $f->setPrefix(''); $f->action = Patchwork::__BASE__(); $f->add('text', 'q'); return $o; } }agent index
<?php class agent_test extends agent { public $get = 'q'; function compose($o) { // traitement de la recherche if($this->get->q) { // ici votre traitement de la recherche } // votre code return $o; } }template header
<!-- INLINE header --> <!-- AGENT d$form --> <!-- AGENT d$q autofocus=1 --> <!-- AGENT d$form _mode_='close' -->