Trucs utiles et erreurs courantes sous eZ publish 4.x
Par Ronan le vendredi, janvier 30 2009, 13:00 - eZ Publish - Lien permanent
Je note au fil de l'eau les bons trucs et les erreurs courantes avec eZ Publish 4.x
Configuration de débug:
Dans le fichier /ezpublish/settings/siteaccess/monsite/site.ini.append.php
# <conf de debug> [DebugSettings] DebugRedirection=disabled Debug=inline DebugOutput=enabled DisplayDebugWarnings=enabled ScriptDebugOutput=enabled [TemplateSettings] #Debug=enabled DevelopmentMode=enabled TemplateCompile=disabled TemplateCache=disabled ShowUsedTemplates=enabled ShowXHTMLCode=disabled #ShowMethodDebug=enabled #NodeTreeCaching=disabled # </conf de debug>
Traduire l'interface de eZ Publish 4.x en français :
- copier le fichier traductions française pour la 4.x dans /share/translations
Afficher une version traduite d'un attribut d'un objet, dans un langue donnée
{def $mynode = fetch( 'content', 'node', hash('node_id', 9999) )
$language='ITA-it'
$attributes=fetch( 'content', 'contentobject_attributes', hash( 'version', $mynode.object.current, 'language_code', $language ) )
}
{if is_set($attributes.0)}
{attribute_view_gui attribute=$attributes.0}
{/if}
Masquer la trace dans une page en particulier
Créer un override pour le pagelyaout.tpl de ce noeud / objet et ajouter à la fin du pagelayout 'overridé'
<!-- <!--DEBUG_REPORT--> -->
Affiche le contenu d'un texte riche (XML Block) sans aucune balise XML ou XHTML :
{$my_node.data_map.my_xmlblock_attribute.content.output.output_text|strip_tags|shorten( 200 )|simplify|trim}
Gérer les override de templates en matchant une variable
monTemplate.tpl :
{if $some_value|eq( 'something' )}
{set scope=global persistent_variable='caramba'}
{/if}
override.ini :
[test_side_layout] Source=pagelayout.tpl MatchFile=pagelayout_caramba.tpl Subdir=templates Match[persistent_variable]=caramba
Overrider un pagelayout pour une vue d'un module dans une extension
$Result['pagelayout'] = 'pagelayout_mylayout.tpl';
Proposer des classes de style CSS dans OnlineEditor
- Créer un fichier CSS dédié :
/* Style onlineeditor.css */
/* embed : */
.image_a_gauche
{
float:left;
}
.image_a_droite
{
float:left;
}
- Créer un content.ini avec les directives dédiées :
#content.ini [embed] AvailableClasses[]=image_a_gauche AvailableClasses[]=image_a_droite
Cf. Documentation
No template could be loaded for "node/view/full.tpl" using resource "design"
- Vérifier que le répertoire /ezpulibsh/design/mondesign/override et son contenu appartiennent à www-data. Ce répertoire n'existant pas défaut, une fois créé il prend par défaut les droits de son créateur (vous!) et n'est alors pas accessible à Apache.
- Au besoin affecter les bons droits :
sudo chmod -R 777 override/ sudo sudo chown -R www-data:www-data override/
Afficher une image (attribut de classe) dans .tpl
<img class="maClasse"
alt="{$node.data_map.monAttributImage.content.alternative_text|wash()}"
src={$node.data_map.monAttributImage.content.original.url|ezroot()} />
Ne pas oublier le ezroot()...
Autoriser les saut de ligne dans Online Editor
dans /settings/override/content.ini :
[paragraph] AllowEmpty=true
Paginer une liste '$group', avec des items regroupés 3 par 3, dans un foreach
{foreach $group as $key=>$item}
{if mod($key,3)|eq(0)}
<div class="group">
{/if}
<div class="item">{$item.name|wash()}</div>
</div><!-- /item -->
{if or(mod($key,3)|eq(2),$key|inc|eq(count($group)))}
</div><!-- /group -->
{/if}
{/foreach}
Comparer des dates
{if $offre.data_map.AttribPublication_debut.content.timestamp|lt(currentdate())}
<br />Le debut de publication
{$offre.data_map.AttribPublication_debut.content.timestamp}
commence avant ajourd'hui {currentdate()}
{/if}
Créer un lien direct vers un fichier dans un bloc XML dans l'Online Editor :
Ajouter le fichier comme un objet (icône) trombone en mode embed-inline
Ajouter dans le override.ini :
[file_embed-inline] Source=content/view/embed-inline.tpl MatchFile=embed/file_embed-inline.tpl Subdir=templates Match[class_identifier]=file
Créer le fichier file_embed-inline.tpl dans le design/mondesign/override/templates/embed/ :
{$object.name|wash} :
<a href={concat( 'content/download/',
$object.data_map.file.contentobject_id, '/',
$object.data_map.file.id,'/version/',
$object.data_map.file.version , '/file/',
$object.data_map.file.content.original_filename|urlencode )|ezurl}>
{$object.data_map.file.content.original_filename|wash(xhtml)}</a>
({$object.data_map.file.content.filesize|si(byte, kilo)})
Lister des objets selon la date de début et de fin de publication
{def $timestamp = currentdate()
$my_contents=fetch( 'content','tree',hash(
parent_node_id, $node.node_id,
attribute_filter, array(
array( 'maClasse/attribut_publication_debut', '<=', $timestamp ),
array( 'maClasse/attribut_publication_fin', '>=', $timestamp ))
)
)
}
Faire un fil d'Arianne
Créer un fil d'arianne depuis la racine vers la page courante, de la forme :
Accueil > Folder 1 > Sous folder 1.1 > Article 1.1.1
{foreach $module_result.path as $Path}
{if $Path.url}
<a href={$Path.url_alias|ezroot}>{$Path.text|wash}</a> >
{else}
{$Path.text|wash}
{/if}
{/foreach}
Overrider le template pagelayout.tpl pour une section entière
- Créer des sections dans le site
- Pour la section concernée, créer un fichier de template pagelayout_sectionZ.tpl dans design/override/templates/
- Modifier le fichier de settings override.ini.append.php :
[home_section_Z] Source=pagelayout.tpl MatchFile=pagelayout_sectionZ.tpl Subdir=templates Match[section]=17
Passer à la ligne dans une image générée par texttoimage
Utiliser l'opérateur wrap :
{$node.name|wrap(20)|texttoimage( 'arial',,20,,,'#064D95',,,,5 )}
ou utiliser un caractère spécial (comme '$') pour introduire manuellement un passage à la ligne à un endroit particulier de la chaine :
{if $node.name.content|contains('$')}
{def $wrappedTitleArr = $node.name.content|explode( '$' )}
<h2>
{for 0 to $wrappedTitleArr|count|dec as $counter}
{$wrappedTitleArr$counter|texttoimage( 'arial',,20,,,'#064D95',,,,5 )}
{delimiter}<br />{/delimiter}
{/for}
</h2>
{undef $wrappedTitleArr}
{/if}
Afficher une date dans un format particulier
Les dates dans eZ Publish (et si possible dans les extensions) sont stockées au format TimeStamp. Pour générer / convertir un timestamp dans un format "lisibles" (dd/mm/YYY, etc), il y a TimeStamp Converter, une extension de Firefox. Bien pratique pour générer rapidement des données de tests.
L'affichage des dates peut être customisé, et on peut définir plusieurs affichages pour un même site : date, datetime, date avec jour de la semaine, etc. Cf. le datetime.ini dans l'extension ticket de la CCMO par exemple :
Dans un .tpl :
{$monObjet.MonAttribut_Date|datetime( 'fullDateTimeFR' )}
Dans le datetime.ini :
[ClassSettings] # Jeudi 01/05/2008, 21h00 : Formats[fullDateTimeFR]=%l %d/%m/%Y, %Hh%i
Clear cache in a php file
// Clear for node with ID 123
$nodeID = 123;
eZContentCache::cleanup( array( $nodeID ) );
Trier des résultats de recherche ou des relations d'objets sur un attribut en particulier
Attention, cet opérateur est inutile si vous utiliser un fetch list/tree ou le moteur eZFind. Cet opérateur n'est utile que pour trier les résultats du moteur de recherche ou les relations d'objets, pour lesquels le tri avancé (i.e. par attribut de classe de contenu) n'est pas disponible nativement. Voici ci-dessous un exemple d'opérateur pour trier les résultats d'un moteur de recherche (celui proposé par défaut) sur un attribut de date de début de publication 'debut_publication'. Bien sûr, cet exemple n'est pertinent que si votre moteur de recherche ne renvoie que des objets de contenus possédant cet attribut 'debut_publication', comme dans un moteur de recherche uniquement dédié aux actualités par exemple :
Code dans le .tpl des résultats de recherche :
{set $search_result=$search_result|objectsdatesort()}
Code de l'opérateur en PHP :
function modify( $tpl, $operatorName, $operatorParameters, $rootNamespace, $currentNamespace, &$operatorValue, $namedParameters )
{
switch ($operatorName)
{
case 'objectsdatesort' :
{
$objects = $operatorValue;
$priorities = array();
foreach ($objects as $key=>$object) {
if (isset($object)){
$mainObj = eZFunctionHandler::execute('content','object', array('object_id' => $object->ContentObjectID) );
$data_map = $mainObj->dataMap();
array_push($priorities,$data_map['debut_publication']->DataInt);
}
else
{
// Les deux tableaux doivent faire la même taille
// => on retire du tableau $objects les objets inutiles au tri
unset ($objects[$key]);
}
}
array_multisort($priorities,SORT_NUMERIC,SORT_ASC,$objects);
$operatorValue = $objects;
}
break;
}
}
Les Traductions
Dans translations/fre-FR/translation.ts
<!DOCTYPE TS><TS>
<context>
<name>design/monsite/monModule/maVue</name>
<message>
<source>My Word</source>
<translation>Mon Mot</translation>
</message>
</context>
</TS>
Dans un .tpl :
{'My Word'|i18n( 'design/ monsite/monModule/maVue' )}
Debuggage
Paramètres d'un module/view :
{$view_parameters|attribute('show')}
Résoudre "à la dure" un problème d'url alias non résolus par updateniceurls.php
A la ligne 1096 du fichier bin/php/updateniceurls.php, commenter / remplacer :
$hasChanged = $node->updateSubTreePath( false );
par
$hasChanged = $node->updateSubTreePath( true );
Puis dans mysql / phpmyadmin, faire un
TRUNCATE ezurlalias_ml;
Puis lancer php bin/php/updateniceurls.php --update-nodes -s monSiteAccess
Enfin rétablir le script bin/php/updateniceurls.php à l'état d'origine
Construire des formulaires
- Un article complet : http://ez.no/developer/articles/how_to_create_ez_publish_forms
Trois articles e français chez Linuxorable.fr, passés à la trappe, mais récupérable chez Archive.org :
Un autre article en français :
Commentaires
Créer des sections (obligatoire dans cette méthode) faux!!! , les pagelayout peuvent être surchargée comme toutes les autres templates !
Paradox : Ok, merci pour la correction.
De rien, félicitations pour ces snippets
Toujours à la pointe Ronan, comme d'habitude. Excellente idée... et on tombe dessus tout de suite dans Google
Un petit ajout à la config de debug:
TemplateSettings
DevelopmentMode=enabled
Bcp mieux que Debug=enabled, dans le meme bloc...
@Gaetano : Grazie !