PhpTal
PhpTal est un langage de templating XML pour Php, qui simplifie énormément la vie des intégrateurs web. Il permet entre autre d’utiliser des macros (héritages de templates), et surtout d’écrire un code 100% xhtml, compatible avec tous les éditeurs html wysiwyg, compréhensibles par tous les intégrateurs sans nécessité de mettre le nez dans le code Php, très facile à lire et à écrire …
Voici un exemple très simple de code php traduit en PhpTal.
Version Php
<?php foreach ($values as $value): ?>
<div class="item">
<div class="title">
<?php if ($value->hasDate()): ?><?=$value->getDate()?><?php endif; ?>
<a href="<?= $value->getUrl() ?>"><?=
htmlentities($value->getTitle())
?></a>
</div>
<div class="content">
<?= htmlentities($value->getContent()) ?>
</div>
</div>
<?php endforeach; ?>
Rien compris ? Pas envie de comprendre ? C’est pareil pour moi.
Voilà la version PhpTal
<div class="item" tal:repeat="value values">
<div class="title">
<span tal:condition="value/hasDate" tal:replace="value/getDate"/>
<a tal:attributes="href value/getUrl" tal:content="value/getTitle"/>
</div>
<div id="content" tal:content="value/getContent"/>
</div>
Je ne suis pas un adepte de Php, bien au contraire, mais principe de réalité oblige, ce langage étant très répandu, un développeur web s’y frotte fatalement de temps à autre.
C’est mon cas aujourd’hui, je suis chargé de faire une css + refactoring du html pour un thème Drupal, ma première réaction a été de dire mais quel est le porc immonde qui a fait ça (version 1 du thème) ? En cherchant mieux j’ai vu que malheureusement, il n’y a pas beaucoup de solution, hormis des bidouilles pas trop standard dans le monde Drupal, pour structurer le html proprement.
Ca saute aux yeux quand on a fait du Zope , du Django ou du Pylons, il manque à Drupal un langage de template correct.
Car par exemple ces “page-toto.tpl.php” qu’on trouve dans les sites développés avec Drupal avec des copier-coller de code partout car on ne peut même pas hériter d’un template, cette syntaxe épouvantable et illisible qui ne permet pas d’indenter le code correctement, ces ‘print’, ces ‘echo’, comment peut-on accepter ça dans un framework soit-disant moderne ? Pour moi c’est un point de blocage qui ne donne pas envie de creuser plus loin ce CMS.
Voir cette petite discussion sur les templates Drupal http://drupal.geek.nz/blog/tplphps-are-not-templates ou même l’auteur de PhpTemplate le dit clairement (dans la première réponse affichée), PhpTal est la solution. Alors qu’est-ce qui freine ? les performances ? Il semble que PhpTal a de bonnes performances sous Php5 ou du moins qu’il n’est pas si gourmand en ressources lorsqu’il est utilisé sans excès. Puisque la seule solution au problème du manque de souplesse de PhpTemplate est l’éducation des développeurs de modules, des intégrateurs et des webmasters (voir la présentation associée à l’article ci-dessus) , incitation à faire du code Php le plus dépouillé possible (mission impossible à mon avis), pourquoi ne pas les éduquer à utiliser correctement PhpTal ? Pourquoi ne pas l’intégrer dans le coeur de Drupal en tant que moteur de template alternatif ?
A côté de ça quel gain de productivité ça apporterait ! On pourrait enfin avoir un minimum de plaisir en écrivant des pages Php, des pages qui seraient alors maintenables, et pas ce code qui ressemble aux bidouillages illisibles qu’on pratiquait il y a plus de dix ans avant l’apparition des CMS (voir les exemples de la présentation tous issus du coeur de Drupal, imaginez ce que ça donne dans la réalité de thèmes ou de modules développés à l’arrache pour des clients pressés !!).
Bien-sûr mon point de vue est aussi partisan, car je fais du Plone depuis plusieurs années. Ce qui m’a vraiment attiré dans Plone fin 2003 c’était Zope et surtout le ZPT, le ZPT qui est à l’origine de PhpTal, sa version Python. Tous les intégrateurs qui ont pratiqué le ZPT vous le diront, facile à apprendre, plaisant à coder, facile à lire, compatible avec des éditeurs html wysiwyg, des avantages énormes, alors les drupalistes qu’attendez-vous ?
Bon c’est pas ça qui va transformer le Php en Python hein ? Mais ça n’est pas mon problème, je ne touche que rarement au coeur du code.
Nucléaire, on arrête et on réfléchit.
Quand on va s’apercevoir dans les mois qui viennent ce qui a été imposé aux travailleurs du nucléaire dans le monde entier et plus encore chez nous en France, on risque de se sentir très mal.
Décontamineurs, jumpers, nettoyeuses, tous confrontés au pire, une vie comparable à celle des mineurs de Germinal. Tout ça enrobé sous une pseudo-technologie de pointe alors qu’une centrale nucléaire n’est que de la tuyauterie autour d’une bombe sale. Ce soir, 25/03/2011 un reportage sur Arte “RAS Nucléaire rien à signaler” tourné en 2008, pour qu’on se réveille tous, car il faut que cet accident au Japon serve à quelque chose.
Alors, évidemment on est admiratif devant le courage des japonais, qui se sacrifient, le mot n’est pas trop fort, pour ne pas éparpiller la radioactivité dans l’atmosphère. Mais on ne peut pas pour autant continuer à fermer les yeux et se taire sous prétexte que c’est indécent. Au minimum un grand débat sera nécessaire pour que tout le monde soit conscient de cette folie.
Personnellement, je suis triste pour le Japon, très triste, et accessoirement très en colère contre moi-même de ne pas avoir compris les risques bien avant cet accident, de ne m’être jamais intéressé au problème, et d’avoir consommé l’électricité d’EDF sans trop compter pendant des années.
Gainsbarre 20 ans – anniversaire
20 ans après sa mort, qu’en reste-til de l’ami Gainsbarre ?
Il y a 20 ans, Gainsbourg ne représentait plus rien pour moi, je parle de l’homme pas de l’oeuvre.
Après la vague punk, neo punk, post-industrielle et pré-zeroneurone, et dans l’état post-végétal où se trouvait mon esprit à l’époque des faits, la mort de Gainsbourg lui a juste fait comprendre qu’une page s’était tournée, c’était déjà pas mal pour cette petite chose ravagée.
Un ami à moi, Mustafa, m’avait offert un fac similé avec photo de l’annonce AFP. Il était très ému. Pas moi.
J’ai toujours été un amateur inébranlable de la musique de Gainsbourg, surtout de “Melody Nelson” son chef d’oeuvre, mais en 91, foutu brouillard, je pensais que Gainsbourg n’avait plus rien à dire, sauf pour ses proches éventuellement, et pour les charognards qui attendaient sa mort, tandis qu’il leur disait merde, MERDE, MEEEERRRRDDDDEEEUUUHHHHH. C’est le seul message qu’il communiquait à l’époque. Aujourd’hui, je m’agenouille, je me prosterne, il avait 20 ans d’avance.
Voilà que je joue au charognard moi aussi, 20 ans après ?
Il serait content et fier l’ami de pouvoir encore goinfrer un ventre de hyène après tout ce temps.
Rassure toi enfoiré, dans 11 jours ceux qui n’ont rien à dire vont évoquer ta mort, les vautours vont se gaver, et tu vas te tordre de rire et de vanité dans l’au-delà, alors je tente un véritable hommage pour toi, sacré Gainsbarre.
T’as bien fait de te tirer rapidement, mais quel bordel complètement nul tu nous a laissé ! Tu n’aurais pas pu arriver vivant en 2011, un officiel quelconque t’aurait forcément abattu d’une balle dans la tête avant ça pour que tu arrêtes de ramener ta face avinée sur les écrans. De toute façon, un esprit normalement imbibé n’aurait pas pu survivre, alors toi mon pote … laisse tomber.
On vit aujourd’hui dans un monde de flics et de têtards, de larves de moustique qui s’effraient au moindre mouvement de vent, imagine un peu mec … Imagine que les maffieux n’ont plus besoin de se battre, ils se baladent en liberté tranquillement et gouvernent ce monde. Imagine que les plus-puritains-des-trous-du-cul sont aux commandes de ce pays, ou du moins ils imaginent l’être, et c’est nous qui les avons porté là, avec l’assentiment des intellectuels “de gauche”. Imagine qu’au 21e siècle des gens croient tellement en Dieu qu’ils n”hésitent pas à se faire exploser dans la foule, tuant au passage des tas d’innocents, et ils pensent qu’ils seront remerciés dans l’au-delà. T’y crois pas n’est-ce pas ? Mais attends, imagine aussi une densité phénoménale d’ultra-religieux, d’ultra-prétentieux et d’ultra-idiots au mètre carré. Imagine la pauvreté de l’esprit, la banalité des idées, la stupidité qui s’insinue partout, qui infeste, qui pollue tout. Imagine la morale Gainsbarre, qui pétrit toutes les “nouvelles” idées. Imagine ces yeux trop fatigués pour pleurer, ces millions de gens toujours affamés, et ces millions d’autres toujours assoiffés … de fric. Imagine que l’argent est la seule valeur, et le cynisme la seule attitude possible. Imagine qu’on se parle essentiellement par écrans interposés, et que jamais, jamais la peur de l’autre n’a été si grande.
20 ans se sont passés, et on a eu beau essayer de voter, sans grande conviction c’est vrai, les méchants ont toujours gagné. Et cette nouvelle réalité vraiment pas faite pour toi s’est installée.
Hmm, toi mon salaud tu t’en foutais à l’époque, et tu t’es même comporté comme la pire des ordures le jour où tu as brûlé ces 500 balles à la face de ceux qui n’avaient rien, ce jour là j’ai souhaité non pas ta mort, mais ta souffrance. Désolé mon pote, je ne le pensais pas vraiment. Mais tu dois t’en vouloir là haut, d’avoir autant bu ce jour là, d’avoir été si con, si prophétique, si exemplaire dans la connerie, permettant aux pires pourritures de revendiquer aujourd’hui une part de ton héritage.
Ah Gainsbarre mon ami, ma charogne puante à l’intérieur, dans 11 jours on fête ton passage au monde des ténèbres, certains fêteront 20 ans de soulagement, et d’autres profitent de la date pour seulement faire la fête, je me range bien sûr avec ces derniers. J’espère que tu es devenu vampire et que tu es toujours là dans l’ombre à guetter une proie innocente pour la ramener à la poésie de la réalité, lui donner le goût de la gitane sans filtre du whisky du sexe et de la révolution.
Mords-les-tous, pour que ce monde change.
Et ceux que tu ne toucheras pas, il va falloir que les vivants s’en occupent, c’est notre job.
Et bien je vais t’étonner et finir par une note positive, ce job on le fait bien. Nous sommes de plus en plus nombreux à vouloir transformer ce monde un endroit vivable, et nous sommes décidés à nous battre. Bien que ne disposant pas d’arme de destruction massive de connards, et que face à nous il y a des tanks, des kalachnikov, des CIA, des KGB, plus puissants que jamais, bien qu’ils nous fliquent, qu’ils nous mettent à poil aux aéroports, nous palpent les glandes et le trou du cul, nous filment dans les rues 24 heures sur 24, ils ne gagneront pas car notre arme secrète est bien plus forte, c’est un mélange non chimique fait d’amour, d’acceptation de l’autre, de poésie, de provocation et d’humour. Notre arme c’est aussi ta musique, et tes textes, et ton attitude face aux cons, ta fierté. Notre arme c’est ton véritable héritage.
Bon je ne suis pas venu te dire que je m’en vais, mais je me barre quand-même. Ciao mon grand.
Santa Montega Blues
Un petit blog sur mon village
Bonne année 2011
Avec un peu de retard je vous souhaite une excellente année 2011, et en profite pour donner de mes nouvelles.
L’année démarre en trombe pour ce qui me concerne, nouveau job, nouveaux projets.
Me voilà surtout embarqué sur un projet d’outil de réseau social pour l’entreprise en Django. Ca s’appelle Twistranet, c’est fort sympathique et bientôt dans vos bacs. Ce projet est entièrement supporté par Numericube, la société dans laquelle j’oeuvre depuis Octobre 2010 et à qui je souhaite évidemment le plus grand succès.
Nouveauté qui marquera sans doute 2011, ça se passe du côté des frameworks web légers en Python : Pyramid est le projet dont tout le monde parle et qui réunit des développeurs venus des mondes Pylons, repoze.bfg (zope donc) et TurboGears. C’est très prometteur, d’ailleurs avec mes amis Gilles et Kamon on a prévu de sprinter sur le sujet avant fin Janvier, si d’autres sont intéressés, qu’ils se fassent connaître rapidement.
Autre nouvelle intéressante, la dernière version de ckeditor (3.5) est sorti en Décembre, toujours très au-dessus de la mêlée des éditeurs Wysiwyg open source. Je suis toujours partant pour améliorer le produit Plone (et ses dépendances), si vous avez un projet en ce sens n’hésitez pas à me contacter.
Pace e salute !
Three Plone addons – part 3 : CKEditor for Plone
Three Plone addons – part 3 : CKEditor for Plone
Why Plone4 is so cool ? because you can create easily new addons in a pure python way, look at this new addon called “CKEditor for Plone”.
A screencast here :
http://www.youtube.com/watch?v=ICuMYWncX8M&feature=channel
More information here :
http://plone.org/products/collective.ckeditor
Some lines of code are used to take original ckeditor svn code and place it in a Zope browser resource (because Zope is really strict about XML/XHTML we must do this little work, i hope i could replace it by a simple svn-externals in future).
Other lines of code are here to call dependencies (collective.plonefinder to search server resources, collective.quickupload for fast upload, see previous posts).
A small javascript “select resources” code is here to communicate with Collective Plone Finder.
The most part of code is CKEditor Plone control panel because it’s important for managers to allow or disallow features, toolbars, or some plugins on their Plone site.
The last part of code is the CKEditor integration in plone wysiwyg templates.
Hmm, that’s all.
Some people ask me, why CKEditor ? Plone4 has Tiny MCE …
Because :
- CKEditor is fast (really fast)
- CKEditor is accessible ( http://www.w3.org/WAI/WCAG1A-Conformance)
- because i’m a FCKeditor’s friend since 10 years, Fred (Frederico Caldeira Knabben) had no chance, his initials offend some English spoken people, now than the software name is more accessible perhaps more people will be interested in its features ?
- Plone needs to be good but it also needs to have reliable addons, and CKEditor cames with a good Plone integration (relax with collective.plonefinder and collective.quickupload)
Three Plone addons – part 2 : Collective Plone Finder
Three Plone addons – part 2 : Collective Plone Finder
Collective Plone Finder is a tool for Plone developpers that can be used to find and select elements in a Plone site. The pypi name is “collective.plonefinder” with one dependency called “collective.quickupload”
It’s a widget’s helper, and you will find in the code a simple form lib widget, it’s an example of how you can use this product. In the README.TXT, you will find a way to use the formlib widget in a Plone portlet.
In this screencast, CPF is used in a portlet named “CG30 Direct Access Portlet” (CG30 is a client) :
http://www.youtube.com/watch?v=X4PENLVJizM&feature=channel
The goal of Collective Plone Finder is not to be used as a standalone product. But, in this second screen cast and for demonstration purpose, we use it in a full browser screen just to show you the different potential uses. Look at the address bar where you can pass some params in querystring.
http://www.youtube.com/watch?v=VZLd97SdKJM&feature=channel
More information about this package can be found here :
http://plone.org/products/collective.plonefinder
This product is not complete (need more documentation, unit tests, some refactorisation, and some ajax popup functions are not finished at this time, 1.0.0), but i released it because it was an important part of my third autumn Plone production “CKEditor for Plone”, see the next post.
I know that many documentation is missing, free time is too short, so if you need to integrate quickly CPF features in your own widget, at this time the better way is to read the code (really easy to understand, it’s Python + Plone, a devel dream). In future i hope many good evolutions will came with Plone4 new energy.
Three Plone addons – part 1 : Plone Quick Upload
Three Plone addons – part 1 : Plone Quick Upload
As good things usually happen in threes, i present you three new Plone addons i released in September 2010, i hope you will find them useful.
The first product is Plone Quick Upload (pypi package name is “collective.quickupload”), a pure javascript multiple upload tool for Plone, look at the first screencast, you could think “oh i know it’s a new Flash Upload tool” and you would be wrong, FlashUpload has no drag and drop
http://www.youtube.com/watch?v=stiSEYqmeiQ&feature=channel
Plone Quick Upload has a control panel with useful options (limit size, limit parallel uploads, direct upload on select, fill titles before upload, …) :
http://www.youtube.com/watch?v=sUf7tGQXiuA&feature=channel
As you can see, Plone Quick Upload manage errors and returns i18n messages when an upload raise an error (file always exist, file is too big, no permission to add content, bad content type, etc …).
For unfortunate MSIE users, the pure javascipt way cannot allow multiple selection and drag and drop, so the upload form has a graceful fallback, look at the next screencast, it’s not so bad.
And you can also choose in Plone Quick Upload control panel, to replace the pure javascript client script by a Flash Upload based script, it’s not recommended and it cannot work behind an HTTP authenticated server, but some people want it :
http://www.youtube.com/watch?v=7hMTVk7C-pw&feature=channel
More information about Plone Quick Upload (installation, use it in your own template, etc …) here :
Resizing and cropping thumbnails with jquery
Resizing and cropping images with jquery
Sometimes, we need images with fixed dimensions (carousels, photo albums …), but all images don’t have the good dimensions or good ratio height /width.
This little jquery script will help you for this usecase.
In this example we will fix the dimension and position of thumbnails placed in blocks using the class “imageContainer”. “imageContainer” have a fixed width and height (in this example 250px/150px). The size of thumbs will be increased or reduced, and the thumb will be moved inside its container to get a centered cropping. Of course images and its containers must have a relative position.
Your html template code looks like :
<a class="imageContainer" href="the_link">
<img src="the_image_src" alt="" width="450" height="300" />
</a>
<a class="imageContainer" href="another_link">
<img src="another_image_src" alt="" width="200" height="100" />
</a>
In your css, you must fix at least :
.imageContainer,
.imageContainer img {
position: relative;
}
.imageContainer {
width: 250px;
height: 150px;
overflow: hidden;
border: 1px solid grey;
}
The javascript code is simple :
var canImproveResolution = false;
thumbResize = function(thumb, min_width, min_height, orientation) {
twidth = jQuery(thumb).width();
theight = jQuery(thumb).height();
new_height = theight;
new_width = twidth;
// strange 1px bug on MSIE
if (jQuery.browser.msie) {
min_width = min_width+1;
min_height = min_height+1;
}
//calculate the good size
if (orientation=='landscape') {
ratio = min_width/min_height;
tratio = twidth/theight;
if (tratio>ratio) {
new_height = min_height;
new_width = parseInt(new_height*tratio);
}
else {
new_width = min_width;
new_height = parseInt(new_width/tratio);
}
}
else {
ratio = min_height/min_width;
tratio = theight/twidth;
if (tratio>ratio) {
new_width = min_width;
new_height = parseInt(new_width*tratio);
}
else {
new_height = min_height;
new_width = parseInt(new_height/tratio);
}
}
// resize thumb
if (theight!=new_height || twidth!=new_width) {
jQuery(thumb).height(new_height);
jQuery(thumb).width(new_width);
}
// adjust position (vertical and horizontal centering for css cropping)
if (new_width > min_width) {
moveleft = parseInt((new_width-min_width)/2);
jQuery(thumb).css('left', '-'+moveleft+'px');
}
if (new_height > min_height) {
movetop = parseInt((new_height-min_height)/2);
jQuery(thumb).css('top', '-'+movetop+'px');
}
// improve resolution
if (canImproveResolution && (new_width > twidth || new_height > theight)) improveResolution(thumb);
}
resizeThumbs = function(thumbs, min_width, min_height) {
orientation = (min_height > min_width) ? 'portrait' : 'landscape';
// hide images before resizing to avoid bad visual effect
thumbs.each( function() {
jQuery(this).css('visibility', 'hidden');
})
// use window.load because on document.ready images are not always loaded
jQuery(window).load(function() {
thumbs.each( function() {
thumbResize(this, min_width, min_height, orientation );
jQuery(this).css('visibility', 'visible');
})
});
}
// change image src for a better resolution
// this is just an example for Plone, adapt it with
// your own sizes rules
improveResolution = function(img) {
img_src = img.src;
img_src = img_src.replace(/\/image_preview/gi, '/image');
img_src = img_src.replace(/\/image_mini/gi, '/image_preview');
img_src = img_src.replace(/\/image_thumb/gi, '/image_mini');
img.src = img_src;
}
For Plone users, there is a small improvement, if you fix the variable :
canImproveResolution = true;
you will get a better resolution when increasing image size (works only with standard plone image thumb sizes …).
At last launch the script for the wanted thumbnails :
jQuery(document).ready(function(){
resizeThumbs(jQuery('.imageContainer img'), 250, 150)});