Affichage des articles dont le libellé est PHP. Afficher tous les articles
Affichage des articles dont le libellé est PHP. 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 ;)

jeudi 18 décembre 2008

[PHP] Hacher un mot de pass pour stockage LDAP.

Si vous souhaitez comme moi modifier un mot de passe utilisateur LDAP via un script PHP il vous faudra calculer le hach de son mot de passe. Un simple md5() ne suffisant voici la syntaxe à employer :

$newPassword = '{md5}' . base64_encode(pack('H*', md5($password)));

mardi 16 septembre 2008

[Linux] Appeler une page web à distance et à intervalles reguliers avec Cron, wget et htaccess

Pour le besoin d'un site internet les taches automatisées et planifiées sont très importantes. Sous linux ces taches s'appellent Cron. De plus les développeurs, pour la sécurité de leurs applications, protègent (et ils ont tout intérêt à le faire) leurs scripts d'automatisations par des .htaccess limitant l'accès à ceux ci par un système de login/mot de passe.
Si nous voulons automatiser l'exécution de ces pages l'une des méthodes est donc l'utilisation d'un cron. Nous utiliserons la commande wget pour récupérer la page et préciser les login/mot de passe.

Tout d'abord nous devons éditer nos taches cron. Pour ce faire :

Crontab –e
Vous arrivez dans la liste de vos taches. Par exemple vous pourriez avoir la mise à jour automatique de l'heure toute les heures avec la ligne :

# m h dom mon dow command
0 0 * * * ntpdate ntp.uhb.fr
(La première ligne est un commentaire elle n'est pas exécuté.)
Expliquons la configuration d'une nouvelle tache :
Le commentaire tout en haut nous donne la structure de rédaction d'une tache. Cette structure est la suivante :

Minute, Heure, Jour, Mois, Jour de la semaine, commande

Pour les minutes, heures, jours, mois et jours de la semaine vous pouvez spécifier une ou plusieurs valeurs ou une étoile correspondant à "tout". Ainsi pour effectuer une tache tout les mardis de janvier à minuit nous aurions :

# m h dom mon dow command
0 0 * 0 2 commande

Attention toute les valeurs commence à 0 et le jour de la semaine 0 est dimanche.
Comme vous l'avez compris le dernier paramètre est la commande à exécuter.
Vous pouvez aussi directement éditer les cron (qui sont stockés dans /etc/cron.d/) mais il vous faudra en plus renseigner le login de l'utilisateur qui exécutera la tache.
Enfin si vous voulez exécuter une tache plusieurs fois par heures (par exemple) il vous suffit de renseigner les valeurs séparé par des virgules comme ceci :

# m h dom mon dow command
0,20,30 0 * 0 2 commande

Ainsi la commande s'exécutera tout les mardi de janvier à minuit, minuit 20 et minuit 30.
Enfin si vous voulez exécuter une tache à intervalles réguliers par exemple toute les 2 minutes vous pouvez préciser */intervalle.

# m h dom mon dow command
*/2 * * * * commande

La commande s'exécutera toutes les deux minutes

Reste à renseigner la commande pour exécuter notre page. Nous utiliserons wget.
L'option –O redirige le flux.
L'option --http-user précise le login du htaccess
L'option --http-passwd précise le mot de passe du htaccess.
Enfin le dernier paramètre est la page à charger.
Ainsi :


0 18 * * * wget -0 /dev/null --http-user=admin --http-passwd=XXXXXX
www.site.com/cron/cron.php

Attention si vous référencer un site de la forme http://www.monsite.com/ qui est hebergé sur votre serveur noubliez pas de mettre, dans votre fichier hosts (/etc/hosts) une ligne du type :



127.0.0.1 www.monsite.com

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 !!

mercredi 10 septembre 2008

[PHP] Le design pattern : Singleton

Le design pattern du singleton permet d'avoir une seule et unique instance d'une classe dans un programme.

Le principe est simple : Nous créons une classe maClasse et nous spécifions son constructeur comme élément privé. Ainsi les utilisateurs de la classe ne pourrons pas l'instancier librement. Nous créons aussi une fonction getInstance(), publique cette fois, qui, elle, se chargera de retourner l'instance de la classe.


class maClasse
{
    private static $instance;

    private function __contruct()
    {
        // Instanciation
    }

    public static function getInstance {
        if( !isset(self::instance))
        {
            self::$instance = new maClasse();
        }
    return self::$instance;
    }

}

Notre variable $instance doit être de type static pour ne pas être supprimée à chaque fois ;)
Notre fonction getInstance est donc très simple :
Nous vérifions que l'instance à été déclaré sinon nous la créons et enfin la retournons !

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.

mardi 26 août 2008

[Flash] Faire communiquer Flash (AS3) et PHP

En actionscript 3 la communication avec PHP ne se fait plus avec LoadVars. Il faut utiliser la classe URLLoader.

// conteneur
var conteneur:URLLoader = new URLLoader();
// Fichier à charger
var fichier:URLRequest = new URLRequest("textes/script.php");

// CallBack fin chargement
function onComplete(e:Event):void
{
// Fini
}

// CallBack pendant le chargement
function onProgress(e:Event):void
{
// chargement en cour
}

// Lier l'événement chargement
conteneur.addEventListener(ProgressEvent.PROGRESS, onProgress);
// Lier l'événement fini
conteneur.addEventListener(Event.COMPLETE, onComplete);
// Chargement du fichier
conteneur.load(fichier);