eZecosystem / Mirror / Planet eZ Publish.fr

Note: This blog has become inactive. New content may not be posted in the future.
Logo Planet eZ Publish.fr

Il y a 6 ans(!) presque jour pour jour, j'avais lancé le Planet eZ Publish.org.fr, ze French corner avec eZ Publish 4.0.1 apparemment ! J'avoue que je ne me souviens plus trop des détails mais je vois en relisant les différents posts que j'ai expérimenté pas mal de trucs avec ce site.

Mais pour être honnête, depuis la migration vers eZ Publish 5.0, le site est en roue libre sans une grande motivation de ma part pour le maintenir et ni le faire vivre. D'ailleurs, il faudrait le renommer Planet eZ Platform maintenant :-) Aussi, une très large partie des sources sont mortes ou les liens pointent dans le vide... Hé Cool URIs don't change ou au moins redirigent vers une ressource correspondante !

Du coup, d'ici quelques jours, je vais arrêter le script de mise à jour et faire un export statique du site pour le garder en ligne en mode zéro maintenance. Si quelqu'un veut reprendre le flambeau, je suis prêt à donner un petit coup de main, mais en attendant clap, rideau !

01/25/2016 04:24 pm   www.planet-ezpublish.fr   Mirror   Link   @2587

eZ Platform Rocket Launch eZ Platform 15.12 est sorti le 15 décembre ! La sortie d'une nouvelle version est toujours au moins un petit évènement mais celle-ci représente un peu plus que ça. En effet, il s'agit de la première version stable d‘eZ Platform, techniquement il s’agit de la 1.0.1, eh oui 1.0.x !

Au dela de ce numéro symbolique, quelque part eZ Publish est en train de tirer sa révérence après un bon paquet d'années de service. Et je dois dire que ce changement signifie quelque chose pour moi, je suis utilisateur d'eZ Publish depuis plus de 10 ans maintenant (!) et ce blog était même à l'origine une expérimentation autour de ce CMS qui s‘appelait alors “eZ publish” :) Bon après, si on gratte un peu, on peut voir qu’eZ Platform dépend notamment d'un (gros) paquet appelé ezpublish-kernel, la bête est encore vivante ;-)

Plus sérieusement, eZ Platform est la réécriture d‘eZ Publish, en gros on a gardé les concepts mais ils sont mis en œuvre avec du code moderne, de bien meilleur qualité, mieux découpé, testé et basé notamment sur l’excellent Symfony.

Une nouvelle version est toujours qu'une étape vers les suivantes. Les Fast-Track Releases vont maintenant se succèder tous les 2 mois. En toute logique la prochaine sera la 16.02 et évidemment on travaille déjà dessus notamment dans le but d‘améliorer l’éditeur de texte riche, de donner accès à la corbeille, de permettre la migration de XmlText vers RichText (de l'ancien Field Type de texte riche vers le nouveau) et de permettre la modification les droits des utilisateurs. Attention : cette liste n‘est ni exhaustive, ni une promesse. Aussi, eZ Platform est un logiciel libre, toutes les contributions (sur ces sujets comme sur d’autres) sont comme toujours les bienvenues que ce soit par un rapport de bug, un bout de code dans une pull request ou simplement du feedback sur la documentation, les rapports de bug existants ou sur Slack par exemple. Alors, à vos claviers.

01/08/2016 03:36 am   www.planet-ezpublish.fr   Mirror   Link   @2572

eZ Sytems est à la recherche d‘un(e) développeur(/se) frontend pour renforcer l’équipe d'ingénierie Lyonnaise et travailler plus spécifiquement sur PlatformUI. Pour rappel, PlatformUI est la nouvelle interface pour eZ Publish eZ Platform sous la forme d'une Single Page Application et eZ Platform est un CMS 100% Open Source basé sur Symfony. Notre code est disponible sur Github, les revues de code sont les bienvenues ;-)

On cherche donc un(e) développeur(/se) frontend expérimenté(e) avec une solide compétence en JavaScript, idéalement très à l‘aise avec CSS et les technologies autour du développement frontend (HTML5, HTTP, REST, …) et attentif à la qualité de son code. Bien sûr, une connaissance de l’univers des CMS ou d‘eZ Publish/eZ Platform est un gros plus. On s’attend aussi à ce que la future recrue apporte toute son expérience et soit force de proposition sur les différents chantiers à venir comme la migration de YUI3 vers un autre framework (à définir) ou d‘autres choix techniques et technologiques. Bref, on veut un peu plus qu’un simple pisseur de code!

Bureau eZ Systems Lyon Bureau eZ Systems Lyon (Décoration et photo par Jen Lowdoor)

On n‘est pas Google, mais notre équipe est cosmopolite (Norvégiens, Polonais, Croate, Américains pour le product management, …) et nos conditions de travail sont plutôt sympas et flexibles. Par exemple, j’écris ce billet depuis mon jardin car le vendredi c‘est télé-travail pour la plupart d’entre nous! Sinon, nos bureaux sont situés à Lyon juste à côté de la gare Perrache donc facilement accessibles en transport en commun.

Alors ? Intéressé(e) ? Envie d'en savoir plus ?

Happy!

C‘est un excellent début. Pour toute question ou pour postuler, n’hésitez pas à m'envoyer un email !

09/04/2015 05:14 am   www.planet-ezpublish.fr   Mirror   Link   @2577

États des lieux de PlatformUI pour eZ Publish Platform

J'ai publié la semaine dernière PlatformUI December 2014 status sur le blog de l‘équipe d’ingéniérie d'eZ Systems. Comme son titre l‘indique, ce billet détaille l’état actuel du PlatformUIBundle ainsi que les plans à plus ou moins court terme concernant le développement de ce bundle qui, je le rappelle, fournira l‘interface éditoriale et d’administration des prochaines versions d‘eZ Publish Platform. À cette occasion, j’ai enregistré un screencast de ce qu'il est possible de faire actuellement :

Meetups autour d'eZ Publish PlatformUI

eZ Publish PlatformUI sera le sujet principal des deux prochains meetups eZ organisés à Lyon et à Paris. Je serai donc présent à Lyon le 15 janvier et également à Paris le 20 janvier pour présenter ce projet et répondre à toutes vos questions. Comme pour le précédent meetup, n‘hésitez pas à vous inscrire, nous serons évidemment ravi de discuter de notre produit autour d’un verre et de répondre à toutes vos questions.

01/12/2015 01:07 am   www.planet-ezpublish.fr   Mirror   Link   @2804

Je viens de publier The future eZ Publish Platform backend UI is “here”! sur le blog de l‘équipe d’ingénierie d'eZ Systems. Ce post annonce l'ouverture (au sens accessible à tous mais le code est aussi sous licence GNU GPL v2) du dépôt Github du bundle PlatformUIBundle. Il fait suite à la présentation que j'avais donnée en compagnie de Roland Benedetti aux eZ Days et à la démo improvisée lors du PHPTour.

J'ai aussi, tant bien que mal, enregistré un screencast (commenté en anglais avec mon French accent) que je vous invite à regarder pour voir ce vers quoi nous tendons et ce qui est effectivement implémenté:

Les plus aventureux peuvent aussi tenter d'installer le bundle même si je reconnais que l'opération est un peu chaotique à l‘heure actuelle; ce n’est pas une Pre-Pre-Pre-Pre-Alpha pour rien :-)

Assez ironiquement, alors que j'écris ces lignes, Github indique que le code disponible dans le dépôt est composé de 87,9% de JavaScript pour seulement 2,3% de PHP. Même si je n'ai pas écrit la totalité du code, cette statistique reflète plutôt bien ce qui m‘a occupé durant l’année passée (voire un peu plus) et compte tenu des fonctionnalités manquantes ce qui va probablement m'occuper dans les mois qui viennent!

Comme d'habitude, les commentaires et retours sont appréciés, tout comme les rapports de bugs et les pull requests pour les plus aventureux ;-)

07/08/2014 12:04 pm   www.planet-ezpublish.fr   Mirror   Link   @2818
$img = eZImageManager::instance();
$img->readINISettings();
$img->convert( $source, $dest, $aliasName );

Permet de générer un alias d’une image sans ezimage. La manière « propre » :

$myObject = eZContentObject::fetch( $objectID );
$dataMap = $myObject->attribute( 'data_map' );
$imageAttribute = $dataMap[ 'image' ];
$imageHandler = new eZImageAliasHandler( $imageAttribute );
$result = $imageHandler->imageAlias( $aliasName );
return $result['full_path'];

Plus de détails sur les liens suivants :

http://www.mugo.ca/Blog/How-to-create-image-aliases-in-eZ-Publish-using-PHP

http://share.ez.no/forums/developer/pregenerate-image-alias-on-object-publishing

03/18/2014 09:56 am   www.planet-ezpublish.fr   Mirror   Link   @2797

Travailler dans le web est parfois ingrat. Ingrat parce que c'est un métier peu connu, et par conséquent rarement apprécié à sa juste valeur.

Quel développeur web n'a jamais entendu des phrases comme «Tu fais des sites ? Alors tu peux venir me réparer mon ordi ?» ou encore «Vous pouvez me faire un youtube pour 400€ ?»

Pourquoi je vous raconte tout ça ? Juste pour servir d'intro à ce truc que j'ai bricolé aujourd'hui, et qui, je le confesse, m'a bien fait marrer (oui, je suis bon public et je rigole de mes propres conneries).

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2855
Knight Horse and Sword

C'est un petit pas pour l'humanité, mais un grand saut pour moi. À partir de décembre, je serai inéluctablement freelance à plein temps.

Fini les embouteillages tous les matins (même si je prends le vélo, ça n'empêche pas l'air de puer le gaz). Envolés, les 2.5 jours de congés par mois. Me voilà pleinement maître de mon destin, et ça fait du bien (Ah ?! On me signale que les freelances n'ont pas la vie rose tous les jours ? Bon, tant pis…)

J'aurais pu me qualifier d'«entrepreneur», de «chef d'entreprise», d'«indépendant», voire d'«indep'», mais j'aime cette image du chevalier, libre comme l'air et cheveux au vent, n'ayant pour biens que sa monture et son épée (une lance, en l'occurence), chevauchant par monts et par vaux en combattant pour ses idéaux, et aussi un peu pour remplir sa gamelle.

Alors voilà, puisque vous me le demandez (sisi, vous me le demandez), j'ai choisi, dans un premier temps, de focaliser mon activité sur les développements web spécifiques, basés sur l'intégration des technologies libres suivantes :

  • Symfony : Le top des frameworks PHP, pour des développements spécifiques fonctionnels et standardisés ;
  • eZ Publish : La Rolls Royce des CMS, pour des sites éditoriaux haut de gamme ;
  • Solr : Le meilleur moteur de recherche libre au monde, pour fournir à vos utilisateurs une expérience de recherche incomparable ;

Et puis, tant qu'à faire, j'entends bien batir des prestations de qualité, en industrialisant mes développements au maximum (TDD, intégration continue, méthodo agile, etc.).

Je serai bien entendu enchanté de répondre à votre coup de fil si vous souhaitez discuter de votre projet. Si vous voulez en savoir plus, vous pouvez consulter ma page professionnelle. Vous y trouverez les informations nécessaires pour me contacter.

Comme je suis d'un naturel optimiste, je suis intimement convaincu que tout ce passera bien et que j'adorerai ma nouvelle vie. Cela dit, un petit commentaire d'encouragement est toujours bon à prendre :)

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2773

Ce que j'aime bien, avec le CMS eZ Publish, c'est son abondante documentation. Quoique parfois, je la trouve un peu lacunaire sur les bords.

Quand par exemple, j'utilise la commande fetch content search, j'aimerais bien avoir un indice sur la signification du paramètre "limitation". La documentation ne m'est pas d'une grande aide dans ce cas :

You'll have to look in the source code of the kernel for details related to the format of this array

Ok, la doc me dit ce que fait le paramètre. Pas comment l'utiliser. Sympa. Étant donné que j'ai passé une demi-journée sur la question, je vais quand même vous en faire profiter.

Le paramètre "limitation" sert donc à définir à la main des limites d'accès, alternativement à celles pré-existantes pour l'utilisateur enregistré. C'est à dire que :

{set search=fetch( content,search
                  hash(text,$search_text,
                      subtree_array,$search_sub_tree,
                      sort_by,array( 'modified',false() ),
                      offset,$offset,
                      limitation, array(),
                      limit,$limit ) ) }

(notez le "array" vide en face de "limitation"), permet d'effectuer une recherche sur l'ensemble du site, indépendamment des droits de l'utilisateur.

Le paramètre "limitation", si j'ai bien compris, sert donc à ajouter des éléments qui sont autorisés pour la recherche. Exemple :

{set search=fetch( content,search
                  hash(text,$search_text,
                      subtree_array,$search_sub_tree,
                      sort_by,array( 'modified',false() ),
                      offset,$offset,
                      limitation, array( hash(
                          Class, array( 65, 66, 67),
                          Section, array( 1, 2, 3 ),
                          Node, array( 25789, 25790, 25791, ... ),
                          Subtree,array( '/1/2/125', '/1/2/151/'),
                          Owner,,
                      ) ),
                      limit,$limit ) ) }

Il est possible de créer toutes les combinaisons possibles de paramètres. Le paramètre "Owner" limite les recherches aux objets possédés par les utilisateurs. Il existe quelques autres paramètres, dont je ne parle pas pour ne pas bien en saisir la portée.

J'espère que ça pourra dépanner. Sur ce, si quelqu'un dispose d'une documentation plus complète et plus officielle, je suis preneur.

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2768

"Vide les caches !", c'est le premier truc qu'on entends ici quand quelque chose ne va pas. L'usage intensif des caches par eZ Publish est bien connu. Mais je viens seulement de réaliser à quel point les caches et le CMS entretiennent une relation fusionnelle.

Je savais qu'eZ Publish utilisait des caches de contenu, de templates et de configuration. Normal. J'ai découvert lundi qu'il (ou elle, d'ailleurs ?) utilisait aussi des caches internes qui n'étaient pas effacés par le processus habituel.

Aujourd'hui, je viens de découvrir qu'eZ Publish utilisait des caches en mémoire vive durant l'exécution d'extensions PHP. Note : pour les gros scripts, penser à régulièrement vider les caches en appelant la fonction eZContentObject::clearCache(), sinon, ça sera un beau heap overflow.

En bonus, une petite fonction que vous pouvez appeler dans une grosse boucle, pour vider les caches à intervalles réguliers :

function clearCache($maxIterations)
{
    static $iteration = 0;

    $iteration++;

    if($iteration >= $maxIterations)
    {
        printf("nettoyage du cache\n");
        eZContentObject::clearCache();
        $iteration = 0;
    }
}

Combien d'autres caches que je n'ai pas encore découvert ?

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2771

Dans mon snippet précédent sur la récupération d'objets de contenu, j'utilise la fonction subTree avec une option AttributeFilter. Savez vous combien de temps j'ai passé à écrire ces 5 lignes ? 4h ! Tout ça à cause d'une stupide erreur de cache.

Pendant 4h, j'ai tout essayé pour faire fonctionner ce code : rien à faire ! Il ne me retournait aucun résultat. J'ai essayé toutes les combinaisons d'attributs possibles et imaginables, rien à faire. Le pire, c'est qu'en utilisant un autre attribut pour le test, tout se passait nickel. Rageant.

En désespoir de cause, j'ai fini par me plonger dans le code source d'eZ Publish, voici ce que j'ai découvert.

La fonction subTree d'eZ Publish fait appel à createAttributeFilterSQLStrings, qui elle même appelle classAttributeIDByIdentifier.

Cette dernière fonction permet de récupérer l'id d'un l'attribut en fonction de son identifiant de la forme 'classe/attribut', notation fort pratique qui évite d'avoir à utiliser directement l'id.

Pour retourner rapidement un résultat, classAttributeIDByIdentifier récupère la liste de tous les attributs existants dans la base de données, et construit un tableau d'index :

...
foreach ( $identifierArray as $identifierRow )
{
    ...
    $combinedIdentifier = $classIdentifier . '/' . $attributeIdentifier;
    $identifierHash[$combinedIdentifier] = (int)$attributeID;
}

On a donc un tableau de la forme

$identifier_hash = array( "folder/name" => 4,
                          "folder/short_description" => 119,
                          "folder/short_name" => 155,
                          "folder/description" => 156,
                          "folder/show_children" => 158,
                          "user_group/name" => 6,
                          ...

Pour renvoyer l'id, le reste est trés simple :

$return = $identifierHash[$identifier];

Rien de bien sorcier, non ? Sauf que ! Le problème, c'est que le tableau d'index est mis en cache, dans le fichier var/plain/cache/classattributeidentifiers_nom_de_la_base.php

Mon problème, c'était que l'attribut que je voulais filtrer n'était pas dans le cache. Après quelques recherches, j'ai compris pourquoi :

ls -l var/plain/cache/classattributeidentifiers_nom_de_la_base.php
-rw-rw-rw-  1 root root 25750 2008-05-26 16:46 var/plain/cache/classattributeidentifiers_nom_de_la_classe.php

Le propriétaire du fichier est root ! Du coup, lorsque j'ai modifié mes classes de contenu dans la backoffice ez Publish, ce cache n'a pas été mis à jour. Comme il s'agit d'un cache interne, il n'a pas non plus été supprimé par la commande

php bin/cache/ezcache.php --clear-all

Résultat : un cache obsolète, une après-midi perdue. Moralité : même quand on supprime les caches, il reste encore des problèmes de cache.

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2760

Mon besoin est simple : je veux récupérer en PHP, avec l'API eZ Publish, toutes les instances d'une certaine classe, en effectuant un filtre sur la valeur d'un attribut (dans mon cas bien précis : c'est une checkbox qui doit être cochée).

Voici le snippet qui permet de faire ça :

$nodes = array();
$nodes =& eZContentObjectTreeNode::subTree( array(
                'IgnoreVisibility' => false,
                // 'Limit' => 10, // Je peux rajouter une limite max
                'ClassFilterType' => 'include',  // Je ne veux que les objets de type classe
                'ClassFilterArray' => array( 'classe' ),
                'AttributeFilter' => array( array( 'classe/attribut', '=', '1' ) ) // Mon attribut est à 1, ma case est cochée
                ), 2);

Plus d'infos sur l'usage de ezContentObjectTreeNode chez Frefred.

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2765

C'est vraiment un truc tout bête à faire, mais j'ai eu du mal à trouver comme exporter des classes de contenu avec le CMS eZ Publish.

Pour ce faire, il faut se rendre dans l'administration, puis paquetages (package en anglais). Sélectionnez Export de classe de contenu (content class export). De là, il vous reste à sélectionner vos classes, et à suivre les instructions. Vous pourrez alors télécharger le fichier correspondant à votre paquetage.

Pour exporter le contenu utilisant ces classes, il faut choisir Export d'objet de contenu à la création du package.

Pour importer le tout dans une autre instance d'eZ Publish, retournez dans administration > package > importer.

02/14/2014 06:13 am   www.planet-ezpublish.fr   Mirror   Link   @2781

Je viens de voir que la vidéo de la conférence eZ Publish, créer un site orienté contenu en 45 minutes que Patrick Allaert et moi-même avons donnée au Forum PHP en novembre est maintenant disponible.

Pour rappel, les slides et le code associé (il y a un tag par étape) sont disponibles en ligne, ce qui facilitera aussi le suivi de la conférence vue la taille réduite des écrans dans cette salle et les quelques problèmes de son avec le micro de Patrick :(

Si vous étiez présent ou même à partir de cette vidéo, il est encore temps de noter et commenter notre présentation sur joind.in.

Les vidéos des autres conférences arrivent progressivement sur le compte Youtube de l'AFUP, je ne peux que vous conseillez de suivre les mises en lignes, certaines méritent vraiment d'être vues.

12/24/2013 07:46 am   www.planet-ezpublish.fr   Mirror   Link   @2826

If you don't want to experience some issue with unexpected puppet version on your nodes, upgraded by error from 2.x series to 3.x series (where incompatibilities can occur). Simply add this to a common used manifest :

file{"/etc/apt/preferences.d/00-puppet.pref":
    ensure => present,
    owner => 'root',
    content => 'Package: puppet puppet-common
    Pin: version 2.7*
    Pin-Priority: 500'
}

This uses the pin feature of apt-get.

If your nodes have already moved to a newer and unexpected version, then you'll have to downgrade them manually with a simple :

$ apt-get installpuppet
12/10/2013 03:30 am   www.planet-ezpublish.fr   Mirror   Link   @2774

An english version of this post is available on share.ez.no

Avec Patrick Allaert, nous avons présenté une conférence intitulée eZ Publish : un CMS pour créer un site orienté contenu en 45 minutes au the Forum PHP 2013 à Paris.

Les slides sont disponibles en ligne avec le code associé, le ForumPhp2013DemoBundle sur Github. L'idée était de présenter quelques uns des principaux concepts du CMS eZ Publish 5 (au passage la version 5.2 est sortie cette semaine):

  • les types de contenu
  • eZ Publish 5 est une application Symfony2
  • la flexibilité du CMS et la manière de construire un vrai site

Dans la partie pratique, nous avons construit le site d'une conférence PHP comme le Forum PHP pour montrer les fonctionnalités suivantes: (les liens pointent vers la diff correspondant sur Github)

  1. Comment écrire une règle d'override pour la vue full pour utilisé un template spécifique
  2. Comment en plus utilisé un controller spécifique pour injecter des données supplémentaires
  3. Comment organiser les templates en utilisant des sub-views
  4. Exemple d'utilisation des sub-views et de controllers spécifiques

Après ces étapes, nous avons aussi modifié un type de contenu pendant la conférence et adapté le template pour prendre en compte le nouvel attribut (Un fichier à télécharger).

Biensûr, ces sujets sont documentés:

Si vous étiez présent, merci de noter et commenter notre présentation sur joind.in et dans le cas contraire, la vidéo devrait bientôt être disponible en ligne.

11/22/2013 05:15 am   www.planet-ezpublish.fr   Mirror   Link   @2805

If you have set git as the storage engine used by etckeeper, then you might want to add a very simple hook to push your configurations to a remote repo.

10/30/2013 12:42 pm   www.planet-ezpublish.fr   Mirror   Link   @3072

Si pour quelconque raison, on ne peut pas supprimer du contenu dans le back-office, on peut le faire directement en base de données, mais c’est à faire avec connaissance.

Requête SQL « simple » pour eZ Publish 4.X, où 307 est l’identifiant de la classe des contenus à supprimer :

DELETE ezco, ezcot, ezcoa, ezcon, ezcov
FROM ezcontentobject ezco, ezcontentobject_tree ezcot, ezcontentobject_attribute ezcoa, ezcontentobject_name ezcon, ezcontentobject_version ezcov
WHERE ezco.contentclass_id = '307' 
AND ezco.id = ezcot.contentobject_id
AND ezco.id = ezcoa.contentobject_id
AND ezco.id = ezcon.contentobject_id
AND ezco.id = ezcov.contentobject_id

Toujours les mêmes précautions à prendre avant : backuper la BDD, et comprendre la requête SQL.

09/12/2013 03:25 am   www.planet-ezpublish.fr   Mirror   Link   @2800

(English version available on share.ez.no)

Comme je l'écrivais dernièrement, j'étais à la eZ Unconference 2013 à proximité de Montpellier. Pendant l'atelier API publique et API REST, j'ai présenté une utilisation concrète l'API REST v2 d'eZ Publish. J'ai choisi de construire une petite application en HTML5/JavaScript statique pour montrer qu'il est possible de faire une application assez amusante avec très peu de lignes de code.

L'application

Le code de cette application est disponible sur Github dans le dépôt eZunConf2013-REST-API-demo et elle est installable sur n'importe quel eZ Publish 5 suffisament récent. Avec un navigateur moderne supportant l'API getUserMedia/Stream, elle permet de prendre une photo avec la webcam de votre ordinateur et de créer un objet Image à partir de celle-ci dans eZ Publish ! Voici un rapide screencast de l'application en action:

Ce genre de fonctionnalité aurait typiquement sa place sur n'importe quel site où les utilisateurs devraient avoir une vraie photo sur leur profil comme un réseau social, un intranet d'entreprise, un site communitaire, ...

Quelques détails techniques

  • Dans le screencast, le navigateur demande à l'utilisateur de s'identifier car l'application utilise l'authentification Basic (la méthode d'authenfication par défault de l'API REST). Avec quelques modifications mineures, l'authenfication par session est aussi utilisable.
  • 6 requêtes HTTP sont nécessaires à la création du contenu et à la récupération de son URI. Ce chiffre relativement important est dû à la division fine des ressources (il s'agit d'une bonne pratique dans le design d'une API REST). Autre point sur les ressources, les URIs ne devraient jamais être construites par le client REST, mais toujours récupérées depuis une réponse précédente. Des API clientes (en PHP et en JavaScript) sont en cours d'écriture et elles devraient permettre de largement simplifier le code en évitant d'avoir à travailler au niveau requêtes HTTP.
  • L'application doit être sur le même domaine qu'eZ Publish. Il s'agit d'une limitation imposée par les navigateurs. Il est possible de contourner ce problème mais je n'ai juste pas eu le temps de me pencher en détail là dessus.

Pour de plus amples détails, je vous laisse examiner le code JavaScript. Merci d'être indulgent sur la qualité du code, cet exemple a vraiment été écrit rapidement et dans le but d'être très simple à comprendre. J'espère avoir le temps d'écrire une version plus propre et plus avancée prochainement.

Ressources au sujet de l'API REST v2 d'eZ Publish

06/13/2013 07:50 am   www.planet-ezpublish.fr   Mirror   Link   @2815

(English version available on share.ez.no)

Je suis en train de mettre à jour le Planète eZ Publish.fr à la dernière version d'eZ Publish 5. J'en profite pour passer en revue les problèmes ou les fonctionnalités manquantes que j'avais recontrés lors de la mise en place de la version avec eZ Publish 5 en décembre dernier. L'un de ces problèmes concernait les différences entre les pages générées par les modules legacy (ezinfo/about, planet/search, ...) et le reste du site. En effet, en 5.0, il n'était pas possible d'utiliser un pagelayout Twig avec un module legacy, et donc le résultat de ces modules étaient toujours injectés dans le bon vieux pagealyout.tpl. À partir des n 2013.4 et 5.1, il est maintenant possible d'utiliser un pagelayout Twig avec les modules legacy. Il s'agit d'une fonctionnalité intéressante dans l'optique d'une mise à jour progressive vers la nouvelle stack, mais certains éléments autour de cette fonctionnalités sont intéressants.

Pour commencer, la version initiale a été ajoutée par Joe Kepley via une pull request. Il mérite un grand bravo pour ça :-)

Ensuite, en travaillant sur une amélioration, j'ai ajouté la possibilité de définir ce pagelayout par siteaccess ou groupe de siteaccess. Il n'y a pas de configuration sémantique, donc pour configurer le pagelayout à utiliser avec les modules legacy, il faut écrire la configuration suivante dans ezpublish.yml :

parameters:
  ezpublish_legacy.planete.module_default_layout: PlanetBundle::pagelayout.html.twig

Dans cet exemple, planete est le nom du siteaccess et la valeur est évidemment le chemin vers le template.

Enfin, avec quelques changements, le même pagelayout peut être utilisé pour les modules legacy comme pour le reste du site. Le principal changement et potentiellement le seul à apporter concerne le block content pour qu'il tienne compte de l'éxécution d'un module legacy. Une simple condition sur la variable module_result permet de détecter le contexte :


<html lang="fr-FR">


<body>
{% block content %}
    {% if module_result %}
        {# we are in a legacy rendered module #}
        {{ module_result.content|raw }}
    {% endif %}
{% endblock %}
body>
html>

Rien de compliqué, non ? Il s'agit là d'un des nombreux ponts entre eZ Publish legacy et la nouvelle stack eZ Publish 5. Vous voulez en apprendre plus ? Si j'étais vous, je m'inscrirais à la prochaine eZ UnConference #2. Sans conteste, le moyen le plus rapide de tout apprendre ou presque sur eZ Publish 5!

05/01/2013 05:59 am   www.planet-ezpublish.fr   Mirror   Link   @2795
eZ Unconference #2 banner

La seconde édition de la eZ UnConference se déroulera les 27, 28 et 29 mai 2013 à proximité de Montpellier (à Palavas pour être exact). La première édition était une vraie réussite, je suis sûr que la seconde sera encore meilleure. Déjà, contrairement à Cologne au mois d'Octobre, le soleil est (presque) garanti ;-) et la plage n'est vraiment, mais alors vraiment pas loin!

Au programme, des ateliers sur eZ Publish 5, Symfony 2, l'API REST, la backward compatibility avec eZ Publish 4 et tout autre sujet que vous apporterez sur la partie unconference!

En plus, en plaçant le logo et un lien vers le site de l'évènement, il est possible d'obtenir une réduction de 20%, ce serait dommage de s'en priver.

Et enfin, un espace expert lounge est prévu où il sera possible pendant toute la durée de la UnConference de poser toute sorte de questions techniques à l'ingéniérie eZ et surtout d'obtenir des réponses (on fera le maximum).

Alors, on se voit là bas ?

04/11/2013 07:29 am   www.planet-ezpublish.fr   Mirror   Link   @2783
Parfois, il est nécessaire d'exporter du contenu d'une instance ezpublish vers une autre pour une fusion de 2 sites et il y a autant de méthodes que de situation.
Nous avons utilisé avec Emmanuel ( https://twitter.com/edelaunay ) une solution avec les packages .
attention cette méthode a des limites que j'exposerai par la suite.

la création du package se fait en trois étapes :

    Creation symbolique du package
    Typage du package
    Creation physique du package d'export
    Import

Étape préalable


Ces trois étapes doivent être précédé d'une étape de préparation des données : dans un package, seul un nœud peut être exporté : il faut donc déplacer tous les contenus a exporter sous un seul nœud

créons pour notre exemple un nœud "export" dans l'arbre de contenu sous la racine. nous déplaçons donc tous les contenus a exporter sous ce nœud.
Export des données

passons a notre première étape : il suffit d’exécuter cette ligne de commande a la racine du site ezpublish

php ezpm.php -sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN create NOMDUPACKAGE "DESCRIPTION DU PACKAGE" 1.0

puis, il faut préciser que le package est un package de contenu :

php ezpm.php –sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN set NOMDUPACKAGE type contentobject

enfin, il suffit de lancer cette commande :

php ezpm.php -sSITEACCESSADMIN –logfiles --login=LOGINADMIN --password=MDPADMIN add NOMDUPACKAGE ezcontentobject --exclude-classes --exclude-templates --current-version "export/*"

des lors, votre package est disponible à cet emplacement : /var/storage/packages/local

Import des données


il vous suffit de déplacer le package précédemment obtenu dans l'arborescence du site cible au même endroit.

ATTENTION : il vous faudra bien vérifier les droits d’accès sur les fichiers : le plus simple est d'appliquer un ( chmod 777 ) afin d’être sur que toutes les données seront mis en place.

Pour réimporter les contenus, il suffit alors d’exécuter la commande suivante dans la racine du site cible :

php ezpm.php -sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN install NOMDUPACKAGE

Limite de l'exercice


cette methode exporte des contenus avec fichiers joints, avec bloc de texte xml ...

MAIS

il ne restaure pas completement les relations d'objets : si l'objet relié a été inclus avant alors la relation est restauré.

il ne restaure pas les images et autres fichiers inclut dans les blocs XML.

il ne restaure pas les sections d'origine.

par contre, il exporte les object_remote_id, il vous sera donc possible de creer un ou plusieurs scripts afin de controuner ces problemes.

par definition, un objet sera importé si la classe de contenu existe avec les memes attributs ( il peut y en avoir en plus)


01/01/2013 10:51 am   www.planet-ezpublish.fr   Mirror   Link   @2785
Parfois, il est nécessaire d'exporter du contenu d'une instance ezpublish vers une autre pour une fusion de 2 sites et il y a autant de méthodes que de situation.
Nous avons utilisé avec Emmanuel ( https://twitter.com/edelaunay ) une solution avec les packages .
attention cette méthode a des limites que j'exposerai par la suite.

la création du package se fait en trois étapes :

    Creation symbolique du package
    Typage du package
    Creation physique du package d'export
    Import

Étape préalable


Ces trois étapes doivent être précédé d'une étape de préparation des données : dans un package, seul un nœud peut être exporté : il faut donc déplacer tous les contenus a exporter sous un seul nœud

créons pour notre exemple un nœud "export" dans l'arbre de contenu sous la racine. nous déplaçons donc tous les contenus a exporter sous ce nœud.
Export des données

passons a notre première étape : il suffit d’exécuter cette ligne de commande a la racine du site ezpublish

php ezpm.php -sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN create NOMDUPACKAGE "DESCRIPTION DU PACKAGE" 1.0

puis, il faut préciser que le package est un package de contenu :

php ezpm.php –sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN set NOMDUPACKAGE type contentobject

enfin, il suffit de lancer cette commande :

php ezpm.php -sSITEACCESSADMIN –logfiles --login=LOGINADMIN --password=MDPADMIN add NOMDUPACKAGE ezcontentobject --exclude-classes --exclude-templates --current-version "export/*"

des lors, votre package est disponible à cet emplacement : /var/storage/packages/local

Import des données


il vous suffit de déplacer le package précédemment obtenu dans l'arborescence du site cible au même endroit.

ATTENTION : il vous faudra bien vérifier les droits d’accès sur les fichiers : le plus simple est d'appliquer un ( chmod 777 ) afin d’être sur que toutes les données seront mis en place.

Pour réimporter les contenus, il suffit alors d’exécuter la commande suivante dans la racine du site cible :

php ezpm.php -sSITEACCESSADMIN --login=LOGINADMIN --password=MDPADMIN install NOMDUPACKAGE

Limite de l'exercice


cette methode exporte des contenus avec fichiers joints, avec bloc de texte xml ...

MAIS

il ne restaure pas completement les relations d'objets : si l'objet relié a été inclus avant alors la relation est restauré.

il ne restaure pas les images et autres fichiers inclut dans les blocs XML.

il ne restaure pas les sections d'origine.

par contre, il exporte les object_remote_id, il vous sera donc possible de creer un ou plusieurs scripts afin de controuner ces problemes.

par definition, un objet sera importé si la classe de contenu existe avec les memes attributs ( il peut y en avoir en plus)


01/01/2013 10:51 am   www.planet-ezpublish.fr   Mirror   Link   @2791

(English version available on share.ez.no)

Comme annoncé via Twitter et Google+ il y a une semaine, le Planet eZ Publish.fr est dorénavant mis sur orbite par eZ Publish 5 (en réalité des clones github du 04/12/2012 soit quelque part entre la version 5.0 et les futures 2012.11/2012.12). Pour autant que je sache, il s'agit du premier site utilisant eZ Publish 5 ou au moins qui ne se contente pas d'utiliser le fallback sur la partie legacy (ie eZ Publish 4.x). En effet, j'ai tenté de ré-implémenter au maximum le site dans la nouvelle pile basée sur Symfony 2. L'ensemble du code source est disponible dans le dépôt git dpobel/planet-ezpublish.fr, pour les curieux les éléments dignes d'intérêt se situent dans le PlanetBundle et dans les fichiers de configuration ezpublish.yml, override.yml et parameters.yml.

Nouvelle stack vs. legacy

Au final, il reste 3 fonctionnalités basées sur la partie legacy :

  • Le formulaire de contact, les attributs collecteur d'information n'étant pas pris en charge pour le moment
  • Le moteur de recherche, là encore l'intégration de Solr est incomplete
  • Un script de nettoyage de la partie planétarium, pour ce dernier point, j'avoue que c'est par pure flemme :-)

À l'inverse, le reste du site n'utilise que les nouvelles API et le moteur de template Twig:

Bugs et difficultés diverses

Sans surprise, il y a quelques bugs dans cette nouvelle version; pour une version majeure en point 0, le contraire aurait été très étonnant, mais il y a aussi des manques plus globaux.

D'une manière générale, l'API publique est très verbeuse. J'ai publié un gist qui compare le code nécessaire pour récupérer une liste de nœuds triée par priorité dans l'ancienne et la nouvelle API. Je crois que le constat est assez clair. Pour éviter de répéter encore et encore, les mêmes bouts de code, j'ai 2 méthodes utilitaires dans une surcharge du Location service. Avec le recul, ce n'est probablement pas la meilleure manière de faire, mais en tout cas, cette petite addition m'évite de me répéter.

Les templates eZ Publish 5 sont radicalement différents des templates eZ Publish 4.x. Et c'est pas uniquement une question de langage. Le point le plus impactant est la disparition de nos bonnes vieilles fonctions fetch. Il s'agit d'une excellente chose en terme d'architecture technique mais en l'état elle complexifie un peu l'écriture de template. Il est en effet assez rare de pouvoir se contenter du contenu et de l'emplacement de ce contenu pour générer la vue d'objet. Dans ce cas, une solution est d'appeler dans une sous requête une action d'un controller custom (voir par exemple la vue full correspondant à la page d'accueil). Une autre solution consiste à utiliser l'évènement ezpublish.pre_content_view mais cet évènement est générique ce qui oblige à détecter d'une manière ou d'une autre dans quel cas l'évènement est lancé ce qui n'est pas forcément évident (voir par exemple PlanetBundle/EventListener/PreContentViewListener.php). Bref, pour moi il manque quelque chose ici qui permette de facilement injecter des paramètres dans les templates de vue.

En tant qu'ancien intégrateur, j'espère qu'on pourra remédier à ces deux points pour rendre le au jour le jour développement un peu plus facile.

Performances

Qu'en est il des performances ? Contrasté est probablement le terme le plus adapté. En effet, sur un site sans identification et peu d'évolution dans le contenu, il est relativement facile de maximiser l'utilisation du cache HTTP et de finalement atteindre les performances du reverse proxy Symfony 2. Dans ce cas eZ Publish 5 est assez nettement supérieur à eZ Publish 4.x qui servirait une page complètement cachée et optimisée (cache-block + viewcache)! Si, le reverse proxy de Symfony se révèle trop lent, il est bien sûr possible de le remplacer par un reverse proxy dédié; dans ce domaine Varnish est un candidat de choix qui apportera de bien meilleures performances encore!

En revanche, lorsque des parties de la page doivent être recalculées, les performances s'effondrent rapidement. Un chantier est en cours pour améliorer les performances des API et cela devrait durer quelques temps.

Conclusion

ÇA FONCTIONNE! À vrai dire plutôt mieux que je ne l'aurai cru il y a quelques mois! Bien sûr il reste bien des bugs à corriger et des choses à améliorer, mais clairement eZ Publish 5 est utilisables dans pas mal de cas et pour tout le reste il y a le legacy fallback :-)

12/13/2012 05:05 am   www.planet-ezpublish.fr   Mirror   Link   @2763

(English version available on share.ez.no)

Comme annoncé via Twitter et Google+ il y a une semaine, le Planet eZ Publish.fr est dorénavant mis sur orbite par eZ Publish 5 (en réalité des clones github du 04/12/2012 soit quelque part entre la version 5.0 et les futures 2012.11/2012.12). Pour autant que je sache, il s'agit du premier site utilisant eZ Publish 5 ou au moins qui ne se contente pas d'utiliser le fallback sur la partie legacy (ie eZ Publish 4.x). En effet, j'ai tenté de ré-implémenter au maximum le site dans la nouvelle pile basée sur Symfony 2. L'ensemble du code source est disponible dans le dépôt git dpobel/planet-ezpublish.fr, pour les curieux les éléments dignes d'intérêt se situent dans le PlanetBundle et dans les fichiers de configuration ezpublish.yml, override.yml et parameters.yml.

Nouvelle stack vs. legacy

Au final, il reste 3 fonctionnalités basées sur la partie legacy :

  • Le formulaire de contact, les attributs collecteur d'information n'étant pas pris en charge pour le moment
  • Le moteur de recherche, là encore l'intégration de Solr est incomplete
  • Un script de nettoyage de la partie planétarium, pour ce dernier point, j'avoue que c'est par pure flemme :-)

À l'inverse, le reste du site n'utilise que les nouvelles API et le moteur de template Twig:

Bugs et difficultés diverses

Sans surprise, il y a quelques bugs dans cette nouvelle version; pour une version majeure en point 0, le contraire aurait été très étonnant, mais il y a aussi des manques plus globaux.

D'une manière générale, l'API publique est très verbeuse. J'ai publié un gist qui compare le code nécessaire pour récupérer une liste de nœuds triée par priorité dans l'ancienne et la nouvelle API. Je crois que le constat est assez clair. Pour éviter de répéter encore et encore, les mêmes bouts de code, j'ai 2 méthodes utilitaires dans une surcharge du Location service. Avec le recul, ce n'est probablement pas la meilleure manière de faire, mais en tout cas, cette petite addition m'évite de me répéter.
 
Les templates eZ Publish 5 sont radicalement différents des templates eZ Publish 4.x. Et c'est pas uniquement une question de langage. Le point le plus impactant est la disparition de nos bonnes vieilles fonctions fetch. Il s'agit d'une excellente chose en terme d'architecture technique mais en l'état elle complexifie un peu l'écriture de template. Il est en effet assez rare de pouvoir se contenter du contenu et de l'emplacement de ce contenu pour générer la vue d'objet. Dans ce cas, une solution est d'appeler dans une sous requête une action d'un controller custom (voir par exemple la vue full correspondant à la page d'accueil). Une autre solution consiste à utiliser l'évènement ezpublish.pre_content_view mais cet évènement est générique ce qui oblige à détecter d'une manière ou d'une autre dans quel cas l'évènement est lancé ce qui n'est pas forcément évident (voir par exemple PlanetBundle/EventListener/PreContentViewListener.php). Bref, pour moi il manque quelque chose ici qui permette de facilement injecter des paramètres dans les templates de vue.

En tant qu'ancien intégrateur, j'espère qu'on pourra remédier à ces deux points pour rendre le au jour le jour développement un peu plus facile.

Performances

Qu'en est il des performances ? Contrasté est probablement le terme le plus adapté. En effet, sur un site sans identification et peu d'évolution dans le contenu, il est relativement facile de maximiser l'utilisation du cache HTTP et de finalement atteindre les performances du reverse proxy Symfony 2. Dans ce cas eZ Publish 5 est assez nettement supérieur à eZ Publish 4.x qui servirait une page complètement cachée et optimisée (cache-block + viewcache)! Si, le reverse proxy de Symfony se révèle trop lent, il est bien sûr possible de le remplacer par un reverse proxy dédié; dans ce domaine Varnish est un candidat de choix qui apportera de bien meilleures performances encore!

En revanche, lorsque des parties de la page doivent être recalculées, les performances s'effondrent rapidement. Un chantier est en cours pour améliorer les performances des API et cela devrait durer quelques temps.

Conclusion

ÇA FONCTIONNE! À vrai dire plutôt mieux que je ne l'aurai cru il y a quelques mois! Bien sûr il reste bien des bugs à corriger et des choses à améliorer, mais clairement eZ Publish 5 est utilisables dans pas mal de cas et pour tout le reste il y a le legacy fallback :-)

12/13/2012 05:05 am   www.planet-ezpublish.fr   Mirror   Link   @2776

Ce soir à 19h, nous présentons eZ Publish (Le CMS en PHP le plus abouti du marché) à l'occasion de la rencontre mensuelle PHP Québec.

Il reste 11 places, et il est encore temps de vous inscrire : http://phpqc-2012-12-eorg.eventbrite.com

A ce soir !

12/06/2012 02:15 pm   www.planet-ezpublish.fr   Mirror   Link   @2787

Ce soir à 19h, nous présentons eZ Publish (Le CMS en PHP le plus abouti du marché) à l'occasion de la rencontre mensuelle PHP Québec.

Il reste 11 places, et il est encore temps de vous inscrire : http://phpqc-2012-12-eorg.eventbrite.com

A ce soir !

12/06/2012 07:48 am   www.planet-ezpublish.fr   Mirror   Link   @2757

Serhey Dolgushev (@L0rdJ) vient de publier une extension très intéressante pour eZ Publish. Vous allez pouvoir utiliser les réseaux sociaux pour s'identifier sur un site eZ Publish. Comment faire avec Twitter ?

10/02/2012 12:32 am   www.planet-ezpublish.fr   Mirror   Link   @2776

Un tutoriel sur l'extension ezgmaplocation : afficher dans eZ Publish une carte Google Maps présentant toutes les images géoréférencées d'un répertoire.

09/10/2012 01:34 am   www.planet-ezpublish.fr   Mirror   Link   @2756