Affichage des articles dont le libellé est Zend Framework. Afficher tous les articles
Affichage des articles dont le libellé est Zend Framework. Afficher tous les articles

mercredi 8 avril 2009

[Zend Framework] Validateur Alnum et Alpha : Autoriser les espaces.

Dans la documentation officielle il est dit :


51.2.1. Alnum

Retourne true si et seulement si $value contient seulement des caractères alphabétiques et numériques. Ce validateur inclue une option permettant la validation possible des caractères espace.
51.2.2. Alpha

Retourne true si et seulement si $value contient seulement des caractères alphabétiques. Ce validateur inclue une option permettant la validation possible des caractères espace.


Mais il n'est pas dit comment faire ! Alors voila comment faire :


->addValidator('Alnum', false, array('allowWhiteSpace' => true));


Bonne validation ;)

lundi 15 septembre 2008

[Zend Framework] Faire un join

Il se peut que vous rencontriez une erreur de type :
Select query cannot join with another table in /var/www/ etc ...

Ceci est du à Zend Framework qui n'autorise pas par défaut de faire une simple jointure sur une table sous jacente.

L'objet Zend_Db_Table_Select est destiné à sélectionner des données sur une table précise. Des jointures peuvent être faites, mais il n'est pas possible de sélectionner des colonnes ne faisant pas partie de la table sous jacente. Cependant, ceci aurait pu être utile dans certains cas, et l'objet Zend_Db_Table_Select possède une clause spéciale déverrouillant cette limitation. Passez la valeur false à sa méthode setIntegrityCheck. Il est alors possible de sélectionner des colonnes hors table. Attention toutefois, l'objet row/rowset résultant sera verrouillé. Impossible d'y appeler save(), delete() ou même d'affecter une valeur à certains de ses champs. Une exception sera systématiquement levée.

Pour enlever cette protection vous devez spécifier setIntegrityCheck(false) dans votre requête.

Par exemple pour une classe simple de récupération de news j'ai :
<?php

/**
* News
*
* @author Lermit
* @version 1
*/

require_once 'Zend/Db/Table/Abstract.php';

class News extends Zend_Db_Table_Abstract {

protected $_name = 'news';
protected $_primary = 'news_id';
protected $_dependentTables = array("Users");
protected $_referenceMap = array(
    'Reporter' => array(
    'columns' => 'user_id',
    'refTableClass' => 'Users',
    'refColumns' => 'user_id'
    )
);

/**
* getLast
* retourne les $numberOfNews dernières news à partir de $start
* @author lermit
* @version 1
* @param $numberOfNews nombre de news
* @param $start à partir de la n-ieme news
* @return les news
*/
public function getLast($numberOfNews,$start)
{
    $select = $this->select()
        ->setIntegrityCheck(false)
        ->from( array('n' => $this->_name), array('text','date','user_id'))
        ->join(array('u' =>'users'),'u.user_id=n.user_id','login')
        ->order('date DESC')
        ->limit($numberOfNews,$start);

    return $this->fetchAll($select);
}
}

Tout d'abord je spécifie le nom et la clef primaire de ma table puis les relations de jointure avec les autres tables.
$_dependentTable = tableau de la/les classe(s) de la(des) table(s) dépendante(s).
$_referenceMap = tableau de tableaux de dépendances. Chaque dépendance est listée sous la forme d'un tableau construisant comme suit :
'columns' => 'colonne de la classe courante',
'refTableClass' => 'classe de la table à joindre',
'refColumns' => 'colonne de la table à joindre'
Bref ma requête utilise bien ->setIntegrityCheck(false) ce qui m'enlèvera cette fâcheuse erreur !!

vendredi 5 septembre 2008

[Zend Framework] Generation de captcha avec ZF (anti bot)

Vous savez surement tous que le net fourmille de robots spammeur qui envahissent nos forums, nos boites mails, etc …
Pour luter contre ceux-ci on utilise des captcha, c'est le nom des petites images qu'on vous demande de recopier dans une textbox lors d'une inscription ou de ces questions qui vous demande la somme de deux et cinq. Bref c'est un mécanisme anti robot. Zend Framework, dans sa version 1.6 et supérieur, propose une manière d'en générer facilement et de les intégrer facilement avec Zend_Form.

Tout d'abord il faut créer un nouvel element captcha dans notre formulaire. Ceci ce fait facilement car ZF propose la classe Zend_Form_Element_Captcha.

$captcha = new Zend_Form_Element_Captcha(nom, param);

nom représente biensure le nom de votre élément et param un tableau avec les paramètres (en soit comme un élément normal!). Dans le tableau on peut rajouter l'option captcha qui va configurer notre captcha. Celle ci se décline aussi sous la forme d'un tableau qui se construit comme ceci :

'captcha' => array(
'captcha' => 'Type du captcha',
'wordLen' => Nombre de caractère à afficher,
'timeout' => Temps avant fin du captcha,
// Seulement dans le cas d'une image
'font' => 'Chemin vers la police de caractère',
'imgurl' => 'Ou seront stocker les images',
)
Le type du captcha peux être le suivant :
  • Image : Image comme on les connait
  • Dumb : directement le texte (Non sécurisé !)
  • Figlet : Lettre sous forme de dessin textuel. (Utile si vous n'avez pas accès à la librairie GD).
Enfin voila à quoi ceci peut ressembler :
$captcha = new Zend_Form_Element_Captcha('captcha', array(
'label' => "Copiez le code suivant :",
'captcha' => array(
'captcha' => 'Image',
'wordLen' => 6,
'timeout' => 300,
'font' => '../application/fonts/Candara.ttf',
'imgurl' => '/images/captcha',
),
));

jeudi 4 septembre 2008

[Zend Framework] Utilisation de la classe de traduction de ZF

Le Zend Framework (ZF) propose par défaut une classe de traduction très simple d'utilisation. Elle prend en compte de nombreux moyens de traduction comme les Array (PHP), CSV, Gettext, INI, TBX, TMX, Qt, XLIFF et XmlTm. Il est aussi possible de créer ses propres adaptateurs. Ici nous utiliserons Gettext car c'est le plus professionnel à mon gout. L'inconvénient est que le fichier de traduction est binaire et donc non lisible par l'homme et qu'il faut un logiciel pour générer ce fichier (il en existe des gratuits).

La classe de traduction de Zend Framework est Zend_Translate. La mise en place de la traduction se résume simplement à l'instanciation de cette classe. Ceci est fait comme ceci :

$translate = new
Zend_Translate('gettext','/languages/fr/LC_MESSAGES/lang.mo','fr');
Dans cette ligne nous créons tout d'abord un nouveau objet de type Zend_Translate. Le constructeur prend trois paramètres :
  • Le premier est l'adaptateur utilisé. Ici nous utilisons gettext mais vous pouvez très bien utiliser csv, tbx, …
  • Le deuxième paramètre est le chemin vers le fichier de traduction. Avec gettext il s'agit d'un fichier binaire d'extension mo.
  • Enfin le dernier paramètre est la langue chargé. Ici le français (fr).
Si vous avez plusieurs fichier de traduction (comme c'est souvent le cas !) il faut les ajouter avec

$translate->addTranslation('/languages/en/LC_MESSAGES/lang.mo','en');

A ce moment là vous pouvez déjà afficher vos messages. Pour cela il existe deux méthodes : La première avec la chaine d'origine, par exemple pour traduire 'Ma chaine à traduire' :

Print $translate->_("Ma chaine à traduire");
La deuxième à partir de l'id de la phrase traduite, par exemple pour la chaine traduite d'id 3 :

Print $translate->_(3);
Pour savoir dans quelle langue sera traduit notre phrase nous pouvons utiliser la méthode getLocale() qui retourne une instance de Zend_Locale ou un identifiant de localisation.

$langue = $translate->getLocale();
Pour spécifier la langue à utiliser il faut utiliser la méthode setLocale().

$translate->setLocale("en");
Pour améliorer les performances de l'application on peut spécifier à Zend_Translate un cache où il stockera des données pour y accéder plus rapidement. Ceci ce fait comme suit :

// Options du frontend et du backend
$frontendOptions = array('lifetime'
=> 7200, 'automatic_serialization' => true);
$backendOptions =
array('cache_dir' => '/tmp/' );
// Création d'un cache
$cache = Zend_Cache::factory(Core','File',$frontendOption,
$backendOptions);
// Spécifier à Zend_Translate le cache
Zend_Translate::setCache($cache);

Ainsi l'exécution sera plus rapide. Nous créons tout d'abord un cache en utilisant la factory de Zend_Cache. Les paramètres sont tout d'abord le frontend (ici Core) et le backend (ici File) suivit de leurs options. Ensuite nous spécifions à la classe Zend_Translate ce cache avec la méthode setCache.