Langages

Cette catégorie est dédiée aux différents langages utilisés pour développer un site internet sur une architecture AMP (Apache, MySQL, PHP). A ces langages s'ajoute les expressions régulières car elles sont très utiles et méritent bien d'avoir leur propre rubrique.

Fil des billets - Fil des commentaires

dimanche 9 octobre 2016

Log coloré en TCL

Pour faire suite au billet Log coloré en PHP, voici la version utilisable en TCL.

Je me suis appuyé sur une astuce donnéesur wiki.tcl.tk et tout particulièrement sur la proposition d'Andy Goth.

Code

namespace eval d {
   variable levels {"error" "warning" "notice" "debug" "info" "success"}
   foreach {name value} {r 1 g 2 b 4 c 6 m 5 y 3} {
      proc $name {} "return \033\\\[01\\;3${value}m"
      proc [string toupper $name] {} "return \033\\\[01\\;4${value}m"
   }
   proc n {} {return \033\[\;0m}
   proc puts {text {level ""}} {
      switch -nocase $level {
         "error" { ::puts "[r]$text[n]" }
         "warning" { ::puts "[y]$text[n]" }
         "notice" { ::puts "[c]$text[n]" }
         "debug" { ::puts "[m]$text[n]" }
         "info" { ::puts "[b]$text[n]" }
         "success" { ::puts "[g]$text[n]" }
         default { ::puts "$text" }
      }
   }
}

Utilisation

Voici un petit script de test:

#/usr/bin/tclsh
source debugger.tcl
foreach level $::d::levels {
   ::d::puts "Level is set to $level" $level
}

Le rendu sera:

Level is set to error
Level is set to warning
Level is set to notice
Level is set to debug
Level is set to info
Level is set to success

jeudi 28 juillet 2016

Log coloré avec PHP en console (PHP-CLI)

Il arrive que l'on fasse des scripts PHP qui doivent fonctionner en console, mais l'affichage est terne (blanc sur fond noir) et ne permet pas de mettre en valeur les messages importants.

J'ai donc créé une fonction log qui permet de coloriser le texte affiché sur une console linux. Elle fonctionne aussi avec MobaXterm, je ne l'ai pas testée avec cygwin.

La fonction

/*
 * Display a colored message, based on level
 * @var string $message The message to display
 * @var string $level The level (none, success, info, warning, error)
 * @var array $disp An array of informations to display
 * @void
 */
function log($message, $level='', $disp=array('class'=>true, 'function'=>true, 'file'=>true, 'line'=>true)) {
    $c = array(
        'r' => "\033[31m",
        'g' => "\033[32m",
        'b' => "\033[34m",
        'y' => "\033[33m",
        'n' => "\033[0m"
    );
    $bt = debug_backtrace();
    $caller = array_shift($bt);
    $precaller = array();
    if (count($bt)>0) {
        $precaller = array_shift($bt);
    }
    $prefixes = array();
    if ($disp['class'] === true && array_key_exists('class', $precaller)) { $prefixes[] = $precaller['class']; }
    if ($disp['function'] === true && array_key_exists('function', $precaller)) { $prefixes[] = $precaller['function']; }
    if ($disp['file'] === true && array_key_exists('file', $precaller)) {
        $prefixes[] = $precaller['file'];
    } elseif ($disp['file'] === true) {
        $prefixes[] = $caller['file'];
    }
    if ($disp['line'] === true) { $prefixes[] = $caller['line']; }
    $prefix = implode('::', $prefixes).'::';
    switch($level) {
        case 'success': echo $c['g'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'info': echo $c['b'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'warning': echo $c['y'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        case 'error': echo $c['r'], $prefix, ' ', $message, $c['n'], PHP_EOL; break;
        default: echo $prefix, ' ', $message, PHP_EOL; break;
    }
}

Explications

Les couleurs

On crée un tableau contenant les différents codes couleurs ANSI a appliquer. Je ferai bientôt une petite explication sur ces codes. Notez bien que les codes doivent être entre guillemets et pas entre apostrophes, sans quoi ils ne seront pas interprétés.

La couleur n (normal) est en fait le retour à la normale, une suppression du code précédemment appliqué.

backtrace

La fonction PHP debug_backtrace permet d'obtenir dans un tableau toute la chaîne ayant permis d'arriver à l'exécution de la ligne courante, dans l'ordre anté-chronologique.

La première entrée du tableau contient une information très importante pour nous: le numéro de la ligne ayant appelé la fonction courante. La deuxième entrée du tableau, si elle existe, contient les informations sur le fichier, la classe et la fonction ayant appelés la fonction courante. S'il n'y a qu'une entrée dans le tableau, cela signifie que l'appel a été fait hors de toute fonction.

vendredi 11 septembre 2015

Installer une extension sur Yii2 sans composer

Lorsque Yii2 est sorti, une grande avancée a été faite dans son système d'installation, ainsi que dans celui des extensions: l'utilisation de composer. Composer est un outil de gestion des dépendances en PHP qui est fort utile et pratique, un peu comme les gestionnaires de package sous linux (apt, yum, ...). Mais parfois, on ne peut pas l'utiliser, et c'est plutôt bloquant.

Je vais donc vous décrire, si possible simplement, comment ajouter une extension à Yii2 à la main.

Lire la suite...

mardi 13 mai 2014

Utiliser le webservice HPOO runFlow avec SOAP

Ce billet concerne fort peu de monde en l'état, mais contient diverses astuces et réflexions sur l'utilisation de SOAP et des objets relativement complexes à y intégrer, la documentation n'étant pas très explicite. La part HPOO est anecdotique, c'est essentiellement parce que c'est l'interfaçage avec ce système qui m'a posé des soucis.

J'espère que ce petit résumé de mes pérégrinations au sein du SOAP et des webservices HPOO aideront certains qui pourraient tomber sur les mêmes écueils que moi.

Lire la suite...

lundi 17 mars 2014

Bloquer la sortie d'une page

Parfois, on a besoin de pouvoir interdire de quitter une page web autrement que par le "cheminement normal", c'est à dire très souvent par l'envoi d'un formulaire. Le but n'est bien entendu pas d'emprisonner le visiteur sur la page mais de l'alerter et de lui demander une confirmation de l'action qu'il veut réaliser.

L'astuce suivante fait appel à JQuery pour une simplification du code et de sa compatibilité entre les navigateurs mais peut être codée à la main si vous le désirez.

Bloquer la sortie

Pour cela, il suffit de faire appel à onbeforeunload une fois la page chargée:

jQuery(function($) {
   $(window).bind('beforeunload', function(){
      return 'message de confirmation';
   });
});

Le message de confirmation n'est pas visible sur tous les navigateurs, je ne l'ai vu que sur IE8 et il est plutôt mal mis en page.

Avec ce script, toute action fermant la page (même la fermeture du navigateur) demandera une confirmation à l'utilisateur.

Autoriser la sortie normale

La sortie normale de la page devant s'effectuer par une validation de formulaire, il suffit donc d'ajouter une fonction onclick sur le bouton de soumission qui désactivera le script:

<input type="submit" value="envoyer" onclick="$(window).unbind('beforeunload');" />

Un bloc à onglets sous Yii

J'ai eu besoin de pouvoir intégrer facilement un bloc avec des onglets dans une page générée par Yii et je n'ai rien trouvé d'assez léger, j'ai donc développé une petite extension: ETabbedDiv.

Elle utilise les fonctionnalités de jquery-ui et s'implémente très facilement:

Utilisation

  • dézippez le fichier et copiez ETabbedDiv.php dans votre répertoire protected/extensions/
  • appelez le widget depuis votre vue, comme dans l'exemple suivant:
<?php $this->widget('application.extensions.ETabbedDiv',
   array(
      'divClass' => 'tabbed',
      'tabs' => array(
         'tab1' => array('content' => '<p>Ceci est le premier onglet</p>'),
         'tab2' => array('title'=>'Second', 'content' => '<p>Ceci est le second onglet</p>'),
         'other' => array('content' => '<p>Et voila le dernier onglet</p>'),
      ),
   ),
);
?>

Paramètres

  • divClass (optionnel) est la classe CSS qui sera appliquée au bloc contenant les onglets,
  • tabs est un tableau associatif des onglets, sous la forme id => tableau de contenu décrit ci-dessous
    • title (optionnel) est le titre qui sera affiché dans l'onglet. S'il n'est pas renseigné, id sera utilisé
    • content est le contenu HTML a afficher dans l'onglet

Source

Vous trouverez la version anglaise sur Yii Framework

Lien de téléchargement sur ce blog : ETabbedDiv

lundi 14 octobre 2013

[MàJ] Yii : ajout d'une entrée depuis le CGridView

(Mise à jour : ajout de l'option fillIsFilter) Il est parfois utile de pouvoir remplir un CGridView directement depuis sa vue sans avoir à changer de page. Cette extension permet d'avoir un formulaire dans la grille et d'ajouter à la volée de nouvelles entrées.

Pour les anglophones, la source originale est sur cette page.

Lire la suite...

vendredi 21 juin 2013

Recherche sur plage de taille avec CGridView

En travaillant sur un système de reporting de transferts de fichier (utilisant Yii), j'ai eu besoin d'un champ permettant de faire une recherche sur la taille des fichiers, avec une syntaxe "humainement compréhensible". Et cela avec un seul champ de recherche. (traduction de mon article à http://www.yiiframework.com/wiki/516/search-a-file-size-range-in-cgridview/)

Lire la suite...

Lecture de date en PHP

Etant très souvent embêté avec les différents formats de dates utilisés au sein d'un même site, j'ai exploré le manuel PHP et j'avais trouvé DateTime::createFromFormat très pratique. Mais valable uniquement en PHP 5.3 minimum. Qu'à cela ne tienne, voici presque une équivalence pour PHP 5.1 et plus.

Lire la suite...

dimanche 9 décembre 2012

Access denied for user ‘debian-sys-maint’@'localhost’ (using password: YES)

Sur Debian, il arrive parfois que cette erreur apparaisse lors d'une tentative de mise à jour de MySQL, ou même lorsque l'on désire arrêter le serveur.

En fait, l'utilisateur debian-sys-maint n'est pas toujours créé, ou bien il est créé sans les bons privilèges, ce qui est génant.

Correction

Le mot de passe de cet utilisateur se trouve dans le fichier /etc/mysql/debian.cnf. Une fois que vous l'avez copié, connectez-vous en tant que root sur la base mysql du serveur:

mysql -u root -p mysql

Et là, donnez les bons droits à l'utilisateur debian-sys-maint (en remplaçant PASSWORD par le mot de passe précédent):

GRANT ALL privileges ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

Redémarrez MySQL, tout doit être bon.

- page 1 de 5