codeigniter logo

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

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] »>

Installer Un Serveur web linux Fedora de A à www

Tout au long de ce tutoriel je vais vous apprendre à installer un serveur web avec la distribution linux Fedora.

Lorsque les commandes commencent par un $, c’est que je suis un simple utilisateur si non c’est un # et je suis un super utilisateur, dans tous les cas il ne faut pas recopier le $ ou le # pour exécuter la commande.

Etape 1

Etape 2

Le gros avantage c’est que tout est en français, de plus l’installation permet d’utiliser la souris (Qui à dit que linux c’est compliqué ?).

  • Montage de l’image disque dans Virtual box ou installation sur une machine dédiée (dans ce cas il faut démarrer sur le cd).
  • Sélection du type d’installation : (je choisis de n’installer que le noyau et la couche réseau sans l’interface graphique)
  • Je décide d’ajouter « fedora 15 repository i-386 » en dépôt

Etape 3

  • Redémarrage de la machine suite à l’installation de l’os
  • Redémarrage de l’interface réseau pour l’attribution d’une ip (commande : # service network restart)

Création d’un utilisateur pour mes besoins personnels avec la commande :

# adduser luc

ensuite

# passwd luc

  • Prise de connaissance de l’IP attribuée avec « ifconfig » en l’occurrence c’est l’ip 192.168.1.106 qui m’a été attribuée
  • Comme le protocole SSH est automatiquement disponible et pour avoir plus de confort notamment le copier collé je me connecte via le logiciel « Putty » (commande : ssh root@192.168.1.106 en tant qu’utilisateur root)
  • Je réalise une commande : « # yum update » pour être sûr d’avoir la dernière version de linux et des ces composants
  • Installation de man (manuel d’utilisation) avec la commande # yum install man
  • Installation de nano comme éditeur de texte # yum install nano
  • Comme la machine que j’utilise va être un serveur web il est judicieux quelle soit avec une IP fixe pour cela je me rend dans le dossier sysconfig avec la commande : $ cd /etc/sysconfig , je vérifie que la directive NETWORKING est à « yes » grâce à la commande $ nano network
  • Je me rends dans le dossier network-scripts puis dans le fichier ifcfg-eth0
  • (celui de la carte réseau) pour appliquer les réglages :

DEVICE=eth0

TYPE=Ethernet

BOOTPROTO=none

ONBOOT=yes

USERCTL=yes

IPADDR=192.168.1.106

GATEWAY=192.168.1.254

NETMASK=255.255.255.0

DNS1= 212.27.40.240

  • Comme je veux que network soit lancé au démarrage de la machine j’utilise la commande : # su -lc ‘chkconfig network on’
  • Je redémarre ma machine pour appliquer les réglages avec la commande $ reboot
  • Apres le redémarrage j’exécute la commande $ ifconfig qui me renvoi :

Link encap:Ethernet HWaddr 08:00:27:F7:DE:DD

inet adr:192.168.1.106 Bcast:192.168.1.255 Masque:255.255.255.0

adr inet6: 2a01:e35:8a50:5350:a00:27ff:fef7:dedd/64 Scope:Global

adr inet6: fe80::a00:27ff:fef7:dedd/64 Scope:Lien

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:47 errors:0 dropped:0 overruns:0 frame:0

TX packets:42 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 lg file transmission:1000

RX bytes:5565 (5.4 KiB) TX bytes:5485 (5.3 KiB)

 

lo Link encap:Boucle locale

inet adr:127.0.0.1 Masque:255.0.0.0

adr inet6: ::1/128 Scope:Hôte

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 lg file transmission:0

RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

  • Je peux ainsi constater que mes réglages IP ont bien été effectués

Etape 3

  • Installation du serveur web apache avec la commande # yum install httpd
  • Installation du manuel de apache avec la commande # yum install httpd-manual
  • Installation du module ssl de apache avec la commande # yum install mod_ssl
  • Démarrage de apache, commande : # service httpd start
  • Comme je veux que apache soit lancé au démarrage de la machine j’utilise la commande : # su -lc ‘chkconfig httpd on’
  • Redémarrage de apache avec la commande # service httpd restart

Etape 4

  • Pour que apache soit accessible depuis l’extérieur et opérationnel, il faut ouvrir le port 80. Je me rends dans le fichier iptables avec la commande

# cd /etc/sysconfig et je rajoute la ligne :

-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT

Comme mon fournisseur d’accès est free et qu’il gère l’ip v6 je fais de même dans le fichier ip6tables

  • Pour restreindre l’accès aux adresses ip de ma machine je modifie le ficher /etc/httpd/conf/httpd.conf et je modifie la directive par défaut suivante :

Listen 80

Par

Listen 127.0.0.1:80 192.168.1.107:80

On peut vérifier que le serveur écoute sur les bonnes adresses avec la commande :

Netstat –an | grep 80 qui renvoie :

tcp 0 0 192.168.1.107:80 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN

 

Etape 5

  • Dans le dossier /var/www je crée le dossiers suivant en utilisant la commande :

# mkdir site1

  • comme les dossiers ont été créé par l’utilisateur root, il faut changer le propriétaire pour cela j’utilise la commande suivante :

# chown luc:luc site1

Je dois ensuite modifier les droits pour le dossier site1, pour cela je donne au propriétaire tous les droits, aux membres du groupe et aux autres les droits de lecture et d’accès.

Je fais :

# chmod 755 site

  • Avec la commande :

# ll

Je liste le contenu du répertoire www, je peux ainsi contrôler les droits et permissions de mes dossiers.

drwxr-xr-x. 2 root root 4096 27 oct. 12:04 cgi-bin

drwxr-xr-x. 3 root root 4096 22 janv. 19:19 error

drwxr-xr-x. 2 root root 4096 23 janv. 17:33 html

drwxr-xr-x. 3 root root 4096 22 janv. 19:19 icons

drwxr-xr-x. 14 root root 4096 22 janv. 20:02 manual

drwxr-xr-x. 2 luc luc 4096 27 janv. 21:32 site1

Etape 6

  • Ajout des hôtes virtuels dans le dossier : /etc/httpd/conf.d

Je crée le fichier virtualhost.conf avec la commande :

# nano virtualhost.conf

Et j’y inscris :

<VirtualHost 127.0.0.1:80>

DocumentRoot /var/www/site1

<Directory /var/www/site1>

Order allow,deny

Allow from all

</Directory>

</VirtualHost>

  • Il faut maintenant créer les fichiers d’accueil à la racine de ces sites avec la commande :

# nano site1/index.htm

Comme c’est l’utilisateur root qui à créé ces fichiers, il faut que change le propriétaire avec les commandes :

# chown -R luc:luc site1

  • Avec la commande more je m’assure que mes dossiers et les contenus sont conformes :

# more site*/index.htm

  • En retour j’ai :

::::::::::::::

site1/index.htm

::::::::::::::

Coucou site 1

::::::::::::::

  • Je me rends ensuite dans le dossier site1 avec la commande :

# cd site1

  • Le système de sécurité « SeLinux » à été problématique, il est installé d’origine sur fédora15, la doc n’est pas clair je dois modifier les capacités d’exécution des scriptes dans le dossier cgi-bin avec la commande # chcon –t httpd_sys_script_exec_t *.cgi

Comme j’ai autorisé le ssh à s’exécuter je peux sans problème proposer à mes utilisateurs d’utiliser un logiciel comme FileZilla pour mettre à jours leur site, ils se connecteront via sftp avec leur compte utilisateur, ce sera beaucoup plus sécurisé et aussi efficace que d’utiliser le protocole ftp.

Pour vérifier que mon travail est terminé et comme je n’ai pas d’interface graphique j’installe le navigateur en mode texte Lynx avec la commande # yum install lynx

Je peux ainsi constater que mon travail est terminé.

@bientot 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