Catégorie : Langages informatique

  • Utiliser l’API des climatiseurs DAIKIN

    Utiliser l’API des climatiseurs DAIKIN

    Aujourd’hui, je vous partage ma dernière création. Une libraire destinée à contrôler les climatiseurs Daikin.

    Voici les unités compatibles (2021)

    BRP069A41

    • dispositif de commande inclus avec l’unité

    Vous pouvez l’installer avec composer https://packagist.org/packages/daikin/api

    Enjoy 🙂

  • Installer la solution domotique NextDom sous Debian9.5

    Le projet NextDom avance bien. Il s’agit d’une refonte du core de Jeedom dans le but d’en améliorer la maintenabilité et les performances. Un gros travail a été fourni par des personnes formidables sur ces points. Nous en avons profité pour améliorer l’aspect visuel en utilisant le template basé sur bootstrap (pour la compatibilité) adminLte.

    En exclusivité, voici la procédure d’installation.

    J’attends des retours de votre part pour rechercher les bugs qui aurait pu rester.

    Je vous conseille de vérifier que vous n’avez pas de dossier html dans /var/www/ dans ce cas, supprimez-le, avant de commencer.

    Voici la procédure de test :

    Installation

    apt install -y software-properties-common gnupg wget unzip curl
    add-apt-repository non-free
    wget -qO - http://debian.nextdom.org/debian/nextdom.gpg.key | apt-key add -
    echo "deb http://debian.nextdom.org/debian nextdom main" > /etc/apt/sources.list.d/nextdom.list
    apt update 
    

    1/ Solution simple pour installer la version stable sur une machine

    apt install nextdom

    Installe Nextdom et la BDD (base de données) en local sur la machine.
    Les paquets nextdom-common et nextdom-mysql sont automatiquement installés.

    Vous avez aussi la possibilité de faire tout cela automatiquement en rendant ce script exécutable : https://raw.githubusercontent.com/NextDom/NextDom-DebInstaller/master/deb-install.sh

    Bon test 😉

  • Bonne pratiques des nommages en css

    Bonne pratiques des nommages en css

    Dans le projet NextDom, nous sommes confrontés à la refonte du style. Beaucoup de style est directement présent dans le HTML. Il fallait repartir sur de bonnes bases si nous voulions assurer la pérennité de notre développement.
    En premiers lieux, nous avons décidé d’utiliser SASS. On y gagne :

    • les variables,
    • la vérification de syntaxe,
    • une meilleure lisibilité,
    • la possibilité d’utiliser la syntaxe CSS et de la transformer petit à petit en SCSS,
    • la possibilité de découper facilement d’énormes feuilles de styles en de plus petits fichiers plus digestes

    la sortie du style du HTML est un gros morceau que mes collègues ont commencé et ce n’est pas simple. Très vite est apparu le besoin de créer de nouvelles classes et surtout de les nommer correctement.

    C’est un point très compliqué en informatique, savoir nommer les choses et ce n’est pas que moi qui le dit :

    There are only two hard things in Computer Science: cache invalidation and naming things.

    – Phil Karlton

    Lorsque je fais une intégration, j’essaie de concilier deux choses vraiment pas évidentes. Je veux rendre le plus abstrait possible le nom de mes classes et en même temps, il faut ce même nom soit le plus compréhensible possible. Sachant que je ne suis pas un spécialiste du frontend et que j’en fais que quand je suis vraiment obligé…

    Des exemples de ce qu’il ne faut pas faire

    Mon expérience m’a fait rencontrer des choses étranges  :

    .h1, .h2, .h3 ... ⁣/pre>
    Vouloir créer des classes pour faire passer une balise pour ce qu'elle n'est pas n'est pas une bonne pratique. C'est comme si on mettait une étiquette girafe à un éléphant, un éléphant reste un éléphant. Pour l'accessibilité des personnes défaillantes visuelles ou autre, elles perdent la sémantique de l’information qui leur est présentée.
    
    .span_colorblue, .pre_code-php ... ⁣/pre>
    Dans le cas vu ci-dessus, on mélange la sémantique de la balise et le style qu'on veut lui appliquer. Par ailleurs, "span_colorblue" ne donne pas d'information sur l'utilité réelle de cette classe si ce n'est que le texte est en bleu. Pourquoi n'aurait-on pas besoin d'une couleur bleu ailleurs qu'avec un span ?
    
    .toto > div > p > img {
        width: 500px;
    }

    Il faut aussi faire attention de ne pas trop lier l’imbrication des balises avec la feuille de style. Un seul sous niveau est un maximum. Au-delà, l’imbrication est trop forte et le moindre changement est trop long à répercuter.  Si vous voulez atteindre les images, mettez une classe à « img » et le problème est réglé.

    CammelCase ou snake-case ?

    À la lecture de la norme sur le document de référence du W3C on se rend compte que les attributs id et classes sont « case-insensitive », les seuls séparateurs autorisés sont le « – « et le « _ ».

    https://www.w3.org/TR/CSS21/syndata.html#characters

    All CSS syntax is case-insensitive within the ASCII range (i.e., [a-z] and [A-Z] are equivalent), except for parts that are not under the control of CSS. For example, the case-sensitivity of values of the HTML attributes « id » and « class », of font names, and of URIs lies outside the scope of this specification. Note in particular that element names are case-insensitive in HTML, but case-sensitive in XML.

    La symbolique

    la première question à se poser est : « Qu’est-ce que je veux représenter et dans quel contexte« . Si on répond à ces deux questions, on a rapidement des noms qui nous viens à l’esprit.

    Regardons le code HTML suivant :

    <div class="background-blue">
        <h1 class="strong">Un super titre</h1>
        <h2>Un super sous-titre</h2>
    </div>
    <div class="normal">    
        <p>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ratione vero ad repellat ea. Sint, est, eligendi expedita ducimus magnam quae voluptate! 
            Amet possimus error sapiente consectetur dolore qui illo?    
        </p>
    </div>

    Les classes « background-blue », « strong » et « normal » sont instanciées. Le problème, vous l’aurez compris, est qu’elles n’indiquent pas pour quel usage réel, elles sont destinées. La classe « normal » n’a pas de signification. Qu’est-ce qui est normal ?

    Selon moi, voici ce qu’il aurait fallu faire.

    <div class="head">
        <h1 class="head-title">Un super titre</h1>
        <h2>Un super sous-titre</h2>
    </div>
    <div class="content">    
        <p>
            Lorem ipsum dolor sit amet, consectetur adipisicing elit. Minima ratione vero ad repellat ea. Sint, est, eligendi expedita ducimus magnam quae voluptate! 
            Amet possimus error sapiente consectetur dolore qui illo?    
        </p>
    </div>

    J’ai choisi l’anglais pour nommer mes classes, c’est un choix qui n’engage que moi. Regardons attentivement la première div, la classe « head » indique que nous sommes dans le contexte d’un entête qui contient des titres et sous-titre. On a le schéma suivant A contient A-B, etc.

    Dans la div suivante, « normal » a été remplacé par « content » car c’est l’objet de cette div de contenir un texte.
    J’attends vos retours pour agrémenter cet article…

  • Soumettre un sitemap.xml à Google, et Bing

    Bonjour,

    Ce petit code va vous permettre de soumettre votre sitemap.xml aux 2 principaux moteurs de recherche, soit Google search et Bing.

    <?php
    
    class searchEngineSubmitter{
        
        private $urls;
        
        public function getUrls(){
            return  $this->urls ;
        }
        /**
         * @param array $urlsForSubmitting
         */
        public function __construct(array $urlsForSubmitting){
            $this->urls = $urlsForSubmitting;
        }
        
        /**
             * 
             * @param string $url
             * @return type
             */
        private function myCurl($url) {
            $ch       = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_exec($ch);
            $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
            curl_close($ch);
            return $httpCode;
        }
        
        /*
             * @abstract Sitemap Submitter Use this script to submit your site maps automatically to Google, Bing.MSN and Ask Trigger this script on a schedule of your choosing or after your site map gets updated.
         * @param string
        */
        public function submitSitemap($sitemapUrl) {
    
            foreach ( $this->getUrls() as $url) {
                $code = $this->myCurl($url . $sitemapUrl);
                if ($code == '200') {
                      return 'success: ' . parse_url($url, PHP_URL_HOST) . ' has been pinged (return code: ' . $code . ' )';
                } else {
                      return 'warning' . parse_url($url, PHP_URL_HOST) . ' return error (return code: ' . $code . ' )';
                }
            }
        }
        
    }

    Pour l’utiliser on fait comme ceci :

    <?php
    
    $submit = (new searchEngineSubmitter(
        ["http://www.google.com/webmasters/sitemaps/ping?sitemap=",
        "http://www.bing.com/webmaster/ping.aspx?siteMap="]))
        ->submitSitemap('http://www.mywebsite.com');

    Et voilà 🙂

    @ bientôt

  • Valider les champs d’un formulaire avec Silex et « Validator Constraints »

    Valider les champs d’un formulaire avec Silex et « Validator Constraints »

    Je me suis associé à Baptiste Pesquet l’auteur du cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle ». La validation des champs est désormais compatible avec la version 2.1 de silex c’est l’itération 14.

    Bonjour,

    Aujourd’hui nous allons voir comment ajouter la validation des valeurs de retour d’un formulaire dans le framework Silex.

    Après avoir suivi le cours sur Openclassrooms « Évoluez vers une architecture PHP professionnelle », il vous manquera cette partie avant de mettre votre site en ligne.

    Pourquoi valider les champs ?

    Pour s’assurer que les utilisateurs du site ne cherche pas à enter n’importe quelle donnée n’importe où. Par exemple un numéro de téléphone dans le champ email, tenter de faire passer des valeurs inapproprié et exploiter une faille xss…

    Voici comment nous allons procéder :

    Dans un premier temps nous allons ajouter un namespace qui sera utilisé par votre buildForm:: ce namespace c’est :

    use Symfony\Component\Validator\Constraints as Assert;

    Voici ce que j’ai fait pour l’enregistrement d’un email :

    <?php
    
    namespace MicroCMS\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    
    class NewsletterType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder->add('email', 'email', [
                'label'      => '',
                'required'   => true,
            ]);
        }
    
        public function getName() {
            return 'newsletter';
        }
    
    }

    On vois que j’ai mis plusieurs contraintes. En premier lieu j’ai décidé que le champ est de type « email »et qu’il est « requis » (required), c’est à dire que sur le html généré, on verra ceci :

    <input id="newsletter_email" name="newsletter[email]" required="required" placeholder="Votre email pour vous inscrire à la Newsletter" type="email">

    Si l’utilisateur a un navigateur récent, et qu’il soumet le formulaire directement, un message lui dira que ce n’est pas possible car le champ est vide. Si il remplit ce champ avec autre chose qu’un email le navigateur va là aussi l’informer que cette donnée n’est pas valide. C’est une première étape car si l’utilisateur est un petit malin, il peut modifier le type de champ dans le input, supprimer le required et le email. à ce moment là, il pourra soumettre le formulaire sans message d’erreur.

    Il faut donc procéder à une deuxième vérification sur les données au niveau du framework et pas seulement dans le navigateur.

    Pour cela on va rajouter cette ligne dans notre méthode buildForm, ‘constraints’ => new Assert\Email(),

    <?php 
    namespace MicroCMS\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\Validator\Constraints as Assert;
    
    class NewsletterType extends AbstractType
    {
    
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder->add('email', 'email', [
                'label'      => '',
                'required'   => true,
                'constraints' => new Assert\Email(),
            ]);
        }
    
        public function getName() {
            return 'newsletter';
        }
    
    }

    Là, on est certain que la valeur attendu sera un email et pas autre chose. Si l’utilisateur fait le malin au niveau de son navigateur, voici ce qui va s’afficher :

    • This value is not a valid email address.

    Grand maître L

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

  • Déployer son site sur un serveur ftp avec Dploy

    Déployer son site sur un serveur ftp avec Dploy

    Bonne nouvelle, le site du zero OpenCassRooms le propose en première page de son site !!!

    C’est bon mon tutoriel a été accepté, je vous invite à le suivre et à me faire quelque retours…

    Dploy c’est quoi ?

    Dploy c’est un un script qui va uploader les fichiers et dossiers que vous avez versionné avec Git sur un serveur distant.

    En effet quant on travaille sur de petits projet on est souvent en présence d’un simple accès ftp

    Les prérequis pour ce cours sont :

    • Connaitre l’utilisation du logiciel Git, si ce n’est pas le cas reportez-vous au tutoriel de Mathieu Nembra, il est très complet.
    • Il doit être installé sur votre ordinateur.
    • Avoir node.js d’installé sur son ordinateur.
    • Avoir suivi le cours sur node.js au moins pour la partie installation.
    • Une connexion internet.
    • Un hébergement sur lequel se connecter en ftp ou en sftp.

    Si tout est bon, on peut commencer !

    Lire la suite sur le site openClassrooms

  • Migrer son framework CodeIgniter de la version 2.1.4 vers la version 3.0.0

    Migrer son framework CodeIgniter de la version 2.1.4 vers la version 3.0.0

    Dans cet article je vais m’efforcer de vous traduire les consignes pour migrer son projet Codeigniter 2.1.4 vers la version 3.0.0 :

    le texte original est disponible ici :

    Ces notes de mise à niveau sont valables pour une version qui n’est pas encore publié.

    Avant d’effectuer la mise à jour, vous devriez mettre votre site en ligne en remplaçant le fichier index.php avec une version >statique pour prévenir vos utilisateurs d’une migration en cours.

    Étape 1 : Mettre à jour les fichier de Codeigniter

    Remplacer tous les dossiers présents dans « system » ainsi que index.php. Si des modifications ont été apportées à votre index.php, elles devront être refaites à nouveau .

    Si vous avez des fichiers de votre crus présents dans « system », pensez à en réaliser une copie d’abord !

    Étape 2 : Mettre à jour les noms de fichiers de classes

    À partir de CodeIgniter 3.0, tous les noms de fichiers de classe (bibliothèques, les pilotes, les contrôleurs et modèles) doivent être nommés de manière « ucfirst », en d’autres termes – ils doivent commencer par une lettre majuscule.

    Par exemple, si vous avez le fichier suivant dans « libraries » :

    application/libraries/mylibrary.php

    …vous devez le renommer en :

    application/libraries/Mylibrary.php

    La même chose vaut pour les bibliothèques de pilotes et extensions et / ou celles qui on été remplacé par vos propres bibliothèques et les classes.

    application/libraries/MY_email.php application/core/MY_log.php

    Les fichiers ci-dessus doivent être renommés respectivement de cette manière :

    application/libraries/MY_Email.php application/core/MY_Log.php

    Controllers:

    application/controllers/welcome.php -> application/controllers/Welcome.php

    Models:

    application/models/misc_model.php -> application/models/Misc_model.php

    Veuillez noter que cela n’affecte pas les répertoires , seulement les fichiers de configuration , des vues, des aides, des crochets et rien d’autre – ce n’est appliqué qu’ aux classes.

    Vous devez maintenant suivre une règle simple – le noms de classes en « ucfirst » et tout le reste en minuscules.

    Étape 3 : Replacer le fichier config/mimes.php

    Ce fichier de configuration a été mis à jour pour contenir plus de mime-types, copiez-le dans « Application/config/mimes.php« .

    Étape 4 : Supprimer $autoload[‘core’] de votre fichier config/autoload.php

    L’usage de $autoload['core'] est déprécié depuis CodeIgniter 1.4.1, il est maintenant supprimé. Déplacez toute les entrées que vous avez ajouté dans $autoload['libraries'] à la place.

    Étape 5 : déplacez votre classe de log et extensions

    La classe log est considéré comme une extension du « core » elle est maintenant situé dans le dossier system/core/. Par conséquent, pour que votre classe Log remplace ou étende , vous devez les déplacer dans application/core/:

    application/libraries/Log.php -> application/core/Log.php
    application/libraries/MY_Log.php -> application/core/MY_Log.php
    

    Étape 6 : Convertir votre utilisation de « session » à partir de la bibliothèque « driver »

    Lorsque vous chargez (ou autochargez) la Session library, vous devez maintenant le charger en tant que pilote au lieu d’une bibliothèque. Cela signifie qu’il faut appeler $this->Load->driver('session') au lieu de $this->Load->library('session') et/ou de la liste ‘session’ dans $autoload['drivers'] au lieu de $autoload['library'].

    Avec le changement de la libairie session de la nouvelle session utilisant « driver », deux nouveaux éléments de configuration ont été ajoutés :

    • $config['sess_driver'] sélectionner les drivers que vous voulez utiliser. Les option sont :

      • ‘cookie’ (par défault) pour des sessions basées sur les cookies
      • ‘native’ pour utiliser les sessions native de PHP
      • le nom de votre driver personnalisé
    • $config['sess_valid_drivers'] offre toute une gamme de drivers personnalisés supplémentaires pour rendu disponible au chargement

    La nouvelle bibliothèque session driver charge le pilote de Cookie par défaut mais « cookie » et « native » disponible comme avant, aucune configuration n’est nécessaires. Cependant, il est recommandé que vous les ajoutiez à pour la clarté et la facilité de configuration future.

    Si vous avez écrit une extension à session, vous devez la déplacer dans un sous-répertoire «session» de «libraries», conformément à la norme pour les drivers. Méfiez-vous également à ce que certaines fonctions qui ne font pas partie de l’API Session externe ne soit installés dans les pilotes, si votre poste peut être décomposé en extensions de library de la classe de driver séparément.

    Étape 7 : Mettre à jour config/database.php

    en raison du chenagement de nom de Active Record pour Query Builder, à l’intérieur de votre config/ database.php, vous devez renommer la variable $active_record en $query_builder

    $active_group = 'default';
    
    // $active_record = TRUE;
    
    $query_builder = TRUE;

    Étape 8 : Remplacez votre template d’affichage des erreurs

    Dans CodeIgniter 3.0, le template error est maintenant considéré comme une vue et à été déplacé dans le dossier _application/views/errors.

    En outre, nous avons ajouté un support pour des modèles d’erreur en CLI (ligne de commande) un format texte qui, contrairement au HTML, est plus addapté la ligne de commande. Bien sûr, cela nécessite un autre niveau de séparation.

    Il est plus sûr de déplacer vos modèles préexistants de _Application/erreurs vers _Application/views/errors/html, n’oubliez pas de copier le nouveau _application/views/errors/cli dans le répertoire de CodeIgniter.
    Nous vous conseillons de déplacer vos anciens templates du dossier _application/errors vers _application/views/errors/html, vous aurez à copier le nouveau _application/views/errors/cli répertoire de l’archive de CodeIgniter.

    Étape 9 : Mettre à jour les config/routes.php de type (:any)

    Historiquement, CodeIgniter a toujours fourni la route :any générique, avec l’intention de fournir un moyen de faire correspondre tout les caractères dans un segment de type URI.
    Cependant, la :any générique est en fait juste un alias pour une expression régulière, il est utilisé pour être exécuté de cette manière + .. Ceci est considéré comme un bug, car elle correspond également au caractère (slash) /, qui est le segment séparateur URI dont cela n’a jamais été l’intention… Dans CodeIgniter 3, le générique :any est représenté par [^/]+,de sorte qu’il ne peux pas correspondre à un slash.

    Il y a certainement beaucoup de développeurs qui ont utilisé ce bug comme une caractéristique réelle. Si vous êtes l’un d’entre eux et que vous voulez faire correspondre un slash, utiliser une expression régulière .+ :

    (.+)    // matches ANYTHING
    (:any)  // matches any character, except for '/'
    

    Étape 10 : Toutes les fonctions qui retournent NULL à la place de FALSE

    De nombreuses méthodes et fonctions renvoient désormais NULL, au lieu de FALSE lorsque les éléments nécessaires n’existent pas :

    • `Config Class ../libraries/config`
      • config->item()
      • config->slash_item()
    • :doc:`Input Class ../libraries/input`
      • input->get()
      • input->post()
      • input->get_post()
      • input->cookie()
      • input->server()
      • input->input_stream()
      • input->get_request_header()
    • :doc:`Session Class ../libraries/sessions `
      • session->userdata()
      • session->flashdata()
    • :doc:`URI Class <../libraries/uri `
      • uri->segment()
      • uri->rsegment()
    • :doc:`Array Helper ../helpers/array_helper `
      • element()
      • elements()

    Étape 11 : Application du filtre XSS

    De nombreuses méthodes de CodeIgniter vous permettent d’utiliser la fonction de filtrage XSS à la demande en passant un paramètre de type booléen. La valeur par défaut de ce paramètre utilisé est FALSE, il est maintenant remplacé par la valeur NULL et il sera déterminée dynamiquement par votre $config ['global_xss_filtering'] value.

    Si vous avez utilisé pour passer manuellement une valeur booléenne pour le filtre $xss ou si vous avez toujours eu $config ['global_xss_filtering'] défini à FALSE, alors ce changement ne vous concerne pas. Sinon vérifier l’utilisation des fonctions suivantes :

    • input->get()
    • input->post()
    • input->get_post()
    • input->cookie()
    • input->server()
    • input->input_stream()

    Important, les superglobals $_GET, $_POST, $_COOKIE et $_SERVER ne sont plus automatiquement écrasé lorsque le filtrage global XSS est activé.

    Étape 12 : Mettre à jour l’utilisation de la méthode de la classe get_post()

    Précédemment, la méthode get_post()recherchait les données en POST en premier, puis en GET. La méthode à été modifiée pour chercher en premier en GET puis en POST, comme son nom le suggère.

    Une méthode à été ajouté, post_get(), qui recherche en POST puis en GET, comme get_post() le faisait avant.

    Étape 13 : Mise à jour des dossier Helpers en directory_map()

    Dans le tableau résultant, les répertoires finissent maintenant avec un séparateur de répertoire(c’est à dire un /, généralement).

    Étape 14 : Mise à jour de l’utilisation de la base de données et de la méthode Forge de DROP_TABLE

    Jusqu’à présent il y avait une clause IF EXISTS DROP_TABLE() par défaut qui ne fonctionne pas du tout avec certains pilotes. Avec CodeIgniter 3.0, l’IF EXISTS ​​n’est plus ajoutée par défaut, il y a un second paramètre optionnel qui le permet. Il est mis à FALSE par défaut.

    Si votre application utilise IF EXISTS, vous devez controler son utilisation.

    // Now produces just DROP TABLE `table_name`
    $this->dbforge->drop_table('table_name');
    
    // Produces DROP TABLE IF EXISTS `table_name`
    $this->dbforge->drop_table('table_name', TRUE);
    

    Le présent exemple concerne la syntax MySQL, mais elle devrait fonctionner pour tous les pilotes à l’exception de ODBC.

    Étape 15 : Changer l’utilisation de la bibliothèque e-mails pour l’envoi de plusieurs e-mails

    Effacement automatiquement des paramètres réglés après l’envoi des e-mails avec succès. Pour remplacer ce comportement, passer FALSE comme premier paramètre dans le send () :

    if ($this->email->send(FALSE))
    {
            // Parameters won't be cleared
    }
    

    Étape 16: Mettez à jour vos traduction avec la méthode Form_validation()

    Deux améliorations ont été apportées à la validation de formulaire bibliothèques / form_validation..> 'Slt; / bibliothèques / langue&gt; fichiers et le format des messages d’erreur..:

    • touches de ligne doivent désormais être précédés de form_validation_ afin d’éviter les collisions :
      // Ancien
      $lang['rule'] = ...
      
      // Nouveau
      $lang['form_validation_rule'] = ...
      
    • Le format des messages d’erreur a été modifié pour utiliser des paramètres nommés, afin de permettre plus de souplesse que ce que propose sprintf() :
      // Ancien
      'The %s field does not match the %s field.'
      
      // Nouveau
      'The {field} field does not match the {param} field.'
      

    Le vieux formatage fonctionne toujours, mais les touches de ligne non-préfixés sont obsolètes et programmé pour être supprimé dans CodeIgniter 3.1 +. Par conséquent, vous êtes encouragés à mettre à jour son utilisation au plutôt tôt.

    Étape 17 : Retirer l’utilisation des fonctionnalités obsolètes

    En plus de $autoload['core'] de paramètre de configuration, il y a un certain nombre d’autres fonctionnalités qui ont été supprimés dans CodeIgniter 3.0.0:

    La librairie SHA1

    La bibliothèque de SHA1 du framework a été supprimé, modifier votre code pour utiliser le SHA1 natif de PHP pour générer un hash SHA1.

    SHA1() a été supprimé le la libraire encrypt.

    La constante EXT

    L’utilisation de la constante EXT a été dépréciée depuis l’abandon du support de PHP 4. Il n’y a pas plus besoin de maintenir des extensions de nom de fichier et dans cette nouvelle version CodeIgniter, EXT constante a donc été retirée. Utilisez seulement ‘.Php’ à la place.

    Le helper js_insert_smiley()

    La function js_insert_smiley() est dépréciée depuis CodeIgniter 1.7.2, elle est maintenant supprimée. Vous devez passer à smiley_js() à la place.

    La libraire Encrypt

    Après de nombreux rapports de vulnérabilité, la Bibliothèque Encrypt a été déprécié et une nouvelle, Bibliothèque Encryption est ajouté pour prendre sa place.

    La nouvelle bibliothèque nécessite soit l’extension MCrypt ou PHP 5.3.3 et l’extension OpenSSL. Même si cela peut être assez gênant, c’est une exigence qui nous permet d’avoir des fonctions cryptographiques correctement mises en œuvre.

    Remarque

    La bibliothèque Crypter est toujours disponible dans le but de maintenir la compatibilité ascendante.

    Important : Vous êtes fortement encouragés à passer à la nouvelle bibliothèque Encryption dès que possible!

    Le pilotes de base de données ‘mysql’ , ‘sqlite’, ‘MSSQL’, ‘AOP / dblib’

    Le pilote mysql utilise l’ancienne extension ‘mysql’ de PHP, connue pour sa base de code vieillissante et de nombreux problèmes de bas niveau. L’extension est obsolète depuis PHP 5.5 et CodeIgniter le déprécie dans la version 3.0, la valeur par défaut du pilote MySQL est configuré pour mysqli .

    S’il vous plaît utiliser le pilote ‘mysqli’ ou le pilote ‘PDO / mysql’ pour MySQL. L’ancien pilote ‘mysql’ sera retiré dans l’avenir.

    Les pilotes sqlite , MSSQL et AOP / dblib (aussi connu comme AOP / MSSQL ou AOP / sybase) dépendent tous des extensions de PHP qui pour différents raisons n’existent plus depuis PHP 5.3.

    Par conséquent, nous sommes en train de déprécier ces pilotes que nous aurons à retirer dans les prochaines versions de CodeIgniter. Vous devez utiliser les pilotes les plus avancés, soit sqlite3 ,sqlsrv ou AOP / sqlsrv .

    Remarque : Ces pilotes sont encore disponibles, mais vous êtes fortement encouragés migrer au plus tôt.

    La sécurité du helper do_hash()

    La function do_hash() est maintenant juste un alias pour la fonction de hachage de PHP. Il est obsolète et est programmé pour être supprimé dans CodeIgniter 3.1 +.

    Note :
    Cette fonction est toujours disponible, mais vous êtes fortement encouragé à retirer arrêter son utilisation au plus tôt.

    Le helper read_file()

    La fonction read_file() est maintenant un simple alias de la fonction PHP native file_get_contents(). Cette fonction est dépréciée, elle sera supprimé dans CodeIgniter 3.1+.

    Note :
    Cette fonction est toujours disponible, mais vous êtes fortement encouragé à retirer son utilisation au plus tôt.

    String helper repeater()

    La fonction est maintenant un simple alias de la fonction PHP native str_repeat(). Cette fonction est dépréciée, elle sera supprimé dans CodeIgniter 3.1+.

    Note :
    Cette fonction est toujours disponible, mais vous êtes fortement encouragé à retirer son utilisation au plus tôt.

    Le helper trim_slashes()

    Cette est maintenant un simple alias de la fonction PHP native trim() (avec un slash passé en second argument). Cette fonction est dépréciée, elle sera supprimé dans CodeIgniter 3.1+.

    Note :
    Cette fonction est toujours disponible, mais vous êtes fortement encouragé à retirer son utilisation au plus tôt.

    le helper Email

    Le Helper Email a seulement 2 fonctionnalités

    • :func:`valid_email()`
    • :func:`send_email()`

    Deux d’entre eux sont maintenant des alias pour la fonction native filter_var () de PHP et le mail() . Par conséquent, le:doc:Email Helper < .. / Helpers / email_helper> tout est obsolète et est prévue pour le déménagement à CodeIgniter 3.1 +.

    Note
    Cette fonction est toujours disponible, mais vous êtes fortement encouragé à retirer son utilisation au plus tôt.

    Date helper standard_date()

    La function standard_date() is being deprecated due to the availability of native PHP constants, which when combined with date() provide the same functionality. Furthermore, they have the exact same names as the ones supported by standard_date(). Here are examples of how to replace its usage:

    // Old way
    standard_date(); // defaults to standard_date('DATE_RFC822', now());
    
    // Replacement
    date(DATE_RFC822, now());
    
    // Old way
    standard_date('DATE_ATOM', $time);
    
    // Replacement
    date(DATE_ATOM, $time);
    

    Note

    This function is still available, but you’re strongly encouraged to remove its usage sooner rather than later as it is scheduled for removal in CodeIgniter 3.1+.

    HTML helpers nbs(), br()

    :doc:HTML Helper &lt;../helpers/html_helper&gt; functions nbs() and br() are just aliases for the native str_repeat() function used with &nbsp; and <br > respectively.

    Because there’s no point in just aliasing native PHP functions, they are now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    These functions are still available, but you’re strongly encouraged to remove their usage sooner rather than later.

    Pagination library ‘anchor_class’ setting

    The :doc:Pagination Library &lt;../libraries/pagination&gt; now supports adding pretty much any HTML attribute to your anchors via the ‘attributes’ configuration setting. This includes passing the ‘class’ attribute and using the separate ‘anchor_class’ setting no longer makes sense. As a result of that, the ‘anchor_class’ setting is now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    This setting is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    String helper random_string() types ‘unique’ and ‘encrypt’

    When using the :doc:String Helper &lt;../helpers/string_helper&gt; function :func:random_string(), you should no longer pass the unique and encrypt randomization types. They are only aliases for md5 and sha1 respectively and are now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    These options are still available, but you’re strongly encouraged to remove their usage sooner rather than later.

    URL helper url_title() separators ‘dash’ and ‘underscore’

    When using the function, you should no longer pass dash or underscore as the word separator. This function will now accept any character and you should just pass the chosen character directly, so you should write ‘-‘ instead of ‘dash’ and ‘_’ instead of ‘underscore’.

    dash and underscore now act as aliases and are deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    These options are still available, but you’re strongly encouraged to remove their usage sooner rather than later.

    Session Library method all_userdata()

    As seen in the :doc:Change Log &lt;../changelog&gt;, :doc:Session Library &lt;../libraries/sessions&gt; method userdata() now allows you to fetch all userdata by simply omitting its parameter:

    $this->session->userdata();
    

    This makes the all_userdata() method redudant and therefore it is now just an alias for userdata() with the above shown usage and is being deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    This method is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    Database Forge method add_column() with an AFTER clause

    If you have used the third parameter for :doc:Database Forge &lt;../database/forge&gt; method add_column() to add a field for an AFTER clause, then you should change its usage.

    That third parameter has been deprecated and scheduled for removal in CodeIgniter 3.1+.

    You should now put AFTER clause field names in the field definition array instead:

    // Old usage:
    $field = array(
            'new_field' => array('type' => 'TEXT')
    );
    
    $this->dbforge->add_column('table_name', $field, 'another_field');
    
    // New usage:
    $field = array(
            'new_field' => array('type' => 'TEXT', 'after' => 'another_field')
    );
    
    $this->dbforge->add_column('table_name', $field);
    

    Note

    The parameter is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    Note

    This is for MySQL and CUBRID databases only! Other drivers don’t support this clause and will silently ignore it.

    URI Routing methods fetch_directory(), fetch_class(), fetch_method()

    With properties CI_Router::$directory, CI_Router::$class and CI_Router::$method being public and their respective fetch_*() no longer doing anything else to just return the properties – it doesn’t make sense to keep them.

    Those are all internal, undocumented methods, but we’ve opted to deprecate them for now in order to maintain backwards-compatibility just in case. If some of you have utilized them, then you can now just access the properties instead:

    $this->router->directory;
    $this->router->class;
    $this->router->method;
    

    Note

    Those methods are still available, but you’re strongly encouraged to remove their usage sooner rather than later.

    Input library method is_cli_request()

    Calls to the CI_Input::is_cli_request() method are necessary at many places in the CodeIgniter internals and this is often before the :doc:Input Library &lt;../libraries/input&gt; is loaded. Because of that, it is being replaced by a common function named :func:is_cli() and this method is now just an alias.

    The new function is both available at all times for you to use and shorter to type.

    // Old
    $this->input->is_cli_request();
    
    // New
    is_cli();
    

    CI_Input::is_cli_request() is now now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    This method is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    Config library method system_url()

    Usage of CI_Config::system_url() encourages insecure coding practices. Namely, your CodeIgniter system/ directory shouldn’t be publicly accessible from a security point of view.

    Because of this, this method is now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    This method is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    The Javascript library

    The :doc:Javascript Library &lt;../libraries/javascript&gt; has always had an ‘experimental’ status and was never really useful, nor a proper solution.

    It is now deprecated and scheduled for removal in CodeIgniter 3.1+.

    Note

    This library is still available, but you’re strongly encouraged to remove its usage sooner rather than later.

    Step 18: Check your usage of Text helper highlight_phrase()

    The default HTML tag used by :doc:Text Helper &lt;../helpers/text_helper&gt; function :func:highlight_phrase() has been changed from <strong> to the new HTML5 tag <mark>.

    Unless you’ve used your own highlighting tags, this might cause trouble for your visitors who use older web browsers such as Internet Explorer 8. We therefore suggest that you add the following code to your CSS files in order to avoid backwards compatibility with old browsers:

    mark {
            background: #ff0;
            color: #000;
    };
    
  • Mise à jour de Codeigniter

    Mise à jour de Codeigniter

    La mise à jour de codeigniter 2.2.0 est disponible et elle corrige des failles de sécurités. Elle est accessible pour tous ici. Je vous invite fortement à mettre à jour votre framework car la procédure est triviale.

    (copier le dossier « system » contenu dans l’archive pour remplacer celui de votre projet.)

    Cela dit en passant, la version 3.0 de Codeigniter est elle aussi disponible, pour les nouveau projets je me tâte à l’utiliser car de nouvelle fonctionnalités sont présentes et bien utiles.

    je m’auto plagie avec ce copier collé depuis le forum codeigniter-france.fr où j’ai lancé le sujet :

    • Intégration de composer
    • PHPUnit
    • support de l’ipv6
    • Ajout de la possibilité d’exclure des pages de la protection contre les failles CRSF
    • Ajout de la possibilité d’avoir des controllers dans des sous-dossier
    • Fin du support de PHP 5.1.6 CodeIgniter requiers >= PHP 5.2.4
    • Le driver ‘mysql est déprécié au profit de MySQLI
    • MySQLi a besoin de MySQL version >= 5.1

    @ bientôt

     

     

     

  • Développement d’une class PHP pour Heitz SYSTEM

    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

  • Les hacks CSS (memento)

    Les hacks CSS (memento)

    Voici un petit article qui peu servir à beaucoup de monde, même si l’abandon d’IE à apporté une bouffée d’oxygène à la création web, il reste des moments où des différences d’affichage se font sentir entre Firefox IE et WebKit (Safari, Chrome et bientôt Opéra).

    Voici des éléments à ajouter à votre feuille de style CSS pour appliquer des rendu spécifiques à certain moteurs.

    On commence par WebKit avec par exemple une marge de 10 px :

    @media screen and (-webkit-min-device-pixel-ratio:0)
    {
        #monId {
            margin : 10px;
        }
    }

    Pour Firefox :

    @-moz-document url-prefix()
    {
         #monId {
            margin : 10px;
        }
    }

    Le plus Courant, un Hack pour IE :

    <!--[if lt IE 8]>
    <br />
    <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%23monId%20%7B%0A%20%20%20%20%20margin%20%3A%2010px%3B%0A%7D%0A%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="<style>" title="<style>" />
    <p>
    < ![endif]-->
  • CodeIgniter et la gestion des bases de données

    CodeIgniter est capable au travers de « drivers » de gérer plusieurs types de base de données tel-que :

    • Cubrid
    • msSql
    • mysql
    • mysqli
    • oci8
    • odbc
    • postgre
    • sqlite
    • sqlsrv

    Un grand choix donc. J’ai pu rajouter FirebridSQL car un pilote à été créé mais là je me suis rendu compte des limites du système.

    Je vous réexplique : j’ai 2 BDD sous FirebridSQL et une sous mySQL, mon objectif est de toutes les faire discuter.

    Dans la configuration on ne me propose de n’utiliser qu’un seul type de BDD avec n bases mais pas plusieurs BDD simultanément ou alors je n’ai pas trouvé comment.

    Tout l’intérêt de passer par le pilote du FrameWork c’est d’avoir Active Record pour interroger la base de donnée. Ce design pattern simplifie grandement le travail, il est fortement inspiré de ROR (ruby on rails).

    pour information voici ce qu’on peut faire avec une requête de sélection :

    $query = $this->db->get('mytable');

    Et c’est tout ! Extraordinaire non ? Bon allé c’est à peine plus long, voici un code complet qui va se retrouver dans un fichier de mon modele :

     <?php
     
     public function getSouplMuscById($configuration_exercice_id_fk, $bilan_id_fk, ){
            
                $this->db->select('valeur_1, valeur_2, masse');
                $this->db->from('exercice');
                $this->db->where('configuration_exercice_id_fk', $configuration_exercice_id_fk);
                $this->db->where('bilan_id_fk', $bilan_id_fk);
    
                $query = $this->db->get();
    
                if ($query->num_rows() > 0)
                {
                    foreach ($query->result() as $row ) {
                        array_push($this->_arraySouplMusc,
                                                     array(
                                                            $row->valeur_1,
                                                            $row->valeur_2,
                                                            $row->masse)
                                );
                        }
                    return (array) $this->_arraySouplMusc;
                } else {
                    return (bool) false;
                }
            }