Css 3.0

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;
            }
        }

 

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…

free logo

Blocage des pubs par free, je suis d’accord ! #adGate

En ce début d’année, Free nous a fait un beau cadeau, lors de la mise à jour du FirmeWare 1.1.9 de la Freebox révolution, un système de blocage des publicités a été ajouté. De nombreuses voix s’élèvent actuellement pour dénoncer cette mise en place. On entend parler de refus de la neutralité du net, de solution démagogiques…

Même si le faite d’activer par défaut le système dans la box de Free ne me semble pas la meilleure idée. Subir un peu moins la publicité n’est pas pour me déplaire. Concernant la neutralité, jusqu’à preuve du contraire Free délivre un service ou la neutralité est garantie jusqu’à l’utilisateur, qui peux décider, c’est son choix d’activer ou désactiver cette option qui affichera ou non les publicités.

Il faut bien comprendre qu’à partir du moment où Le choix est laissé à l’utilisateur (le gestionnaire du réseau local), la neutralité et garantie. Je m’insurgerai si Free imposait cette solution à tout son réseau sans qu’il soit possible de la désactiver. La solution de Free est sans doute maladroite « Opt out » mais c’est une solution.

De nombreuses personnes utilisent adblock pour bloquer les publicités du coup, le Net qui reçoivent sur leur navigateur n’est plus neutre mais c’est leur choix de la même manière que je décide d’administrer comme bon me semble mon réseau local.

@ bientôt, Grand Maitre L

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