Catégorie : php

Php : comment faire un trim() sur tout un array()

C’est simple, et voici comment faire en trois lignes (si vous enlevez mes commentaires) : je crée une fonction anonyme qui est appelée en boucle par array_walk() et qui fait un ‘trim’ sur l’élément en cours :

/* Pas très propre, mais rapide et qui reste
 * compréhensible : je crée une fonction anonyme qui
 * est appelée en boucle par array_walk() et qui fait
 * un 'trim' sur l'élément en cours :
 */
array_walk($tab,
  create_function('&$item,$key', '$item = trim($item);')
);

Php et utf-8 : comment lire correctement un fichier texte

Si vous essayez de lire un fichier en utf8 mais que vous avez des problèmes, voici une solution toute simple qui pourra vous aider : essayez de rajouter l’option « u » lorsque vous ouvrez le fichier. Mon code ne fonctionnait pas correctement jusqu’à ce que je trouve cette astuce :

$handle = @fopen('wfrench-1.2.3/dico', 'ru');
if ($handle!==false) {
  while (($buffer = fgets($handle, 4096)) !== false) {
    array_push( $mots, $buffer);
  }
  if (!feof($handle)) {
    fclose($handle);
    throw new Exception("Erreur: fgets() a échoué");
  }
  fclose($handle);
}
else {
  throw new Exception("Erreur: fopen() a échoué\n");
}

Nouvelle version de Smarty – 3.1 : les avantages

J’ai récemment mis à jour quelques-uns de mes sites avec la nouvelle version de Smarty, la version 3.1.
Plusieurs choses sont maintenant possibles et c’est très appréciable.
La plus importante c’est le fait que Smarty détecte maintenant de manière très intelligente si les accolades {} sont pour lui ou pas.
Il est donc tout à fait possible de coder du JavaScript et de mettre du CSS sans utiliser {literal}{/literal}.

Pour toutes les personnes qui utilisent Smarty, ils réaliseront rapidement à quel point c’est pratique.

De plus les warnings sont à « on » par défaut, c’est à dire que si les variables n’existent pas, on a le warning classique Php. On aime ou on aime pas, mais maintenant il faut souvent utiliser {if isset($mavariable)}{/if}.

Enfin, l’autre différence majeure que j’ai noté, c’est la rapidité : c’est tout simplement incomparablement plus rapide. Vraiment. Surtout pour les tableaux et autres, c’est impressionnant. A vous de voir.

Smarty 3.1 et les plugins : comment faire / howto

Sur la toute dernière version de Smarty (3.1), voici comment créer un plugin personnalisé.
Pour résumer, l’un de mes sites n’était pas assez optimisé.
Le code qui sortait était :

<body class="sbody">
    <div>
....
    </div>
....
</body>

J’ai donc ajouté le filtre d’optimisation qui supprime les espaces en début :

$this->smarty->loadFilter('output', 'trimwhitespace');

Le code de sortie est devenu :

<body class="sbody"><img src="/title.jpg" /><div>....</div>....</body>

Tout mise en une ligne, super !
Le seul problème, c’est que ça ne fonctionnait pas avec le code JavaScript, il faut en effet les retours à la ligne.
J’ai donc crée mon plugin qui ne fait que supprimer les espaces en début de ligne, et remplacer de « retour + line feed » (deux octets) de fin de ligne par un seul octet « retour ».

Voici le code, je vous laisse comprendre, c’est extrêmement simple :

/* Déclarer un plugin "block".
 * Block = il faut un début et une fin.
 * Ici : {triml} {/triml}
 */
$this->smarty->registerPlugin('block',
  'triml', array($this,'smarty_block_trim_l'));

Après avoir déclaré le plugin, il faut faire la fonction adéquate :

/**
 * Fonction de plugin smarty pour supprimer tous les espaces
 * en début de ligne entre les blocs {triml}{/triml}
 * "triml" = trimleft
 * Voir le constructeur et chercher $this->smarty->registerPlugin()
 *
 * @param array $params les paramètres qu'on passe à {strip_nl}
 * @param variant $content Le contenu qu'il y a dans le bloc
 * @param variant $template Le nom du template
 * @param variant &$repeat
 *
 * @return int Description retour
 */
public function smarty_block_trim_l(
  array $params, $content, $template, &$repeat)
{
  $content = preg_replace('/\n[\s]+/', "\n", $content);
  return $content;
}

Et voilà maintenant, vous pourrez aussi optimiser votre site comme un professionnel.
Bien évidemment le gain le plus gros est dans la compression (voir mod_deflate)

Php / optimisation / compilation et le projet du compilateur FaceBook

Saviez vous que Facebook a eu une idée assez intéressante ?
Ils ont crée un outil qui transforme le code Php en code C++ et qu’on peut donc compiler.
D’ailleurs la plupart des choses de FaceBook tournent via cet outil, pour accélérer et optimiser au maximum leur site.
Il est ainsi possible de pousser la performance Php à l’extrême.

Pour ceux qui veulent rendre leur site encore plus rapide, voici le lien :

https://github.com/facebook/hiphop-php

WordPress, Php et XML rpc – how-to. Explication

WordPress est un outil formidable. Il offre la possibilité d’envoyer des articles à distance.
Pour ce faire, entre autres, les développeurs ont crée une page qu’il faut appeler en lui passant les paramètres adéquats.
Cette page est située à la racine de l’installation de votre site WordPress. Par exemple si vous avez installé WordPress sur http://monsite.com/wordpress/, il faudra appeler la page http://monsite.com/wordpress/xmlrpc.php

Passons maintenant aux choses sérieuses : comment automatiser un envoi d’articles en php ?
C’est extrêmement simple. Je vous donne les indices, et à partir de là, à vous de finir de développer afin d’atteindre votre objectif.

Première chose : il faut que le PC qui doit envoyer les articles ait Php d’installé, avec le support XML rpc. Dit autrement, il faut qu’il soit compilé avec l’option --with-xmlrpc, ce qui n’est pas le cas par défaut. A vous de vous débrouiller tout seul pour arriver à activer l’option. Si vous êtes sous Linux, et que vous avez tout compilé à la main, comme un bon guerrier que vous êtes, il vous suffit d’afficher une page qui éxecute "phpinfo();" et Php vous affichera la ligne de compilation, il vous suffira de recompiler avec l’option --with-xmlrpc.

Une fois cette tâche terminée, il vous faudra activer sur le site WordPress concerné, l’option XML rpc. Il faut se connecter en tant qu’administrateur, aller dans le menu Réglagles » Ecriture » Publication à distance et cocher l’option XML-RPC.

Enfin on y arrive, le code qui se connecte et envoie quelque chose !

  1 <?php
  2 /* Exemple WordPress, Php et XML rpc  */
  3
  4 $request =
  5   xmlrpc_encode_request(
  6     "wp.getUsersBlogs",
  7     array("nom_d_utilisateur", "mot_de_passe")
  8   );
  9 $context =
 10   stream_context_create(array('http' => array(
 11     'method' => "POST",
 12     'header' => "Content-Type: text/xml",
 13     'content' => $request
 14   )));
 15 $file = file_get_contents(
 16   "http://monsite.com/wordpress/xmlrpc.php", false,
 17   $context);
 18
 19 $response = xmlrpc_decode($file);
 20
 21 if ($response && xmlrpc_is_fault($response)) {
 22     print(utf8_encode(
 23       "xmlrpc: $response[faultString] ($response[faultCode])"
 24     ));
 25 } else {
 26     print_r($response);
 27 }
 28 ?>

Donc là vous avez le code.
Pour terminer, toutes les fonctions disponibles sont ici : http://codex.wordpress.org/XML-RPC_wp.
Elles ne semblent pas trop à jour, alors si vous voulez la liste réelle, regardez votre dans le blog, le fichier ./wp-includes/class-wp-xmlrpc-server.php, la fonction wp_xmlrpc_server().
Vous y verrez toutes les fonctions que vous pourrez appeler en XML RPC.

C’est tout de même bien mieux de se faire son outil qui fait les envois d’articles à distance, plutôt que d’en acheter un, non 🙂 ?

ExtJS et Panel : le layout « absolute »

Après plusieurs heures de recherches, j’ai enfin compris comment fonctionnait le layout « absolute ».
L’utilité de la disposition "absolute", est qu’on peut positionner les éléments dans le conteneur à un endroit bien précis, au pixel près.
Voici l’astuce qui m’a fait perdre tellement de temps, et qui, je l’espère, vous en fera gagner :
D’habitude, sur tous les « layout » existants, lorsqu’on les définit, ils s’appliquent sur les éléments contenus. Et non pas sur le conteneur.
La seule exception se trouve avec le layout « absolute » : je le mets en gros et gras, parce que j’ai passé énormément de temps à trouver cette astuce :

Lorsqu’on utilise le layout « absolute », il faut toujours préciser aussi la largeur et la hauteur du conteneur, sinon ce dernier ne sera jamais affiché

Exemple concret :
Voici ce qui ne fonctionnait pas :
MonPanel = function(tab) {
    this.layout = 'absolute';
    this.border = false;
    MonPanel.superclass.constructor.call(this, {
        items: [{
            x: 0,
            y: 5,
            xtype: 'label',
            text: 'To:',
        }]
    });
};

Le panneau n’était pas affiché. Voici ce qui ne fonctionne :
MonPanel = function(tab) {
    this.layout = 'absolute';
    this.border = false;
    this.width = '100%';
    this.height = 150;
    MonPanel.superclass.constructor.call(this, {
        items: [{
            x: 0,
            y: 5,
            xtype: 'label',
            text: 'To:',
        }]
    });
};

Php : T_PAAMAYIM_NEKUDOTAYIM !

Si jamais un jour vous vous trouvez en face de cette erreur surprenante :
Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in {fichier source} on line 35
l’explication (et la solution) sont sûrement ici :

  • il vous manque un point virgule à la ligne concernée ;
  • il y a une variable utilisée qui n’est pas définie ;
  • il y a une erreur incompréhensible, par exemple dans mon cas c’était un define mal écrit :
    if (!defined(SESSION_NAME)) {...}
    alors que le bon code était avec les côtes :
    if (!defined('SESSION_NAME')) {...}

En espérant, comme d’habitude, aider quelqu’un, un jour, quelque part…

Php et Smarty : comment simuler print_r(), var_dump() ou var_export()

Si jamais vous utilisez le moteur de templates Smarty, il pourra vous arriver, à un moment ou à un autre, de vouloir afficher le contenu d’une variable Smarty. Rien de plus simple : prenons un exemple concret :

{foreach name=tab_g key=id_g item=item_g from=$tab_garanties}
{/foreach}

Imaginons que vous vouliez afficher ce qu’il y a dans $tab_garanties. Il suffit de faire :

{$tab_garanties|@print_r}

Et c’est tout !

Si vous avez une autre solution, je suis preneur !

Cette idée vient d’ici, mais, comme souvent, comme c’est en anglais, j’aide un peu par mes traductions, la communauté Française.

Clonage en Php et en Python

Php fournit une super méthode méga géniale qui donne la possibilité de dupliquer des objets : le clonage.
Waaaaaaaaaah \o/

http://www.php.net/manual/en/language.oop5.cloning.php

Bah seulement y’a comme un petit hic : si les propriétés sont elles-même des objets, alors il faut les cloner à la main. Dit autrement, comme la plupart des propriétés sont des objets, autant faire un

X = new Objet();
Y.assignTo(X);

Et voilà on se l’est fait le clonage parce que la méthode assignTo() est aussi longue à écrire que d’écrire la routine « __clone() ». Donc en fait leur méthode de merde elle est comme le H de Hawaï.

Alors que je suis en train de voir… la méthode existe en Python et elle est exactement ce qu’il me faudrait (=deepcopy()) ici http://docs.python.org/library/copy.html .

Je pense que je ne peux pas éviter Php pour tout ce qu’il y a déjà en place dans le monde d’Internet mais ça me fout vraiment, vraiment les bouboules. J’ai vraiment raison quand je dis qu’en Python on développe en gros deux fois plus vite qu’en Php.

>_<