Grosse mise à jour de ma librairie PHP Json-heitz

Le logiciel Heitz System expose toujours une API avec laquelle on peux discuter via JSON. Je vous avais déjà présenté la première version de cette class ici.

Elle rencontre un petit succès 162 téléchargements aux dernières nouvelles sur Packagist.

Pour l’invoquer, voici comment faire :

<?php
require_once 'vendor/autoload.php';

    use JsonHeitz\JsonHeitz;
    use JsonHeitzCredential\Credential;
    use JsonHeitz\JsonHeitzException\JsonHeitzException;

try {
        $connect = (new Credential())
                ->setPort(80)
                ->setUserLogin('test1@heitzsystem.com')
                ->setUserPass('1')
                ->setHost('http://heitz.no-ip.com')
                ->setHostPassword('AuthentificationBaseTest')
                ->urlWebServeurHeitz()
        ;
    } catch (JsonHeitzException $exc) {
        echo $exc->getMessage();
    }

    try {

        $call = (new Query($connect))->setConnectHeitzAPI()
            //    ->setDebug(true) //optional
        ;

        $resultat = $call->callWSHeitz();

        $call->setIdSession($resultat->idSession)
                ->setIdClient($resultat->idClient);


        var_dump($call->getOneClient());
        var_dump($call->getTaskList());
        var_dump($call->getTest());
        var_dump($call->getFormTraining());
        var_dump($call->getActiveReservation());
        var_dump($call->getConfigServeur());
        var_dump($call->getBilan());
        var_dump($call->getTest());
        var_dump($call->getClientMessage(10));
        var_dump($call->getListOfActiveAccess());
        var_dump($call->getListOfPassages());
        var_dump($call->getArrowPoints());
        var_dump($call->getTaskGroup());
        var_dump($call->getPlaceForTheTask());
        var_dump($call->getListOfFinancialDeadlines());
        var_dump($call->getListOfLevies());
        var_dump($call->getListOfBills());
        var_dump($call->getListOfFinancial());
        var_dump($call->getListOfFinancialDeadlines());
        var_dump($call->getListOfLevies());
        var_dump($call->getListOfPoints());
        var_dump($call->getListOfCures());
        var_dump($call->getListOfActiveAccess());
        var_dump($call->getAllArticles());
        var_dump($call->getAllCity());
        var_dump($call->getAllCivility());
        var_dump($call->getAllJobs());
        var_dump($call->getAllWhereTheCustomerHasPracticed());
        var_dump($call->getAllMotivation());
        var_dump($call->getAllVAT());
        var_dump($call->getAllPayment());
        var_dump($call->getAllWayToKnowTheInstitution());
        var_dump($call->getAllTypeOfProspects());
        var_dump($call->getAllDiscountLevel());
        var_dump($call->getAllCustomerGroup());
        var_dump($call->getAllEmployee());
        var_dump($call->getAllFamilySituation());
        var_dump($call->getArrowPoints());
        var_dump($call->getDetailOfCures());
        var_dump($call->getCriterion1());
        var_dump($call->getCriterion2());
        var_dump($call->getCriterion3());
        var_dump($call->getCriterion4());
        var_dump($call->getCriterion5());
        var_dump($call->getDashboard('01-03-2012', '01-03-2013'));
        var_dump($call->getDashbordFinancial('01-03-2012'));
        var_dump($call->getFinancial());
        var_dump($call->getFormTraining());
        var_dump($call->getScheduleSEPA());

        $sale = array(
            'vente'     => '{"ventes":[{"idArticle":300024225, "idTva":0, "quantite":3, "prixUnitaire":12.34},
                                                   {"idArticle":300185150, "idTva":0, "quantite":2, "prixUnitaire":987.654}]}',
            'reglement' => '{"reglements":[{"idMode":1, "montant":12.34},
                                        {"idMode":3, "montant":987.654},{"idMode":2, "montant":122.3}]}'
        );
        var_dump($call->addSale($sale));

        $search = array(
            "idClientRecherche" => '',
            "nom"               => 'sa%',
            "prenom"            => '',
            "secondPrenom"      => '',
            "email"             => '',
            "idCivilite"        => '',
            "naissance"         => '',
            "telephone"         => '',
            "portable"          => '',
            "idVille"           => '',
            "idSituation"       => '',
            "idProfession"      => '',
            "dateCreation"      => '',
            "contactSMS"        => '',
            "contactEmail"      => '',
            "contactCourrier"   => '',
            "contactTelephone"  => ''
        );

        var_dump($call->searchClient($search, 1));
        var_dump($call->getClientIdByEmail('toto@toto.fr'));
        var_dump($call->clientWithAnActiveSpecificAccess(1018874, 16485527));
        var_dump($call->accessListForAClient(19435255));
    } catch ( JsonHeitzException $exc) {
        echo $exc->getMessage();
    }

Et voila, @Bientôt Grand Maître L

SgAutoRepondeur avec composer

J’ai développé une petite classe en PHP pour utiliser facilement l’API de SGAutoRépondeur.

Elle est bien-sûr disponible pour tous sur mon Bitbucket. Elle respecte les conventions PSR-4 pour l’auto-chargement des classes et ça c’est important !!!

Pour information, voici comment l’utiliser :

<?php
require_once 'vendor/autoload.php';

try {
    $monTest = (new \SgAutoRepondeur\SgAutoRepondeur())
            ->setCodeActivationClient('1010201000162121718617151918911')
            ->setMembreID('32')
            ->setInscriptionNormale('non')
            ->setEmailSG('sebastienXXX_@hotmail.com')
            ->setListeID('779')

    ;
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

try {
    $userSG = (new \SgAutoRepondeur\User\User())
            ->setEmail('tutu@tutu.fr')
            ->setNom('Dupont')
            ->setPrenom('Jean')
            ->setAdresse('125 rue de nulle part')
            ->setPays('France')
            ->setAnneeNaissance('1979')
            ->setMoisNaissance('01')
            ->setJourNaissance('10')
            ->setVille('lyon')
            ->setIp('192.168.1.236');

    $monTest->setFields($monTest, $userSG);

  //  var_dump($monTest->getFields());
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

try {
    var_dump( $result = (new SgAutoRepondeur\ResponseDictionary\ResponseDictionary())
        ->value( $monTest->callWebService($monTest->getFields()) ));
} catch (SgAutoRepondeur\SgException\SgException $exc) {
    echo $exc->getMessage();
}

Pour avoir plus d’informations sur l’autorépondeur et à quoi cela sert, je vous invite à vous rendre sur leur site internet

http://sg-autorepondeur.com/index.php

@ plus Grand Maitre L

Codeigniter 3.0 is out !

C’est parti Codeigniter 3.0 est maintenant disponible en version finale, la lise des changements étant longue comme mon bras, je vous invite à vous plonger dans le changelog officiel sur cette page.

A partir de maintenant c’est un nouveau départ pour le framework qui j’espère sera amené à évoluer plus souvent. Je lui souhaite le meilleur mais je fait aussi quelques recommandations.

Une nouvelle version à minima

La version minimale est php 5.2.x, c’est une version qui n’est plus supportée par PHP depuis 4 ans (la doc dit qu’ils recommandent PHP 5.4.x). Là je suis un peux plus content mais aucun des apports de la version ne sont utilisé (TRAITS, namespaces…). Une refonte du cœur doit être entreprise pour tirer le meilleur parti de ces nouveaux ajouts.

Et maintenant je fais quoi ?

Et bien je vais tenter de migrer au moins un projet vers codeigniter 3.0 pour voir les limitations et les opportunités de la nouvelle version. Si tous se passe correctement, je migre mes autres projets.

 

La nouvelle version est disponible ici

See you soon !

heitzbanner

Développement d’une class PHP pour Heitz SYSTEM

La classe a beaucoup évolué, elle est maintenant disponible avec composer :

require " json-heitz/json-heitz": "dev-master"

et hop !

Heitz System est un ERP ou PGI pour les francophones, spécialisé dans la gestion des salles de remise en forme proposé par Heitz international. Ils existent depuis de nombreuses années sur ce marché.

Depuis-peu, il est possible de s’interfacer avec celui-ci via un web service qu’ils ont mis en place. Les échanges sont réalisés grâce à Javascript Object Notation autrement dit JSON. Depuis le temps que je leur casse les pieds les incites fortement pour qu’ils réalisent une interface…

L’éditeur propose donc un exemple de code basé sur la bibliothèque jQuery dont voici le code :

var IdentificationJson = 
{
   "status":0,
   "idErreur":0,
   "idSite": "AuthentificationBaseTest",
   "type":1,
   "email":"test1@heitzsystem.com",
   "code":"1",
   "idSession":0,
   "idClient":0
};

function SendIdentification(){
  $.ajax({
          type: "POST",
        dataType: "json",
        url: 'http://heitz.no-ip.com/json',
       data: IdentificationJson,
       dataType: "json",
       success:function(data){
       console.log(data);
   }
});
}

Le fait d’afficher les informations de connexion dans le code source du projet ne me conviens pas, c’est pour quoi j’ai décidé de proposer une class en PHP afin de masquer ces infos au tout venant et ainsi faciliter le traitement de ces informations dans d’autres projets tel que Magento, Drupal ou autres…

Je me suis appuyé sur la programmation orienté objet pour faciliter sa modularité et les éventuelles évolutions dans le temps car l’éditeur sort de nouvelle mises à jour régulièrement. Comme je suis super sympas (si,si..) je propose à tous le monde la source de mon code sur Bitbucket à la condition express que si ils l’améliorent, ils le propose à la communauté via un push request. La procédure est très simple, profitons en !

J’attend beaucoup de vos retours pour l’améliorer, n’hésiter pas à m’en faire.

@ bientôt grand Maitre L

Partage d’un code source pour le tracking COLISSIMO

Super Edit :

j’ai des infos de la poste, ils sont en train de mettre en place une API Officielle.
Pour cela il faut avoir un compte Inet-Expeditor et le service sera proposé en janvier 2014.
Il répondra au jolis nom de « colis view ». Je vous conseille de vous rapprocher de votre commercial car l’ancienne API sera supprimée.

« EDIT » Ce code rencontre de petits problèmes actuellement, je vous conseille de vous tourner vers la vieille version en procédurale qui fonctionne .

Les années avançant et les statistiques Google Analytics sont là pour le prouver , la page la plus lue sur le blog est celle concernant un petit code mis en ligne pour faire du tracking de paquet Colissimo.

Je ne pouvais pas le mettre en ligne tel quel, un dépoussiérage me semblais nécessaire, c’est pourquoi j’ai décidé de m’appuyer sur la programmation orientée objet pour refondre ce code.

En faisant une petite recherche sur internet je me suis rendu compte qu’un lyonnais avais déjà effectué cette démarche et quelle était beaucoup plus avancé que ce que j’étais susceptible de vous proposer. Son code est disponible sur GITHUB.

Pour les autres le voici :

/*
 * @author Julien 'delphiki' Villetorte <gdelphiki@gmail.com>
 * http://www.delphiki.com/
 * http://twitter.com/delphiki
 *
 */
class ColissimoAPI{
    private $host = 'http://www.laposte.fr';
    private $page = '/outilsuivi/web/suiviInterMetiers.php';
    private $user_agent = 'Dalvik/1.4.0 (Linux; U; Android 2.3.5; HTC Desire HD Build/GRJ90)';
    private $key ;
    private $method;
    private $code;
    private $image_dir;
    private $param_string;
    private $response;
    private $invalidResponse;
    private $parsedResponse = array();

    /**
     * @access Public
     * @param string $_key
     */
    public function __construct($_key = 'd112dc5c716d443af02b13bf708f73985e7ee943'){
        $this->setKey($_key);
        $this->setImageDir('images/');
    }

    /**
     * @access public
     * @name setImageDir()
     * @param Path of image Directory
     * @throws Exception
     */
    public function setImageDir($_image_dir){
        $this->image_dir = $_image_dir;
        if(substr($this->image_dir, -1) !== '/'){
            $this->image_dir .= '/';
        }
        if(!is_writable($this->image_dir)){
            throw new Exception('Image directory not writable.');
        }
    }

    /**
     * @access public
     * @param string $_key
     * @throws Exception
     */
    public function setKey($_key ){
        if(preg_match('#^[a-zA-Z0-9]{40}$#', $_key) || empty($_key) || ($_key === 'null')){
            $this->key = $_key;
        } else {
            throw new Exception('Invalid key or empty.');
        }
    }

    /**
     * @access public$
     * @name   setUserAgent()
     * @param  string $_user_agent
     */
    public function setUserAgent($_user_agent){
        $this->user_agent = $_user_agent;
    }

    /**
     * @access public
     * @name setReferer()
     * @param string $_referer
     * @throws Exception
     */
    public function setReferer($_referer){
        if(filter_var($_referer, FILTER_VALIDATE_URL)) {
            $this->referer = $_referer;
        } else {
            throw new Exception('Invalid URL');
        }
    }

    /**
     * @access public
     * @name getStatus()
     * @param string $_code
     * @param string $_method
     * @param bool $_plain
     * @return Xml
     * @throws Exception
     */
    public function getStatus($_code, $_method = 'xml', $_plain = false){
        if(!preg_match('#^[0-9]{1}[a-zA-Z]{1}[0-9]{11}#', $_code)) {
            throw new Exception('Invalid code.');
        }
        $this->code = $_code;

        $allowed_methods = array('xml', 'json', 'img');

        if(!in_array($_method, $allowed_methods)){
            throw new Exception('Invalid method.');
        }
        $this->method = $_method;

        $this->param_string = '?key='.urlencode($this->key).'&code='.urlencode($this->code);

        return $this->getResponse(!$_plain);
    }

    /**
     * @access private
     * @name getResponse()  
     * @param bool $_parse
     * @return type
     */
    private function getResponse($_parse = true){
        $ch = curl_init();

        $url = $this->host.$this->page.$this->param_string;

        if($this->method != 'img'){
            $url .= '&method='.$this->method;
        }
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FAILONERROR, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
        curl_setopt($ch, CURLOPT_TIMEOUT, 3);
        $data = curl_exec($ch);
        curl_close($ch);

        $this->response = $data;

        return ($_parse || $this->method == 'img') ? $this->parseResponse() : $this->response;
    }

   /**
    * @access private
    * @name parseResponse()
    * @return img, xml, json
    * @throws Exception
    */
    private function parseResponse(){
        switch($this->method){
            default:
                throw new Exception('Invalid method.');
                break;
            case 'img':
                $newImg = imagecreatefromstring($this->response);
                imagepng($newImg, $this->image_dir.$this->code.'.png');

                $this->parsedResponse = array(
                    'code' => $this->code,
                    'image' => $this->image_dir.$this->code.'.png'
                );
                break;
            case 'xml':
                $dom = new DOMDocument('1.0', 'utf-8');
                if(!$dom->loadXML($this->response)){
                    $this->invalidResponse = $this->response;
                    $this->response = null;

                    if($this->invalidResponse != NULL ) {
                        return $this->invalidResponse;
                    } else {
                        throw new Exception("Invalid XML.\n\n" . $this->invalidResponse);
                    }
                }

                $this->parsedResponse['status']     = $dom->getElementsByTagName('status')->item(0)->nodeValue;
                $this->parsedResponse['code']       = $dom->getElementsByTagName('code')->item(0)->nodeValue;
                $this->parsedResponse['client']     = $dom->getElementsByTagName('client')->item(0)->nodeValue;
                $this->parsedResponse['date']       = $dom->getElementsByTagName('date')->item(0)->nodeValue;
                $this->parsedResponse['message']    = $dom->getElementsByTagName('message')->item(0)->nodeValue;
                $this->parsedResponse['gamme']      = $dom->getElementsByTagName('gamme')->item(0)->nodeValue;
                $this->parsedResponse['base_label'] = $dom->getElementsByTagName('base_label')->item(0)->nodeValue;
                $this->parsedResponse['link']       = $dom->getElementsByTagName('link')->item(0)->nodeValue;
                $this->parsedResponse['error']      = $dom->getElementsByTagName('error')->item(0)->nodeValue;

                $this->parsedResponse = array_map('utf8_decode', $this->parsedResponse);

                break;
            case 'json':
                if($this->response === null){
                    $this->invalidResponse = $this->response;
                    $this->response = null;

                    if( $this->invalidResponse != NULL ){
                        return $this->invalidResponse;
                    } else {
                        throw new Exception("Invalid JSON.\n\n".$this->invalidResponse);
                    }
                }

                $this->parsedResponse = json_decode($this->response, true);
                $this->parsedResponse = array_map('utf8_decode', $this->parsedResponse);

                break;
        }
        return $this->parsedResponse;
    }
}

 

Pour l’utiliser rien de plus simple :

try{     $colis = new ColissimoAPI();     $colis->setImageDir('tmp/'); // optionnal, default: images/

    $res = $colis->getStatus('XXXXXXXXXXXXX');
}
catch(Exception $e){
    echo $e->getMessage();
}

N’oubliez pas le « try catch » pour gérer proprement les erreurs.

Bien à vous

Grand maître L

Mes débuts avec Codeigniter

Bonjour,

Depuis quelque temps je me suis mis à travailler avec le framework MVC PHP  » CodeIgniter « .

 

Ce cadre de développement à été choisis car après de nombreux test j’ai réussi à le faire fonctionner sur mon intranet qui présente une particularité au niveau du serveur web (IIS 6.0, php 5.3.x, mySql). j’ai aussi testé le zend FrameWork et à l’arrivée de la version 2.0 j’ai jugé qu’il était urgent d’attendre.

Je vous propose une suite de petits billets sur son utilisation au quotidien.

Sans plus attendre son installation :
À ce stade rien de bien sorcier, il suffit de se rendre sur le site et de télécharger la dernière version en date (la 2.1.3 à l’heure où j’écris ces lignes).
On dézippe le tout sur son serveur.
Pour ma part, l’environnement de dev et de prod sont identiques, réduisant le risque d’incompatibilité.

Mon projet à une spécificité, je doit me connecter à 3 bdd différentes.

  • une mysql
  • deux firebirdSQL

Nativement codeIgniter est capable de se connecter à toutes ces bdd mais pas simultanément à plusieurs types de bdd :), si vous n’avez pas compris les commentaires sont là pour ça.

le principe du MVC est le suivant :

  • m = Modèle => relation avec la bdd,
  • v = Vue => ce que vois l’utilisateur final (le html)
  • c = Contrôleur => c’est une sorte de gare de triage entre ce qui viens de la vue et ce qui viens du modèle pour tout organiser.

Suite au prochain épisode…

PHP 5.4 est disponible en Rc2

C’est toujours Agréable de voir que le langage PHP poursuit son bonhomme de chemin sans prendre de retard.

En effet le 24 Novembre la devteam à mis à disposition la Rc2 dans un timing prévu il y a maintenant plus de 6 mois (du jamais vu !!!). Au passage, on apprend que nous aurons droit à une Rc3 car de nombreux bugs ont été corrigés.

Pas de grandes nouveauté comme l’indique Mageekblog à l’exception d’une fonctionnalité ajouté à SOAP.

@plus Grand Maître L

Gerer les dates en php avec la class transDater

Avec cette petite class je gère les dates plus facilement. Bien sûr on peut toujours l’améliorer pour lui rajouter la prise en charge de timestamp par exemple, je reste ouvert à vos suggestions.


/**
 * transDater
 *
 * @package
 * @author luc
 * @copyright Copyright (c) 2012
 * @version $Id$
 * @access public
 */
/* la date en entrée doit être valide mais pas de type timestamp */
class TransDater {

    /**
     * TransDater::dateTransform()
     *
     * @param string $dateString
     * @param mixed $newDateFormat
     * @return
     */
    static function dateTransform($dateString = '01-01-1979', $newDateFormat) {
        if ($dateString && ($format = $newDateFormat)) {
            $date = new DateTime($dateString);
            return $date->format($format);
        }
        return (bool) false;
    }

    /**
     * *Si on récupère le numéro du mois de l'année on peut le transformer en nom en toutes lettres
     */
    static function monthTransformFr($date) {
        static $mois = array(
            '01' => 'janvier',
            '02' => 'fevrier',
            '03' => 'mars',
            '04' => 'avril',
            '05' => 'mai',
            '06' => 'juin',
            '07' => 'juillet',
            '08' => 'aout',
            '09' => 'septembre',
            '10' => 'octobre',
            '11' => 'novembre',
            '12' => 'decembre'
        );
        $m           = self::dateTransform($date, 'm');

        if (!empty($mois[$m])) {
            return (string) $mois[$m];
        }
    }

    /**
     * TransDater::dayWord()
     * @abstract Si on récupère le numéro du jour de l'année on peut le transformer en nom en toutes lettres (0->français,1->Anglais,2->Allemand)
     * @param mixed $date
     * @param mixed $int
     * @return
     */
    static function dayWord($date, $int) {
        $french  = array('dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi');
        $english = array('Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Monday');
        $german  = array('Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag', 'Sonntag', 'Montag');
        switch ($int) {
            case 0 : $day = $french;
                break;
            case 1: $day = $english;
                break;
            case 2: $day = $german;
                break;
            default:
                false;
        } // switch
        $d = self::dateTransform($date, 'w');
        if (!empty($day[$d])) {
            return (string) $day[$d];
        }
        return (bool) false;
    }

    /* fonction : bissextile */

    static function leapYear($date) {
        $date = self::dateTransform($date, 'y-m-d');

        if ((is_int($date / 4) && !is_int($date / 100)) || is_int($date / 400)) {
            return (bool) true;
        } else {
            return (bool) false;
        }
    }

    /**
     * TransDater::datePlusUnMois()
     *
     * @abstract fonction rajoutant un mois a une date
     * @param mixed $date
     * @return string date plus 1 mois
     */
    static function datePlusUnMois($date) {
        $newDate = new DateTime($date);
        $newDate->modify('+1 month');

        return (string) $newDate->format('Y-m-d');
    }

    /**
     * TransDater::dateMoinsUnJour(()
     *
     * @abstract fonction enlevant 1 jour à une date
     * @param mixed $date
     * @return string date moins 1 jour
     */
    static function dateMoinsUnJour($date) {
        $newDate = new DateTime($date);

        return $newDate->modify('-1 day');
    }

    /**
     * TransDater::age()
     *
     * @abstract Fonction pour calculer l'age
     * @param string  date de naissance type 'd/m/Y'
     * @param string  date à laquelle on veux calculer l'age
     * @return age /integer
     */
    static function age($date_naissance, $currentDate = NULL) {
        if ($date_naissance != NULL) {
            if ($currentDate == NULL) {
                $currentDate = date('d/m/Y');
            }
        }
        $arr1 = explode('/', $date_naissance);
        $arr2 = explode('/', $currentDate);
        if (($arr1[1] < $arr2[1]) || (($arr1[1] == $arr2[1]) && ($arr1[0] <= $arr2[0]))) {
            return $arr2[2] - $arr1[2];
        }
        return (int) $arr2[2] - $arr1[2] - 1;
    }

    /**
     * returns the difference, in days, between two dates.  avoids the daylight's savings issue by using GMT
     */
    static function dateDiff($date1, $date2) {
        $date1 = date_parse($date1);
        $date2 = date_parse($date2);
        return ((gmmktime(0, 0, 0, $date1['month'], $date1['day'], $date1['year']) - gmmktime(0, 0, 0, $date2['month'], $date2['day'], $date2['year'])) / 3600 / 24);
    }

    /**
     * @name dateExcelToHuman()
     * @param string $date
     * @return string date
     */
    static function dateExcelToHuman($date) {
        $date = ($date - 25569) * 86400;
        return (string) date('Y-m-d H:i:s', $date);
    }

    /**
     * @abstract Returns elapsed time with human format in french
     *
     * @param     int The timestamp of the date
     * @return    string
     */
    public function elapsed_time($date) {

        $old_time = $date;

        // Current time
        $time = time();

        // Little check
        if ($time < $old_time) {

            return FALSE;
        }

        // Get seconds elapsed
        $seconds = round($time - $old_time);

        // Convert into minutes
        $minutes = round($seconds / 60);

        // Convert into hours
        $hours = round($minutes / 60);

        // Returns
        if ($hours >= 72) {
            return 'Le ' . date('d/m/Y', $old_time);
        } elseif ($hours >= 48 && $hours < 72) {
            return 'Avant Hier';
        } elseif ($hours >= 24 && $hours < 48) {
            return 'Hier';
        } elseif ($hours >= 1) {
            return 'Il y a ' . $hours . ' h';
        } elseif ($minutes >= 1) {
            return 'Il y a ' . $minutes . ' mn';
        } elseif ($seconds == 0) {
            return 'A l\'instant';
        } else {
            return 'Il y a ' . $seconds . ' s';
        }
    }

    static public function addSeconde(\DateTime $date, $seconde) {
        return self::addInterval($date, 'PT' . (int) $seconde . 'S');
    }

    static public function addMonth(\DateTime $date, $month) {
        return self::addInterval($date, 'P' . (int) $month . 'M');
    }

    static public function addDay(\DateTime $date, $day) {
        return self::addInterval($date, 'P' . (int) $day . 'D');
    }

    static public function addYear(\DateTime $date, $year) {
        return self::addInterval($date, 'P' . (int) $year . 'Y');
    }

    static public function addInterval(\DateTime $date, $value) {
        try {
            $interval = new \DateInterval($value);
            $date->add($interval);
        } catch (Exception $exc) {
            throw new \Exception(__METHOD__ . 'The format of $value is not valid (String) exemple : P55S (add 55 second) ');
        }
        return $date;
    }

}

à bientôt Grand maître L

Php 5.4 Alpha 1, quand php renait de ces cendres…

Une nouvelle mouture de notre langage de prédilection présente le bout de son nez. Malgré les apparences, il s’agit d’une version en réalité majeure. En effet, la mort de PHP6 il y a plus d’un an pour cause de problème d’intégrations de l’Unicode a chamboulé le planning.

C’est pour cela qu’une version alpha vient d’être mise à disposition sur le SVN de PHP.net.

Les contributeurs ne se sont pas endormis, car plus de 6 000 points ont été modifiés. De nombreuses idées de PHP6 ont été implémentées. Malheureusement, la bonne idée de l’Unicode a été repoussée sans date.

Comment fonctionne PHP ?

PHP est un langage de programmation impérative de type CGI, qui peut être utilisé en procédural ou orienté objet (POO). C’est un langage de haut niveau qui doit être exécuté par une machine spéciale pour fonctionner, généralement un serveur (cette exécution ne peut pas être accomplie par un navigateur, il en est incapable).

Pour que le PHP soit interprété, il faut qu’on lui dise comment ; c’est le rôle du moteur de PHP, appelé Zend Engine.

Ce moteur est écrit en C. C’est le cœur du langage ; c’est en fait lui qui évolue à chaque nouvelle version.

Les nouveautés

Principaux changement apportés

safe_mode, register_globals et register_long_array sont définitivement supprimés de PHP. De quoi ravir les développeurs, qui n’aurons plus à réaliser toute une série de vérifications concernant ces directives de configuration.

Pour le register_globals, on peut dire que c’est une vraie avancée en termes de sécurité, même si depuis de nombreuses versions cette fonction était désactivée par défaut dans le php.ini.

Avec le register_globlals à « ON », on ne faisait pas de différence entre une variable superglobale et une variable « interne » : un vrai problème de sécurité, car on ne savait pas si une variable venait du site — et donc était fiable — ou de l’extérieur, et par conséquent potentiellement dangereuse.

Concernant le safe_mode et register_long_array, la documentation de PHP indique en effet :

Citation : Documentation PHP

Cette fonctionnalité est OBSOLÈTE depuis PHP 5.3.0. Nous vous encourageons vivement à ne plus l’utiliser.

Les ajouts apportés à cette version

Il est maintenant plus explicite de passer des arguments en références.

Pour rappel, voici comment on passe un argument en référence avec PHP :

Code : PHP – Soumission d’argument sous forme de référence

 < ?php
    function foo( &  $var){
       $var++;
}

function & bar(){
        $a=5;
        return $a;
}

    foo ( bar ());
?>

Un passage par référence va modifier la variable inscrite en mémoire par une nouvelle version de cette variable, c’est le & devant $var qui le permet.

Il est aussi possible de faire ceci, actuellement :

 < ?php      
myFunction(& $toto);
 ?>

 

Un simple avertissement est généré sous PHP 5.3. Désormais, avec PHP 5.4, le code plante et renvoie une erreur.

Les traits

Une nouvelle fonctionnalité (un conteneur) apparaît également : les traits. C’est un regroupement de méthodes qui peuvent être partagées entre différentes classes (ce qui est différent de l’héritage et des interfaces).

Image utilisateur Plus d’informations sur les traits.

Ajout du support d’Autoconf

GNU Autoconf, livré avec PHP 5.4 dans sa version 6.59, est un outil permettant de générer des scripts shell qui configurent automatiquement les sources d’un logiciel dans l’optique de l’adapter aux systèmes UNIX (Linux, Mac OS X, etc.).

Notez que Autoconf ne fait que configurer : il n’est pas nécessaires aux personnes exécutant le script d’avoir Autoconf installé sur leurs machines.

Image utilisateur Plus d’information sur Autoconf.

Image utilisateur Image utilisateur Description officielle d’Autoconf.

La feuille de route

  • Le 28 juin 2011, la version alpha 1 sera publiée.
  • Le 26 juillet, ce sera au tour de l’alpha 2.
  • La version bêta sera livrée le 23 août.
  • Enfin, la version Relase Candidate n° 1 (RC 1) sera publiée le 20 septembre 2011.
  • Après cela, une version RC sera publiée toutes les deux semaines, jusqu’à la version stable.

Les dates présentés ci-dessus sont cependant susceptible d’être modifiées.

La communauté de PHP

Tout comme la communauté de l’anneau, la communauté de PHP était lancée pour fait de grandes choses car elle était unie. Cependant, des divisions apparaissent régulièrement sur la gouvernance et la prise de décisions.

On peut en gros la diviser en deux groupes : les contributeurs historiques et les nouveaux contributeurs.

Les contributeurs historiques considèrent que l’évolution doit aller vers une stabilisation du langage, une éradication des bugs et une simplification, alors que les autres aimeraient que les nouveautés soit implémentées plus rapidement pour ne pas se retrouver à attendre trop longtemps des fonctionnalités qu’ils jugent essentielles pour programmer avec des méthodes modernes.

La dissolution des développeurs de PHP n’est heureusement pas à l’ordre du jour, mais il manque cependant un leader.

Rasmus Lerdorf, le créateur de PHP, serait capable de dire où il faut aller, mais il se contente de prendre le rôle de médiateur. Cette situation a conduit à un drame (la mort de PHP6), de nombreuses leçons doivent donc en être tirées…

Image utilisateur Vous pouvez trouver la liste complète des nouveautés de cette version en vous rendant ici.

Sources

<pre class= »brush:[php] »>

Une fonction pratique pour vérifier la conformité d’un numero de téléphone en PHP

En se moment je travail sur de petites fonctions bien pratiques que je pourrais réutiliser un peut partout dans mes projets.

J’ai créé cette fonction pour répondre à un besoin simple et elle me satisfait

Cette fonction renvoie true en cas de succès si non false.

//fonction pour vérifier la conformité d'un numéro de tel Français
function VerifTelFr($chaine){
	$regex = "#^0[1-68]([-. ]?[0-9]{2}){4}$#";
		if (preg_match($regex,$chaine)){
					return true; 
			} else {
					return false;
		}
}

@ bientôt Grand Maître L

Une fonction pratique pour controler un email en PHP

Grace à cette petite fonction, vous serez en mesure de vérifier si l’email inscrit par votre visiteur est conforme. Pour cela j’utilise le « REGEX » ou « expressions régulières ».

Cette fonction renvoie true en cas de succès si non false.

//fonction pour vérifier l'orthographe d'un email
function VerifEmail($chaine){
	$regex = "#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#";
		if (preg_match($regex,$chaine)) {
					return true;
			} else {
					return false;
		}
}

Grand Maître L

Prévalider un bouton radio en html et php

Grâce à ce code il est possible de précocher dans un formulaire une valeur.

Dans cet exemple on va utiliser un bouton radio.
le html :

<input name="sexe" type="radio" value="femme" /><?php echo $validf; ?> > Femme :
<input name="sexe" type="radio" value="homme" /><?php echo $validh; ?> > Homme :

le Php

<?php 
//ici on coche homme ou femme dans un bouton radio en récupérant les données de la bdd 
if ($sexe == "femme"){ 
    $validf = "checked='checked'"; $validh = ""; 
} elseif ($sexe == "homme"){ 
    $validf = ""; $validh = "checked='checked'"; 
}

Grand Maître L

Ici on discute de l’avenir de php

Derrière ce titre pompeux se cache un blog qui à attiré mon attention depuis quelque temps.
Il s’agit du blog de : Frédéric HARDY.
Cette personne se charge de faire remonter les avancées de la communauté Php. Ces billets très intéressants permettent à tout un chaqu’un de mieux comprendre dans quelle direction tend à se développer le langage de programmation Php.

Ces billets sont ponctué de « Mort de PHP6 + xx jours » où il explique comment les contributeurs du langage sont arrivé à cette situation et comment il comptent s’en sortir (très instructif).

le blog : http://blog.mageekbox.net/

@ bientôt grand Maître L

Une fonction en Php pour déterminer si un nombre et paire ou impaire

Grâce à cette fonction on peut savoir si un nombre et paire ou impaire facilement.

<?php 
$numerotation = 5; 

function PaireOuImpaire($numerotation)
{
	$numero = $numerotation%2;
		   if ($numero == 0) 
			 {
			$paire_ou_impaire = true;
		} else {
			$paire_ou_impaire = false;
			}	
		return $paire_ou_impaire ;
}
?>

Je m’en sert pour colorer une ligne sur deux dans un tableau, par exemple si il renvoie 1 c’est en bleu et si c’est 2 c’est rouge.

Dans l’exemple ci-dessus, il va me renvoyer : false .

Grand maître L

Réaliser un suivi des paquets Coliposte / Colissimo dans votre site internet

Super Edit :

J’ai des infos de la poste, ils sont en train de mettre en place une API Officielle.
Pour cela il faut avoir un compte Inet-Expeditor et le service sera proposé en janvier 2014.
Il répondra au jolis nom de « colis view ». Je vous conseille de vous rapprocher de votre commercial car l’ancienne API sera supprimée.

Edit : Apres de nombreuses années sans problèmes, laposte.fr à apparemment fermé son WebService, au jour où j’écris ces lignes (25/04/2013), il ne fonctionne plus.

Edit 2 : LA poste à mis en place un véritable webService, voici le lien de la documentation :

https://www.coliposte.fr/pro/docs/docutheque/divers/socolissimo/integrationwsshipping.pdf

Edit 3 : Tout est revenu dans l’ordre…

Grâce à ce code très simple on va récupérer sur notre page l’information de suivi Coliposte de votre client sans se connecter au site coliposte.fr.

<?php
  $ch = curl_init();
  $agent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
  $ref = "http://www.laposte.fr";
  $url_de_colissimo_suivi = "www.laposte.fr/outilsuivi/web/suiviInterMetiers.php?method=xml&key=null&code=".$code_colissimo."&width=190&font=Arial&t=1253811351937" ;
    curl_setopt($ch, CURLOPT_USERAGENT, $agent);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_URL, $url_de_colissimo_suivi);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_REFERER, $ref);
    $data = curl_exec($ch);

   /* cURL va renvoyer du xml qui sera formaté de cette manière :

	< ?xml version='1.0' ?>

	< ![CDATA[1]]>
	< ![CDATA[9A00092239388]]>
	< ![CDATA[Particulier]]>
	< ![CDATA[22/07/2010]]>
	< ![CDATA[Votre colis est livré]]>
	<base_label>< ![CDATA[Coliposte]]>
								< ![CDATA[http://www.coliposte.net/particulier/suivi_particulier.jsp?colispart=xxxxxxxxxxxxxxxxxxxx]]>
	< ![CDATA[]]>
*/

// ça sera de l'UTF-8, utiliser utf8_decode si votre page est en ISO*/

$sxml = simplexml_load_string($data);
$message_du_xml = $sxml->message;
$date_du_xml = $sxml->date;
$colissimo_message = utf8_decode($message_du_xml);
$colissimo_date = utf8_decode($date_du_xml) ;
echo $colissimo_date;
echo $colissimo_message;

?>

ce code vous sera très utile pour un site de e-commerce.

Grand maître L