Planète eZ Publish, Ze french corner!

Planète eZ Publish (Page 5)

Damien Pobel : Quelques nouveautés dans le formulaire d'édition de contenu d'eZ Publish

(English version available on share.ez.no)

eZ Publish Community Project 2012.3 est sortie aujourd'hui. L'extension ezautosave est embarquée et activée par défaut, elle ajoute un nouveau widget pour faciliter la prévisualisation de contenu depuis le formulaire d'édition. J'ai ajouté cette fonctionnalité via une pull request faite avec mon chapeau de membre de la communauté; j'en suis plutôt fier ;-)

En plus de cela, plusieurs améliorations du formulaire d'édition dans l'interface d'administration avaient déjà été ajoutées dans les dernières versions:

  • le mode plein écran a été supprimé pour être remplacé par un barre d'outil fixe en haut de l'écran pour avoir à disposition les principaux boutons;
  • le menu de gauche peut être caché, son état est stocké dans une préférence pour le conserver après un rafraîchissement de page;
  • dès que vous scrollez vers le bas, un lien pour retourner en haut du formulaire fait son apparition;
  • l'extension ezautosave fait en sorte de sauvegarder automatiquement le brouillon en cours pendant l'édition;
  • l'extension ajoute aussi le lien de prévisualisation mentionné ci-dessus dans la barre d'outil fixe

Une image vaut mille mots, qu'en est il d'une vidéo ? ;-)

(Visualisation en HD fortement conseillée)

Publié par Damien Pobel le

Sébastien Morel (Plopix) : eZ Publish on Windows server 2008 and Oracle 11g

Hello everybody,

Reading this title is very strange for me ! I never thought of writing an article on eZ Publish, Windows and Oracle !

But, the customer is the king and for several reasons, sometimes, we have to install specials architectures.

First, I must say, that it's not a good advice to install eZ Publish on Windows, my advice is to install it on Linux!
The choice of the database implementation is more complicated, personnaly I like MySQL but Postgres is good too. (Oracle? why not, but if you have reals reasons and money)

End of this introduction, let's you enter into a new world.
I'm not a Windows expert, and this article shows the point of view of a Linux user.

1. Windows and Oracle Installation

Windows OS installation is not very funny, so I will skip this part.
And, happy me, I only had to install eZ Publish over an existing Oracle database 11g.

I think an Oracle installation is a real big work, it can't be resumed simply, so I will skip this too. I only want to explain the eZ Publish installation.

2. PHP and Internet Information Server 7.x

2.1 IIS 7

eZ Publish Community 2012.2 can run on IIS 7 and PHP5 (http://doc.ez.no/eZ-Publish/Technical-manual/4.6/Installation/Requirements-4.6).
As you know, eZ Publish needs somes rewrite rules, so you will have to install the Microsoft URL Rewrite Module 1.1.

2.1.1 Installation

The IIS 7 installation begins with : Control panel > Get programs, and you can add "Internet Information Server".
This step is really simple and quick.

2.1.2 Configuration

When it's finished, configure the default site to set the DocumentRoot of your eZ Publish installation.
Create a new file index.html in you DocumentRoot in order to test your webserver : http://localhost. (localhost, I assume that you are working on the Windows web server)
The next step is the installation of the Microsoft URL Rewrite Module 1.1 : double click and proceed this installation.

Don't be impatient, you will add the RewriteRule for eZ Publish later.

Note: I'm not a expert on Windows, but at this time, I searched where to set the IIS user. I didn't find this information.
I had some rights problems during my entire installation, but I think they are related to the security policies of the company.

IIS 7 Manager

2.2 PHP 5

2.2.1 Installation

When IIS 7 is running, you need to install PHP (5.3.10 for now). Here, you can download the Window Installer (.msi) of the thread safe version.
When you install this msi, choose the IIS Fast CGI mode.

Concerning the extensions, choose as you want.
If, like me, you want to install eZ Publish with Oracle, you have to install oci8 driver but choose the mysqli driver too. (I will explain later why)

2.2.2 Configuration

Now, you can create a index.php with a phpinfo() to see your PHP installation configuration.
At this time, you would change the php.ini parameters for your server, but, it's not so easy !

I don't know why but my changes in the php.ini had no effect. After some research on my best friend Google, I installed a new module on IIS "PHP Manager". It saved my life !
Through this manager, I could change the php.ini configuration correctly.

Note: It's very strange on Windows, the PHP Manager gave me a path for the php.ini (the same path as in the phpinfo()), but when I modified this file manualy, it didn't change anything.
Double check this configuration with a php.exe -i in the command line.

Note: If some things are strange don't hesitate to restart some services like

  • FastCGI settings
  • PHP Manager
  • IIS
  • The OS (if you want to be sure)

Note: I'm sad to say that but we are on Windows...

2.3 PHP - Oracle

2.3.1 Database driver installation

The Oracle database installation was already done. But on the web server, there was neither the oracle client, nor the good library.

As this time, when I launched the php.exe in a command line I had this error : "OCI8.DLL not found". Later on, I found I have the same in the PHP error log.

As described in the eZ Oracle installation documentation, the Oracle Instant Client must be installed on the webserver.

Even if your OS is in 64bit mode, you have to download the Instant Client for Microsoft Windows (32-bit), because PHP for Windows works only in 32bit mode.

Oracle Instant Client

Follow the installation instructions and don't forget to correctly change your PATH variable environment.

PATH Variable

3. eZ Publish with eZ Oracle 2.x

eZ Systems provides an extension eZ Oracle to handle the Oracle database implementation. The documentation is very clean and usefull.

Be careful when you download the package. The documentation shows a link to http://projects.ez.no/ezoracle, but on this project, there is a important note ( at the bottom of the page) to go on Github.

Finally, with eZ Publish Community 2012.2 use eZ Oracle 2.3 and download it directly from Github : https://github.com/ezsystems/ezoracle

3.1 Installation

My mission was to install an new eZ Publish on this architecture.

3.1.1 Fisrt way, but is not the good one for me

The eZ Oracle setup instructions explains how to install the extension, import the eZ schema and the eZ data.

But after that, you have to continue the eZ Publish installation process manually. You can't use the standard installation process using the browser (Mail, Databases, languages, siteaccess settings etc…)
And you have to install the imported packages manually too. (ezwebin, ezflow etc...)
I first tried this method, but I canceled.

Now, I know the second method works perfectly, I advise you to use it.

3.1.2 Second way

It's more easy when you come from Linux to install a new eZ Publish on your Linux. (5-20 minutes max).
So I do a new installation on Linux, Apache, and MySQL on my Debian virtual machine.
At this time, my task wasn't to install an new eZ Publish but to migrate an existing one to Windows and Oracle. So, I just had to :

  • move the eZ Publish files from my Linux installation to the Windows DocumentRoot
  • quick install the eZ Oracle on this eZ Publish
    • unpack in extension directory
    • in override/site.ini.append.php add ActiveExtensions[]=ezoracle in ExtensionSettings section
    • regenerate the autoloads ( php bin/php/ezpgenerateautoloads.php -e)
  • migrate the MySQL database to the Oracle database.

The last step can be complicated ! But no, eZ Oracle include a script to do that perfectly !

Note: Naturally, you can do that without installing MySQL on you Windows Server. The MySQL server on your virtual machine will do the job.

3.2 Migrate from your LAMP installation

3.2.1 Files

You just have to copy all files and be careful about the rights.

3.2.2 Rewrite Rules

It's time to install the Rewrite Rule.

To do that, simply add this file : web.config into the DocumentRoot. Like a .htaccess file, IIS will read it.


 version="1.0" encoding="UTF-8"?>
>
  >
 
    >
      
      >
         value="index.php" />
         value="index.php" />
      >
    >
 
    >
      >
 
         name="Rest API" stopProcessing="true">
           url="^api/" ignoreCase="false" />
           type="Rewrite" url="index_rest.php" />
        >
 
         name="Treemenu" stopProcessing="true">
           url="^([^/]+/)?content/treemenu.*" ignoreCase="false" />
           type="Rewrite" url="index_treemenu.php" />
        >
 
         name="Direct access resources" stopProcessing="true">
           url=".*" ignoreCase="false" />
           logicalGrouping="MatchAny">
             input="{URL}" pattern="var/([^/]+/)?storage/images(-versioned)?/" ignoreCase="false" />
             input="{URL}" pattern="var/([^/]+/)?cache/(texttoimage|public)/" ignoreCase="false" />
             input="{URL}" pattern="design/[^/]+/(stylesheets|images|javascript)/" ignoreCase="false" />
             input="{URL}" pattern="share/icons/" ignoreCase="false" />
             input="{URL}" pattern="extension/[^/]+/design/[^/]+/(stylesheets|flash|images|lib|javascripts?)/" ignoreCase="false" />
             input="{URL}" pattern="packages/styles/.+/(stylesheets|images|javascript)/[^/]+/" ignoreCase="false" />
             input="{URL}" pattern="packages/styles/.+/thumbnail/" ignoreCase="false" />
             input="{URL}" pattern="var/storage/packages/" ignoreCase="false" />
          >
           type="None" />
        >
 
        
         name="Faviconrewrite" stopProcessing="true">
           url="^favicon\.ico$" ignoreCase="false" />
          
          
           type="None" />
        >
         name="Favicon" stopProcessing="true">
           url="^design/standard/images/favicon\.ico$" ignoreCase="false" />
           type="None" />
        >
 
        
         name="Robots" stopProcessing="true">
           url="^robots\.txt$" ignoreCase="false" />
           type="None" />
        >
 
        
        
 
        
         name="P3P" stopProcessing="true">
           url="^w3c/p3p\.xml$" ignoreCase="false" />
           type="None" />
        >
 
         name="Everything else">
           url=".*" ignoreCase="false" />
           type="Rewrite" url="index.php" />
        >
      >
    >
 
  >
>
3.2.3 Database

I assume you have already an Oracle database with the good eZ Oracle requirements.

The eZ Oracle documentation explains how to migrate from MySQL, I will only explain these commands :

Note: Unusually on eZ Publish, you have to run this command in the extension/ezoracle/bin/php directory.

php mysql2oracle-schema.php YOURMYSQLDB:mysqluser/mysqlpassword@YOURLAMPMySQLSERVER --drop > mydump.sql 

This command dumps your MySQL schema from your MySQL server (in my case my virtual machine).
You can now understand why we needed to install the mysqli driver at the php installation step. (Your Windows server has to connect to a MySQL server)

You have to load this file into the Oracle database. You can do that using SQLPlus or the client of your choice (like TOAD, or Navicat)

Using SQLPlus :

sqlplus oracleuser/oraclepassword@ORCL <</span> mydump.sql 

Note: In my case ORCL was ORACLESERVER_HOST/ORACLEDATABASE_NAME

When the dump is imported into your Oracle database, the last steps are very simple.

Migrate the data :

php mysql2oracle-data.php YOURMYSQLDB:mysqluser/mysqlpassword@YOURLAMPMySQLSERVER oracleuser/oraclepassword@ORACLESERVER_HOST/ORACLEDATABASE_NAME

Update the sequences :

php ora-update-seqs.php oracleuser/oraclepassword@ORACLESERVER_HOST/ORACLEDATABASE_NAME

Final steps :

  • Configure the override/settings/site.ini.append.php's DatabaseSettings section
    [DatabaseSettings]
    DatabaseImplementation=ezoracle
    User=oracleuser
    Password=oraclepassword
    Database=ORACLESERVER_HOST/ORACLEDATABASE_NAME 
    
  • Clear the cache
    php bin/php/ezcache.php --clear-all
    

Enjoy your eZ Publish !

Conclusion

This tutorial comes from my notes and I think I didn't forget anything.

Even if this installation works, my advice will always be to install eZ Publish on Linux.
I didn't make any benchmark, but I think the performances will always be better on Linux.

But, If one day you have to do this installation I hope this article will help you ;-)

Plop+

Publié par Sébastien Morel (Plopix) le

Agence Yuzu : Créer un espace privé sur eZ Publish

Parfois, il peut être utile de mettre en place un espace privatif sur son site web. Cela peut être par exemple une zone du site réservée aux membres. eZ Publish dispose d'une solution native pour mettre tout cela en oeuvre.

Publié par Agence Yuzu le

Gilles Guirand : Comprendre le fonctionnement bas-niveau du cache eZ Publish : La compilation des templates (Article 2)

Afin de comprendre le rôle du « cache de vue » ou des « cache blocks » (détaillé dans les prochains chapitres), il est important au préalable de bien différencier deux concepts qui sont souvent confondus :

  • La compilation des templates, qui est abordé dans ce chapitre
  • Le cache de template, qui désigne en fait la mise en cache des contenus des cache-block. Le mécanisme de cache-block sera détaillé dans un prochaine chapitre

La confusion entre ces 2 systèmes de caches provient des différentes interfaces et documentation, qui exploite l'expression "cache de template", sans préciser s'il s'agit de la compilation ou des fichiers de cache de template-block liés au cache-block

A quoi sert la compilation des template ?

Lorsque la directive de compilation des templates est activée, tous vos fichiers de templates péniblement rédigés (*.tpl) sont transformés ou plutôt « compilés » (désolé pour les puristes) en PHP. Ainsi lorsqu'un internaute demande l'affichage d'une page, cette page nécessite forcement l'exécution d'un certain nombre de templates (quelques dizaine la plupart du temps)

  • Situation 1 : Ces templates n'existent pas dans leur version « compilée » : eZ Publish va d'abord compiler les templates impliqués (transformer la syntaxe eZTemplate des fichiers .tpl en syntaxe PHP), puis rendre disponible la version compilée (donc en PHP) pour la future construction du cache de vue ou des « cache blocks ». On pourrait résumer cette séquence en « TPL > PHP > xHTML (ou autre) »
  • Situation 2 : Ces templates existent dans leur version « compilés » : lors de la construction du cache de vue, eZ Publish exécute directement le code PHP sans interpréter à nouveau les fichiers de template en syntaxe eZTemplate des fichiers .tpl. On pourrait résumer cette séquence en « PHP > xHTML (ou autre) »

Cette « situation 1 » (templates compilés à la volée) peut s'avérer dramatique sur un site à fort trafic et ne devrait jamais se produire en production. En effet, la compilation des templates nécessite une énorme consommation de ressource (RAM/CPU seulement, pas SQL) susceptible de générer toute sorte d'erreurs si le trafic concurrent est important, et si le "stalecache" n'est pas activé (concept détaillé plus loin).

Dans tous les cas de figure il est impératif :

  • D'activer la compilation des templates sur un site en production
  • De ne jamais supprimer massivement le cache de template
    • pas de « php bin/php/ezcache.php --clear-all –purge »
    • pas de « php bin/php/ezcache.php –clear-id=template », qui ne supprime pas le cache de template block, mais l’ensemble des versions compilés des templates
    • pas de « php bin/php/ezcache.php –clear-tag=template », qui supprime à la fois les caches compilés et les le cache de template block
  • Lors d'une mise à jour, de forcer la recompilation ciblée des templates ayant été modifiés, et uniquement ceux ayant été modifié (voir plus loin comment procéder)

Note : La compilation est activée par défaut (site.ini), mais souvent désactivés lors des phases de développement, tests ou autre. Il est donc important de vérifier qu'ils sont bien activés avec une mise en production du site.

settings/override/site.ini.append.php / [templatesettings]

TemplateCompile=enabled # compile les templates dans /template/compiled/
NodeTreeCaching=enabled # pré compile les templates dans /template/tree/, par défaut si TemplateCompile est enabled

Il ne faut pas confondre ces 2 paramètres avec celui d'activation du cache de template :

TemplateCache=enabled # met en cache les contenus des cache-block /template-block/

Comment sont stockés les templates compilés ?

Pour les courageux qui sont encore attentifs et qui souhaitent en savoir plus, eZ Publish stocke les versions compilées des templates dans le répertoire :

{VarDir}/cache/template/compiled/
{VarDir} = valeur du paramètre VarDir dans le site.ini (ou votre surchage spécifique), généralement "var/monsite/"

Les noms des fichiers sont relativement explicites :
{nomdutemplate}-{hash}php
par exemple : pagelayout-49f4458d0b68aec3cf2de63a6918fd61.php

Le hash est calculé selon 2 méthodes différentes, en fonction du paramètreShareCompiledTemplates (section [TemplateSettings] du site.ini)

Extrait de lib/eztemplate/classes/eztemplatecompiler.php

if ( $shareTemplates )
 $cacheFileKey = $key . '-' . $language;
else
 $cacheFileKey = $key . '-' . $internalCharset . '-' . $language . '-' . $useFullUrlText . $accessText . "-" . $pageLayoutVariable . '-' . eZSys::indexFile();
 
$cacheFileName = $extraName . md5( $cacheFileKey ) . '.php';
 
return $cacheFileName;

Tableau des éléments de la clé de hash, en mode ShareCompiledTemplates=disabled

Elément de la clé de hash

Signification

Exemple de valeur

key

MD5 du chemin complet du template

md5(‘extension/ezwebin/design/ezwebin/templates/pagelayout.tpl’)

internalCharset

Le charset interne

utf-8

language

La langue définie pour le siteaccess utilisée lors de la compilation

fre-FR

useFullUrlText

En fonction de la directive UseFullUrl (layout.ini) si le template est compilé lors de l'appel d'un URL de type « layout/set/... » (module layout)

full | relative

accessText

Nom du site siteaccess utilisée lors de la compilation, avec un « - » devant

-site_admin

pageLayoutVariable

Nom du pagelayout personnalisé, si le template est compilé lors de l'appel d'un URL de type « layout/set/print » par exemple (module layout)

print_pagelayout.tpl

indexFile

La racine de l'index du site, qui peut varié selon divers paramètres, comme par exemple : le nom du siteaccess en mode « URI », ou encore la racine « layout/set/... »

site_admin | layout/set/print

extraName

Le nom du template, sans le « .tpl », avec un « - » à la fin

pagelayout-

La clé de hash est donc constituée de plusieurs paramètres combinables, qu’il faut impérativement connaitre afin de bien comprendre et maîtriser l'impact d'une suppression complète des templates compilés. En effet, un site multi-langues, avec de nombreux siteaccess, et une utilisation massive du module 'layout' (layout/set/... ce qui est tout à fait déconseillé par ailleurs, mais c'est un autre sujet) peut générer un grand nombre de combinaisons possibles de caches compilés, autant de cache à reconstruire lors d'une expiration massive.

Note : Les plus attentifs auront remarqués la présence du répertoire « {VarDir}/cache/template/tree/ ». Ce répertoire contient une sorte de pré-cache ou « arbre de compilation », qui n’est présent que lorsque le setting NodeTreeCaching est activé, et qui accélère la compilation des différentes variantes d'un même template (par exploitation de l'arbre PHP de compilation plutôt que le .tpl d'origine). Lors de suppression manuelles et ciblées des caches (rm), il peut être nécessaire de supprimer également le fichier correspondant dans le répertoire en question, sous le nom de [hash]-[nomdutemplate].php

NodeTreeCaching

Travailler en mode ShareCompiledTemplates

Lorsque l’on active le paramètre ShareCompiledTemplates=enabled (section [TemplateSettings] dusite.ini), la clé de hash du stockage des templates compilés est alors beaucoup plus triviale, à savoir le chemin du template et la langue du siteaccess courant :

Tableau des éléments de la clé de hash, en mode ShareCompiledTemplates=enabled

Elément de la clé de hash

Signification

Exemple de valeur

key

MD5 du chemin complet du template

md5(‘extension/ezwebin/design/ezwebin/templates/pagelayout.tpl’)

language

La langue définie pour le siteaccess utilisée lors de la compilation

fre-FR

Cette configuration est tout à fait adaptée à des instances eZ Publish propulsant de nombreux siteaccess, comme par exemple des usines à site, dont on ne maîtrise pas le nombre de siteaccess dans le temps

Cependant, il faut être attentif aux valeurs des settings (fichiers INI) spécifiques à chaque siteaccess, dont les valeurs sont par défaut compilés dans les templates. Il est donc nécessaire de charger dynamiquement ces valeurs de settings à chaque exécution des templates, en utilisant :

  • Soit la directive globale DynamicTemplateMode=enabled (site.ini [eZINISettings])
  • Soit au cas par cas dans l’utilisant de l’opérateur de template eZINI ( paramètre ‘dynamic’ )

Comment forcer la recompilation d'un lot de templates spécifiques ?

Pour forcer la recompilation d'un ou plusieurs templates en particulier (2 templates d'ezwebin dans cet exemple) :

php bin/php/eztc.php -s monsiteaccess --force extension/ezwebin/design/ezwebin/templates/pagelayout.tpl extension/ezwebin/design/ezwebin/templates/page_leftmenu.tpl

Résultat :
Compiled template file: extension/ezwebin/design/ezwebin/templates/pagelayout.tpl
Compiled template file: extension/ezwebin/design/ezwebin/templates/page_leftmenu.tpl

Lorsque la liste des templates est un peu longue, on peut se simplifier la tâche en utilisant une liste stockée dans un fichier TXT ou encore en résultat d’une commande ls / find ou autre...

Compile tous les templates d’ezwebin qui commencent par “page_header_” :

find extension/ezwebin/ -name "page_header_*.tpl"| xargs php bin/php/eztc.php --force

Compile tous les templates contenu dans le fichier template_list.txt :

cat template_list.txt | xargs php bin/php/eztc.php --force

Documentation officielle :
https://auth.ez.no/ezpublish/documentation/development/scripting/supplied_scripts/template_compiler

Attention : Le chapitre précédent nous apprend que la clé de hash d'un template compilé exploite le paramètre $pageLayoutVariable. eZ Publish ne déduit cette valeur que lorsqu'elle est appelé dans une URL de type « layout/set/... », à la volée dans le index.php. Le script eztc.php ne peut donc pas connaître et prévoir à l'avance les diverses combinaisons possible.

Pour le dire autrement, lorsqu'on utilise le module layout :

  • eZ Publish compile autant de version des templates que de layout différents exploités, par exemple un template « page_head.tpl » existera en 4 versions si 3 layouts supplémentaire sont exploités (version par défaut, 3 version spécifiques)
  • Le script eztc.php ne recompile que le layout par défaut, les 3 autres compilations seront effectuées par appel frontal des URL concernées. Pour mettre à jour ces templates spécifiques sans purger l'ensemble du cache, il faudra donc supprimer individuellement les versions compilés de ces templates dans le répertoire {VarDir}/cache/template/compiled/, puis attendre leur appels par des internautes (impact généralement négligeable en performance lorsque l'opération est ciblée sur un seul lot de templates)

Pour supprimer manuellement les différentes variantes d’un template compilé afin de forcer la recompilation à la volée (par exemple pour le page_head.tpl) :

find var/ezflow_site/cache/template -name "page_head-*"| xargs rm

Comment faire expirer le cache des overrides de templates ?

Lorsque vous ajoutez des templates dans votre extension spécifique, et que vous définissez de overrides sur ces templates, 2 caches sont impliqués dans cette opération :

  • Le cache de la liste des répertoires de designs par site_access invoqués progressivement, stocké dans {VarDir}/cache/designbase_{hash}.php. Le {hash} est constitué d’un md5 du site_access invoqué

Il est possible de faire expirer ce cache par la commande :

php bin/php/ezcache.php -s monsiteaccess --clear-id=design_base

Le cache de la liste des overrides de templates par site_access invoqués progressivement, stocké dans {VarDir}/cache/override/override_{hash}.php. Le {hash} est constitué d’un md5 :

  • du tableau des répertoires /design (design.ini [ExtensionSettings] DesignExtensions[])
  • du SiteDesign “standard”
  • du SiteDesign déclaré dans site.ini [DesignSettings] SiteDesign

Il est possible de faire expirer ce cache par la commande :

php bin/php/ezcache.php -s monsiteaccess --clear-id=template-override
Publié par Gilles Guirand le

Sébastien Morel (Plopix) : Plopix Blog, the Plopix strikes back !

Salut à tous,

C'est fait ! Voici mon nouveau blog fraîchement sorti après deux semaines de vacances en Guadeloupe. On peut dire qu'il a été créé dans le Cloud (en avion ou en plein Jet Lag ;))

Alors, évidemment, vous voyez bien que le désign ressemble à un réseau social assez connu ! Mais je me suis dit que copier sur quelque chose qu'on apprécie et toujours un bel hommage. D'autant, que ce n'est pas une copie mais une reproduction ! J'ai découvert de nouvelles techniques Gimp en voulant faire le logo, j'ai un peu joué aussi avec les media queries et le HTML5 mais c'est pas trop mon fort etc..

Du coté serveur on retrouve mon CMS préféré eZ Publish dans sa dernière version communautaire avec un Varnish 3 tout vide pour le moment.

Pour refaire ce blog, j'ai fait un mix up de plein de blogs que j'apprécie que vous retrouverez sur la droite dans la rubrique "My Community". (Merci à vous)
J'avoue que je n'ai quand même pas trop d'idée sur le contenu de la home page du site (pas du blog), aujourd'hui j'ai mis une remontée de flux Twitter cela changera peut être !
Par contre j'apprécie bien ma page d'erreur.

J'ai essayé d'être social aussi, Facebook, Twitter, Google Plus, Foursquare, et Gmaps.

Concernant la langue, je vais essayer d'être international ! Alors il y aura sûrement plein de billets en anglais, soyez indulgent ;-) (il faut que progresse de toute façon, les critiques seront aussi les bienvenues)

Au niveau du contenu, je vais essayer d'être plus régulier, voire utiliser un peu le blog comme pense-bête de choses simples mais importantes.

Donc sur ces belles paroles : See you soon !

Publié par Sébastien Morel (Plopix) le

Arnaud Lafon : Homebrew repository dedicated to PHP and PHP 5.3.10 installation

Today I started to dig into the tons of unread mails I received this month. My first priority was to fix 2 formulas I've submitted to the homebrew project (one is for the eZ Components, the other one to be able to install php-intl which is a requirement for Symfony2 developments).

But, I discovered that homebrew people decided to stop maintaining PHP formulas in the main repository. They are not PHP developers and can't have a good sight on what they review and pull. Well, homebrew-php is the new repository to PHP-related formulas and adamv told me that multi-repositories management will be handled in a short term. So that's quite a good news !

Before doing anything regarding the formulas I've submitted, I was curious to install PHP 5.3.10 using homebrew and see how it works. This blog post is about that.

Publié par Arnaud Lafon le

Gilles Guirand : Comprendre le fonctionnement bas-niveau du cache eZ Publish : Le cache de INI (Article 1)

eZ Publish est un CMS infiniment flexible et puissant, qui propulse actuelle une grande variété de sites à faible ou à fort trafic. Cette puissance a un prix : la consommation de ressource en général, et la consommation de ressource SQL en particulier, ainsi que les I/O disque !

Autant de mécanismes à maîtriser pour dimensionner son architecture, ou comprendre l'impact d'un paramètre, d'une directive de cache-block ou encore d'une suppression massive de cache (template, cache-block ou cache de vue).

La lecture de ce tutoriel est particulièrement pénible et requiert une concentration & une patience à toute épreuve. Il est conseillé de le parcourir en plusieurs fois, équipé d'une bière ou d'une bonne bouteille de vin pour les plus aisés d'entre nous.

Introduction

Cette série d'articles donne un éclairage assez avancé sur le fonctionnement du cache eZ Publish, avec un focus particulier sur :

  • le « cache des INI » : la mise en cache PHP des settings
  • le « cache de template » : la compilation des fichiers *.tpl en *.php
  • le « cache de vue » : la mise en cache des contenus stockés dans eZ Publish vers une sortie statique xHTML (ou autre)
  • les « cache-block », la mise en cache des « template-block », portions xHTML (ou autre) contenus dans les templates, et hors de portée du cache de vue (pagelayout.tpl, templates des modules personnalisés, etc.)
  • le rôle du fichier expiry.php
  • le fonctionnement détaillé du script ezcache.php
  • une simulation de performance sur les combinaisons d’indisponibilités des différents systèmes de cache
  • et autres chapitres susceptible d'être ajoutés lors de la rédaction continu de cet ouvrage

Cette série d'article s'efforce de ne pas expliquer à nouveau ce qui est déjà décrit et compréhensible dans d'autres didacticiels ou documentations officielle, elle a pour vocation :

  • D'expliquer comment eZ Publish gère « bas niveau » les fonctionnalités de cache qu'il propose : il s’agit de l’aspect « documentation » des articles
  • D'en déduire un possible impact, une possible bonne ou mauvaise pratique dans l'utilisation et la combinaison des paramètres proposés. Il s’agit de l’aspect « tutoriel » des articles

A tous ceux qui considèrent que la gestion du cache eZ Publish est complexe et/ou problématique, il est également nécessaire de considérer les points suivants :

  • Ce didacticiel existe (ce qui change tout), merci de le lire, de le critiquer, de le compléter, et de remonter toutes les questions ou erreurs détectées
  • eZ Publish est gourmand en ressource (notamment SQL) de part son mode de stockage de données : le concept de classe & le concept d'EAV (entity / attribute / value), c'est le prix à payer pour profiter du concept magique de « classes de contenus », d'une stabilité fonctionnelle ou encore des possibles montées de versions depuis l'origine du CMS (modèle de données stable & universel)
  • Les autres CMS « concurrents » ont la réputation de proposer une gestion de cache plus simple à manipuler, tout simplement par l'absence de gestion réelle de cache (généralement un simple TTL, une délégation à Varnish, une absence de cache en mode authentifié...)

Note : Les exemples et mécanismes décrits s'appuient sur la version eZ Publish 4.5+ Enterprise ou eZ Publish 2011.x communautaire

Un tutoriel / documentation pour qui ?

Cette série d'article s'adresse essentiellement :

  • aux développeurs / administrateurs ayant une connaissance avancée d'eZ Publish
  • aux développeurs de sites à fort trafic ou en recherche de gain de performance
  • aux développeurs souhaitant se réconcilier avec leur hébergeur / administrateur de serveurs
  • aux éco-citoyens soucieux du nombre d'ampoules grillées (ou de Panda assassinées) lors de la reconstruction des caches de vue ou des caches de template-block

Le cache de INI

Le cache des fichiers INI n’a pas de gros impact sur charge serveur, puisqu’il ne consomme pas de SQL, et assez peu de RAM / CPU. Comme nous le verrons dans ce chapitre, le cache de INI limite essentiellement le volume des I/O, et accélère de façon homogène le temps de construction des pages.

A quoi sert le cache de INI

eZ Publish accepte plusieurs conventions dans le nommage d’un fichier de configuration INI :

  • mysetting.ini
    • à la racine de : settings
    • à la racine des extensions : extension/myextension/settings/mysetting.ini
    • à la racine de share/locale
  • mysetting.ini.append (progressivement déprécié, à éviter)
  • mysetting.ini.append.php pour surcharger un fichier INI dans les différents emplacement dédié :
    • settings/siteaccess/
    • settings/override/
    • extension/myextension/settings/
    • extension/myextension/settings/siteaccess/

La syntaxe exploitée dans les fichiers INI est de la forme :

<?php /*
 
[section]
setting1=value1
array_setting[]=value2
array_setting[]=value3
# ...
*/ ?>

La mise en cache permet de transformer cette syntaxe familière en tableau clé PHP hiérarchique, ne nécessitant pas un parsing systématique des fichiers INI

Comment sont générés les caches de INIeZ Publish génère les caches de INI « à la volée » de la façon suivante :

  • Le chargement d’un fichier INI est invoqué par un template (ezini), ou l’API PHP (classe statique eZINI)
  • Le hash et le chemin du fichier de cache concerné est calculé en amont
  • Si le fichier existe en cache, on charge les données :
    • Si EZP_INI_FILEMTIME_CHECK est commenté (par défaut) dans config.php, alors vérification récursive dans toutes les surcharges concernés que les données n’ont pas changées, et sauvegarde d’un nouveau cache le cas échéant
    • Si EZP_INI_FILEMTIME_CHECK est décommenté (et reste à FALSE) dans config.php, utilisation directe des données du fichier de cache, sans vérification automatique de possibles mises à jour
define( 'EZP_INI_FILEMTIME_CHECK', false );

Comme le précise la documentaton dans le config.php, décommenté la ligne EZP_INI_FILEMTIME_CHECK améliore les performances puisqu’elle permet à eZ Publish de ne pas vérifier systématiquement la présence de possibles mise à jour dans l’arbre de surcharge des INI (gain en I/O, et gain constaté de 10% à 15% sur le chargement des pages eZ Publish, en fonction des performances I/O du système de stockage) :

eZ Publish stocke le cache des INI (ou plutôt les INI compilés en tableaux PHP) dans le répertoire non modifiablevar/cahe/ini/, de la façon suivante :
{nomdufichierini}-{hash}.php

Par exemple pour les différentes versions de design.ini :

  • design-677247a49e428aa0837411b52777b920.php
  • design-704216b4d0e3ea68c09742504bb366c8.php
  • design-7333039e7e19aa411f8dd01836555861.php

Le hash est calculé à partir des clés suivantes :

Elément de la clé de hash

Signification

Exemple de valeur

FileName

Le nom du fichier .ini

site.ini
module.ini
...
le append, append.php est ajouté automatiquement

RootDir

La racine du chemin du INI

settings
settings/siteaccess/fre
settings/override
share/locale

DirectAccess

Est ce qu'une demande d’accès direct à un fichier, sans empilement de surcharges ?

1
NULL
(Vrai / Faux)

overrideDirs

Tableau sérialisé des surcharges du INI concerné dans les différentes extensions, siteaccess

a:34:{s:26:"ext-siteaccess:myextension";a:2:{i:0;s:45:"extension/myextension/settings/siteaccess/fre";i:1;b:1;}...

internalCharset

Le charset interne

utf-8

Comment faire expirer l'ensemble du cache de INI

L’expiration complète du cache de INI s’effectue de la façon suivante :

php bin/php/ezcache.php --clear-id=global_ini

Supprime le répertoire var/cache/ini

php bin/php/ezcache.php --clear-tag=ini

Supprime le répertoire var/cache/ini, ainsi que le cache des extensions actives dans /var/cache/active_extensions_{hash}.php

php bin/php/ezcache.php --clear-id=ini

Ne fait rien, ou du moins tente de supprimer récursivement un répertoire qui n’existe pas, à savoir {varDir}/ini. Le répertoire ‘var/cache/ini/’ est fixé en dur dans lib/ezutils/classes/ezini.php...

Comment faire expirer un lot de cache de INI

Il n’est techniquement pas possible d’expirer un lot de cache de INI avec les commandes de base d’eZ Publish. Cependant, une expiration ciblée du cache des INI (site.ini par exemple) peut être effectuée par simple suppression des fichiers concernés :

find var/cache/ini -name "site-*"| xargs rm
Publié par Gilles Guirand le



Alexandre Sebbane : Un block ezflow 'accordeon'

Pour repondre a un besoin utilisateur, j'ai du integrer le script accordeon 1.1 que j'ai trouvé ici : http://nicolahibbert.com/horizontal-accordion-jquery-plugin

Pour mettre en œuvre un block ezflow sous ezpublish, il y a 3 étapes :

la configuration ezflow ( dans block.ini.append.php )

[BannerMediaCenter]
Name=Bannier Media Center
NumberOfValidItems=10
NumberOfArchivedItems=5
ManualAddingOfItems=enabled
ViewList[]=accordeon
ViewName[accordeon]=accordeon

la configuration du template ( dans override.ini dans votre design )

[block_banner_accordeon]
Source=block/view/view.tpl
MatchFile=block/banner/accordeon.tpl
Subdir=templates
Match[type]=BannerMediaCenter
Match[view]=accordeon

le template lui meme :

il faut mettre dans le header les ressources suivantes : <link rel="stylesheet" href="http://sebbane.org/blog/post/2012/02/18/{"stylesheets/accordeon/liteaccordion.css"|ezdesign(no)}" > <script src="http://sebbane.org/blog/post/2012/02/18/{"javascript/accordeon/liteaccordion.jquery.js"|ezdesign(no)}"></script>

disponibleressources_accordeon.zip ici

voici le code du template /// <div id="container_flash"> <center>

<div id="one" class="accordion">
       <ol>
       {foreach $block.valid_nodes as $index => $valid_node}

<li> <h2><span>{$valid_node.name}</span></h2> <div> <div class="figure">

{if and (is_set($valid_node.data_map.image),$valid_node.data_map.image.has_content) }
                               <img src="http://sebbane.org/blog/post/2012/02/18/{$valid_node.data_map.image.content.original.url|ezroot(no,full)}" alt="image" height="330px"  width="100%" />
                           {else}
                               <img src="http://sebbane.org/blog/post/2012/02/18/{"banner/default.jpg"|ezimage(no,full)}" alt="" height="330px"  width="100%" />
                           {/if}
                           <div class="figcaption">{$valid_node.data_map.chapo.content.output.output_text|shorten(150)|strip_tags()} <br /> <a href="http://sebbane.org/blog/post/2012/02/18/{$valid_node.url_alias|ezurl(no)}" >{"Show more"|i18n("accordeon/texte")} >>></a></div>

</div> </div> </li>

{/foreach}
        </ol>

</div> <script> // liteAccordion demos $('#one').liteAccordion({ldelim}

containerWidth : 999,           // width of accordion (px)
                containerHeight : 330,          // height of accordion (px)
                headerWidth : 48,               // width of tabs (px)
                autoPlay : true,
                theme : 'bpce',
                pauseOnHover : true, 
                slideSpeed : 600,

rounded : true, // whether to use rounded corners or not** (boolean)

enumerateSlides : false,         // show slide number in tab
                firstSlide : 1 
       {rdelim});

</script> </center> </div>

reste a faire

integrer la version 2 du script. integrer css et js avec ezjscore gerer la possiblité d'en avoir plusieurs dans la meme page...( mettre en rambom sur l'id css...)

Publié par Alexandre Sebbane le