Exemples

De Patchwork.

Aller à : Navigation, rechercher

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.

agent
<?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.ptl
Ce template doit contenir au minimum la ligne suivante:
<!-- INLINE header -->
 
{* le contenu de votre header *}
Nous pouvons imaginer que nous voulons inclure notre fichier CSS afin d'avoir notre mise en page. Dans ce cas, nous ferons comme suit:
<!--
SET a$css-->{~}css/moncss<!-- END:SET
INLINE header
-->
<!--
SET a$title-->Le titre de ma page<!-- END:SET
INLINE header
-->
<!--
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
-->

Footer

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' -->
Outils personnels
Espaces de noms
Variantes
Actions
Navigation
Boîte à outils