#Dev

Apprendre à utiliser les flexbox CSS (presque) en s’amusant

Un tutorial bien fichu qui fera enfin comprendre comment fonctionne les propriétés CSS de placement flex

Voir le site : Flexbox Froggy

C’est mon prénonyme Thomas Park qui a eu l’idée decet appli web bien sympa, où il faut placer correctement des grenouilles sur des nénuphars en éditant une propriété CSS et on voit en live le résultat. La dernière étape (24 !) est la seule un peu ardue, autant dire que la progression est plutot sympa, et le fait de répéter pas mal de fois les mêmes commandes aident a mémoriser les propriétés.

Have fun !

(English) An alternative of Hungarian notation applied to PHP

On some cases, by example when you works on webservices, data import or an ETL, you can be a little lost between all the variables you use, specifically arrays.

Even if it’s not in the coding standard, I developed a derivative of the Hungarian notation to prefix my variables and find myself there. This notation can be applied in php, but also to any other languages, especially non-typed.

NOTE : I recommend NOT using hungarian notation everytime (for exemple, will be almost useless in a MVC context), but only when it’s really needed.

There is the prefixing I use with PHP variables in that specific cases, depending on their type and semantic meaning :

Scalar types prefix

  • $is, $b : boolean
  • $s : string
  • $i : int (signed)
  • $n : natural (unsigned int)
  • $f : float
  • $fd : float round to 1 decimals
  • $fc : float round to 2 decimals
  • $fm : float round to 3 decimals
  • $m : mixed.
  • $v : void / null.

Non-scalar prefix types

  • $o : object
  • $r :
  • $h : handler (type in PHP : resource).

Arrays, can be, often, by design, a collection of elements, or a single element. For me an “element” is an object-like data, stored as an associative array. While a collection if an array of elements.
So I can distinguish 3 different semantic types for arrays :

  • $c : Collection [auto-incremented keys] : an array with integer keys containing elements (like « list » in Python). The keys are not used neither assigned, and only usefull to know the processing order.
  • $a : Dictionnary [associative keys] : the array keys are important and defined for each index (like in dictionnary Python or hash in Perl).
  • $e : Element [associative keys] ; like $a, but with a semantic information : contains data about one element. Think about an Object converted in Array.
    important.

For Collection and Dictionnary variables, I usually also put the variable in plural (or simply suffix with an s). But for Element, I put the variable name singular

For some array, i can also combine prefixes, like :

  • $co : incremented-collection of objects
  • $ce : incremented-collection, and each index contains an associative array defining an Element
  • $as : a dictionnary of string elements
  • $cbo : increment-collection of boolean OR objects. So we have to test if the entry is an object before processing it.

Other semantic types :

Date :
$ts : timestamp (unsigned int)
$dt : datetime, format ‘Y-m-d H:i:s’ (string)
Others :
$h : string of html code
$j : string of json code
$x : string of XML code
$y : string of YaML code
$u- : unsafe type or value, need to be checked or sanitized for security reason.
$z- : string of encoded something
They can be combined :
$us for unsafe string, with possible code injection.
$zo : string of encoded object
$zj : string of encoded json
$zh : string of encoded html entities, ie: ‘"’

Prefixes for Classes functions :

set : setter, assign the parameter function value to a class member
get : getter, returns something (can be the value of a class member)
is : returns a boolean

I personnally never prefix private members/function with underscores (indicates the visibilty is not public, usually), or with the prefixes I used below for variables.
Because i usually put all members in protected, and almost all function in public : some can be protected, but it can also change with time. So I avoid borgin refactoring when I change the visibilty of something.

Un modèle de fichier .gitignore pour partir sur de bonnes bases sur tes projets PHP

Si tu versionnes tes projets PHP avec Git, voici des modèles de fichier .gitignore (voir documentation officielle) que j’utilise depuis longtemps et qui évite de versionner des fichiers qui n’ont rien à faire sur le dépôt (fichiers temporaires des OS, de l’IDE…).

Ces modèles diffèrent des autres modèles que tu pourra trouver sur des plus plus connus, comme Github ou gitignore.io, dans le sens ou j’utilise des expressions régulières faisant que les règles sont adaptés à la plupart des projets, tout en contenant moins de lignes. Plus d’intelligence, quoi.

Bien sûr ce fichier est un modèle, il faudra quand même sûrement que tu rajoutes des règles spécifiques a ton projet. Certains fichiers peuvent être versionnés ou non suivant ta vision du versioning et la phase de ton projet (dev initial, tma…) : les lignes dans ce cas sont son commentés par défaut (voir lignes commençant par un seul #), a toi de voir si tu les actives ou non.

Comment ajouter facilement ces règles dans mon .gitignore

J’ai créé un projet projet GitHub dédié, contenant également les instructions ci-dessous en anglais).

Deux méthodes de copie sont disponible pour chaque fichier

  • Méthode 1 : avec un terminal positionné sur la racine de votre projet web, contenant déjà ou pas un fichier nommé .gitignore (si un fichier est déja présent, du contenu va être ajouté à la fin) et taper la ligne de commande indiquée. A noter que cette ligne de commande ne fonctionne que sur un poste configuré avec un serveur web actif et php-cli installé., si ce n’est pas le cas utilisez la méthode 2 (plus fastidieuse)
  • Méthode 2 : ouvre le lien avec un navigateur et copier-coller manuellement le contenu à la fin de votre fichier .gitignore

Règles générales pour les projets PHP

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/php.gitignore');">>.gitignore

ou Méthode 2 : voir le fichier

Si ce n’est pas le cas, il te suffit de copier manuellement l’url dans readfile('') dans un navigateur et copier-coller tout le contenu dans votre fichier .gitignore.

Quelques lignes sont présentes mais commentées ; comme expliqué un peu plus haut, il s’agit des fichiers qui peuvent dans certains cas, vouloir être ignoré, donc à toi de les décommenter si c’est le cas.

Attention : git-ignorer le fichier .gitignore peut être déroutant pour tes collègues :-)

gitignore

Extensions spécifiques à quelques frameworks

En addition, tu dois rajouter ce qui est spécifique au framework de ton projet. Généralement, les frameworks te mettent à disposition un .gitignore très basique. En voici des versions plus évolués, tout en supprimant les redondances avec les lignes précédentes. A insérér à la suite :

Projets Symfony 2, 3, Silex, OroPlatform, AkeneoPIM

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/symfony2.gitignore');">>.gitignore

ou Méthode 2 : voir le fichier

<

h3>Projets Laravel / Lumen

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/laravel.gitignore');">>.gitignore

ou Méthode 2 : voir le fichier

Projets Magento 1

Deux configurations possible :

Solution A : Tu veux aussi versionner le noyau du framework dans ton projet :

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/magento1.gitignore');">>.gitignore

ou Méthode 2 : voir le fichier

Solution B : Tu préféres exclure tous les fichiers du noyau et ne versionner que ton propre code :

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/github/gitignore/master/Magento.gitignore');">>.gitignor

ou Méthode 2 : voir le fichier

Projets Magento 2

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/magento2.gitignore');">>.gitignore

ou Méthode 2 : voir le fichier

WordPress 4

Méthode 1 :

php -r "readfile('https://raw.githubusercontent.com/tbondois/gitignore/master/wordpress4.gitignore');">>.gitignore

Méthode 2 : voir le fichier

Tuto : Installer Composer sur un projet web pour gérer facilement les libraires externes (et internes) de ton framework

Installer composer sur ton poste / serveur

Ton poste doit bien sûr avoir un serveur web qui tourne avec PHP.

Site officiel de Composer : getcomposer.org/download/

Si tu es sous Windows, je te recommande de l’installer via leur « Windows Installer », permettant d’éxécuter composer sur n’importe quel dossier de ton poste, juste en tapant « composer », car il aura correctement intialisé le PATH

Sur un autre OS, le plus simple c’est d’ouvrir une console positionnée dans le répertoire de projet et de taper :

curl -sS https://getcomposer.org/installer | php --filename="composer.phar"

Dans ce cas, il faudra taper « php composer.phar » au lieu de simplement « composer » pour le tuto qui va suivre.

Continuer la lecture

Les tests binaires – une fonctionnalité sous-estimée

Imaginons qu’en tant que développeur (dans le cas contraire, passe à un autre article), on doit réaliser plusieurs actions suivant plusieurs cas de figures possibles (disons, une quinzaine), qui peuvent se combiner.
Et suivant certains cas de figures, certains actions à éxécuter se répètent, et peuvent même se combiner suivant certains cas de figure. Pour ne pas dubliquer le code, on identifie donc 5 blocs d’actions différentes. La situation la plus simple serait donc d’utiliser plusieurs variables : (je vais mettre mes exemples en PHP, mais les tests binaires existent dans tous les langages de programmation dignes de ce nom – déjà si ça existe en PHP…)

Continuer la lecture

Symfony versus Symphony, deux frameworks PHP homophones : plagiat ou concours de circonstance ?

Je suis tombé par hasard sur quelque chose plutôt étrange : Symphony, a « XSLT-powered open source content management system ». C’est aussi un framework PHP, qu’on pourrait donc positionner comme un concurrent au projet Symfony CMF.

getsymphony.com

Encore plus troublant, cette annnonce sur la page d’accueil de leur site  :

 Symphony 2.6 is now available  –  11 March 2015

Comme par hasard, le framework homophone suit exactement le même numéro de version que Symfony, à un mois d’intervalle…

Continuer la lecture

Anticiper la migration entre Symfony 2 et 3 en activant la nouvelle structure de répertoires

Symfony, le framework PHP made in France a le vent en poupe et amène dans son sillage le PHP à l’ère industrielle (bon, c’est vrai que Zend l’avait déja aidé à traverser). Sa version 2.6 est sortie depuis quelques semaines mais papa Sensiolabs a semble-t-il déjà bien entamé le travail sur la version 3…

Il y a toutes les chances que les projets v2 soient migrables assez facilement sur v3, mais que la structure des répertoires systèmes changent un peu, car pour l’instant ça reste assez mal structuré : par exemple il y a un peu trop tout et n’importe quoi dans /app/, du cache, des logs, la console, et l’emplacement des fichiers de config globaux ne suit pas la norme des bundles.

Lors d’une release  de Symfony 2.4 ou 2.5, l’assistant vous demandait si vous vouliez utiliser la « nouvelle structure de répertoire v3 » lors de la création d’un nouveau projet. Ça changeait pas mal de choses sur la structure, sans toutefois être documenté ; c’est sûrement pour ne pas embrouiller les esprits que Sensiolabs a vite retiré cette option. C’est dommage, car c’est la structure prévue pour le futur de Symfony.

Mais pourtant tu peux continuer à utiliser cette option en définissant la variable d’environnement SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE=true avant de lancer l’assistant de création de projet.

Continuer la lecture