Chercher remplacer dans tous les buffers de vim

J'ai plusieurs fois eu besoin de faire des substitutions dans tous les fichiers ouverts dans vim. J'avais cherché dans les flags de la commande substitute (:s) sans succès et donc systématiquement je contournais le problème à coup de lignes de bash à base de find, sed, grep et compagnie. Mais je suis tombé par hasard sur la commande :bufdo en cherchant à corriger quelques petits bugs dans eZVim le plugin vim pour eZ Publish. Du coup rien de compliqué, il suffit de préfixer toute commande par bufdo pour l'appliquer sur tous les buffers ouverts, par exemple :

:bufdo! %s/cherche/remplace/g

Le point d'exclamation permet de forcer le passage d'un buffer à un autre sans sauvegarder son contenu. Et évidemment ça marche pour autre chose que la substitution. Il est également possible d'exécuter plusieurs commandes sur chacun des buffers en les séparant avec un pipe (|), par exemple pour corriger une indentation en fonction des réglages de vim, supprimer les espaces inutiles en fin de ligne et sauvegarder le fichier, la ligne suivante devrait faire l'affaire :

:bufdo retab | %s/  *$//g | w

Il existe également :tabdo (pour les onglets), :windo (pour les fenêtres vim) et :argdo (pour les arguments de la ligne de commande).

How to make eZ Publish use override conditions when loading a template

I answered this question today on IRC and a colleague asked me the same thing about two weeks ago... it's time to write down the solution :-)

Basically, you just need to tell what design keys you want to use and their value to the template engine of eZ Publish. The design keys are the parameters you will be able to use in an override condition. Let's take an example with a simplistic PHP view (it lacks a lots of checkings) :

<?php
require_once 'kernel/common/template.php';
$NodeID = intval( $Params['NodeID'] );
$node = eZContentObjectTreeNode::fetch( $NodeID );
$tpl = templateInit();
$tpl->setVariable( 'node', $node );
 
// setting up the context to use override conditions
$res = eZTemplateDesignResource::instance();
$designKeys = array( array( 'class_identifier', $node->attribute( 'class_identifier' ) ),
                     array( 'parent_node_id', $node->attribute( 'parent_node_id' ) ) );
$res->setKeys( $designKeys );
 
$tpl->fetch( 'design:mymodule/myview.tpl' );
?>

In this code, I define two design keys : class_identifier and parent_node_id, so I can write override rules that match on the class identifier or on the parent node id of the node or on both, for example :

[myview_folder]
Source=mymodule/myview.tpl
MatchFile=myview/folder.tpl
Subdir=templates
Match[class_identifier]=folder

With this override condition, eZ Publish will use the template located in override/templates/myview/folder.tpl in the design when the node is a folder, otherwise it will use the default one (templates/mymodue/myview.tpl).

Comment créer des objets eZ Publish en PHP

J'ai découvert il n'y a pas très longtemps la fonction eZContentFunctions::createAndPublishObject() de l'API eZ Publish. Cette fonction bien cachée (et enfin documentée depuis la résolution de ce bug) permet de créer facilement des objets de contenus. Quand je pense que tout le travail est mâché par cette fonction, ça en fait des lignes de codes inutiles... Par exemple, pour créer un objet de la classe de contenu File, ces quelques lignes suffisent :

<?php
$params = array();
$params['parent_node_id'] = 52; // node id of /Media/Files
$params['class_identifier'] = 'file';
$params['creator_id'] = 14; // admin
$params['storage_dir'] = '/tmp/data/'; // don't forget the ended /
$params['section_id'] = 3; // section media
 
$attributesData = array();
$attributesData['name'] = 'My file';
$attributesData['file'] = 'my_file.txt';
 
$params['attributes'] = $attributesData;
$contentObject = eZContentFunctions::createAndPublishObject( $params );
?>

Chaque élément du tableau $attributesData contient les valeurs des attributs du futur objet de contenu sous le format attendu par la méthode fromString() de chaque datatype. Et voila, ce n'est pas plus compliqué que ça ! Dommage qu'il n'existe pas encore l'équivalent pour mettre à jour les objets de contenu existants.

Faire la somme de nombres en shell

Petit pense bête pour la prochaine fois où j'aurai besoin de faire la somme d'une liste de nombres en shell (un nombre par ligne) :

cat my_file | awk '{total+=$1}END{print total}'

Par exemple, pour obtenir la taille totale des tables dans une base de données MySQL :

mysqlshow -i my_db '*' | tr -s ' ' | cut -d ' ' -f 14 | grep [0-9] | awk '{total+=$1}END{print total}'

Fetch eZ Publish content nodes in PHP

This short article is a reminder for me, I hope it will save me hours next time.

In a PHP script, to fetch content object nodes you can use eZContentObjectTreeNode::subtree or eZFunctionHandler::execute. The second is very practical because its syntax is similar to content fetch functions in templates. But there's one difference : when writing an attribute filter condition you have to put your condition array in another array even if there's only one condition. For example, in templates you can write :

 

{def $tree=fetch(content, tree, hash(parent_node_id, 2,
                      attribute_filter, array( 'name', 'like', '*ez publish*' ) ) )}

 

So, in a PHP script, I was thinking that I could write :

 

$tree = eZFunctionHandler::execute('content','tree', array('parent_node_id' => 2,
                      'attribute_filter' => array( 'name', 'like', '*ez publish*' ) ) );

 

But it does not work, you have to use this instead :

 

$tree = eZFunctionHandler::execute('content','tree', array('parent_node_id' => 2,
                      'attribute_filter' => array( array( 'name', 'like', '*ez publish*' ) ) ) );

 

In fact, in the documentation of the template fetch list function about attribute filtering (parameters for fetch list and fetch tree are mostly the same), you can read :

 

The "attribute_filter" parameter must be an array. The first element may be set to either "and" or "or" - this controls how the matching specified in the upcoming elements should be carried out. If this parameter is omitted, the system will default to "and". The rest of the elements are arrays, each array specifies a match.

 

So, the first and the second examples are not correct even if the first works in templates ! Damn, this took me almost 2 hours...

Flux RSS des billets

Flux RSS des billets

Rechercher sur pwet.fr

À retenir

Derniers commentaires

Archives

Nuage de tags

Bioutifoul photos

Quelques liens

Licence d'utilisation

Contenu sous Licence Creative Commons By-Sa

Sauf mentions spécifiques, les billets et les photos publiés sur ce site sont placés sous la licence Creative Commons by-sa.

Pour toute utilisation dépassant le cadre de cette licence, merci de me contacter par e-mail.