Astuce [eZ4] Utiliser l'ActionHandler d'eZ Publish

Les actions dans eZ Publish

Tout d'abord, qu'est-ce qu'une action dans eZ Publish ?

Il s'agit d'un traitement effectué à la soumission d'un formulaire pointant vers content/action.

Exemple :

<form method="post" action="{'content/action'|ezurl( 'no' )}">
    <label for="message">{'Message'|i18n( 'sample' )} :</label>
    <textarea id="message" name="message"></textarea>
 
    <input type="hidden" name="ContentObjectID" value="{$node.object.id}" />
    <input type="hidden" name="NodeID" value="{$node.node_id}" />
    <input type="submit" name="LogMessageButton" value="Log" />
</form>

Le formulaire est constitué d'un textarea permettant à l'utilisateur de saisir son message, d'un bouton submit et de champs cachés. Notez que le champ ContentObjectID est obligatoire, même si l'action n'utilise pas sa valeur (vous pouvez retourner -1 dans ce cas).

Le nom du submit correspond au nom de l'action à effectuer. EZ Publish référence déjà beaucoup d'actions (notamment toutes celles relatives aux boutons submit du back-office), mais vous pouvez en rajouter.

Créer ses propres actions

Supposons qu'on veuille loguer le message du textarea et le node_id de la page à la soumission du formulaire.

Pour qu'eZ Publish trouve vos actions, vous devez déclarer votre extension comme ayant des actions, dans le fichier site.ini.

Par exemple dans extension/monextension/settings/site.ini.append.php :

<?php /* #?ini charset="utf-8"?
 
[ActionSettings]
ExtensionDirectories[]=monextension
 
*/ ?>

Dans votre extension, créez un répertoire actions/, contenant le fichier content_actionhandler.php :

<?php
include_once( 'lib/ezutils/classes/ezoperationhandler.php' );
 
function monextension_ContentActionHandler( &$module, $http, $objectID ) {
 
    // Action de loguer un message
    if ( $http->hasPostVariable( 'LogMessageButton' ) ) {
        // Si le formulaire soumis contient un message non vide
        if ( $http->hasPostvariable( 'message' ) && $http->postvariable( 'message' ) != '' ) {
            $message = $http->postvariable( 'message' );
            $nodeID  = $http->postvariable( 'NodeID' );
 
            $logMessage = 'La page ' . $nodeID . ' a été affichée et on a soumis le message : ' . $message;
            eZLog::write( $logMessage );
        }
 
        // Redirection vers la page du formulaire
        $module->redirectTo( '/content/view/full/' . $nodeID );
        return;
    }
}
?>

Explications :

  • Ce fichier contient une fonction dont le nom est obligatoirement préfixé par le celui de votre extension.
  • Toutes les actions sont listées, soit par une suite de if, soit dans un switch, en fonction du nom de l'action envoyé par le formulaire (LogMessageButton dans cet exemple).
  • Chaque action redirige vers une page, ou vers la vue d'un module.

Remarque :

N'oubliez pas de vider les caches et régénérer les autoloads pour qu'eZ Publish trouve votre nouvel ActionHandler.