Est-il toujours nécessaire de présenter Context, le module de Development Seed (Grands utilisateurs du célèbre triptyque Panels, Context et Spaces utilisé dans la distribution Open Atrium) ? Oui ? Et bien je vais citer Marie-Hélène qui vous le présente sur Drupalistic
Context est une manière pratique et relativement rationnelle de configurer l'affichage des blocs en fonction de la "section" du site sur laquelle on se trouve.
Un exemple couramment cité est de définir un context blog, actif lorsque l'utilisateur visualise un billet de blog, dans lequel vont apparaître les blocs "derniers commentaires", ou "derniers billets", par exemple. Cela évite, lorsque l'on souhaite modifier l'aspect d'une section, de devoir éditer la configuration de chaque bloc et la modifier à la main, en risquant d'oublier un paramètre.
Voilà pour la présentation, admettons maintenant que vous vouliez définir votre contexte en vous basant sur un type de contenu définit comme Organic Group de type "Group post". Pour cela vous devez implémenter le hook hook_context_conditions() qui permet d'ajouter des conditions à remplir pour déterminer le contexte. Ce hook est assez simple, il doit retourner un ou plusieurs champs de formulaire qui représentent les conditions que vous voulez ajouter. Dans notre exemple, nous exposons les types de contenu définis en tant que "group post".
/**
* Implements hook_context_conditions().
*/
function group_post_expose_context_conditions() {
$items = array();
$groups = array();
$types = node_get_types();
// Parcourir la liste des types de contenus pour trouver si des types de contenu
// sont des "group" (lire des "group post")
foreach ($types as $type) {
if (variable_get('og_content_type_usage_' . $type->type, 'omitted') == "group") {
$groups[$type->type] = $type->name;
}
}
// Si des types de contenu sont des group post
// Il suffit de les ajouter à l'entrée de formulaire $items
// Ce champ est utilisé dans context
if (count($groups) > 0) {
$items['group_posts'] = array(
'#title' => t('Group post family'),
'#description' => t('If the post is displayed as a child of the group (the group is in the url).'),
'#type' => 'checkboxes',
'#options' => $groups,
);
}
return $items;
}
Vous pouvez donc définir de nouvelles conditions pour activer votre contexte, mais il manque une étape indispensable pour se faire, il vous faut déterminer le moment où vous donnez la valeur de votre contexte. Par exemple activer le contexte "concours" lorsque l'utilisateur visualise un group post de type "concours". Pour cela, il vous faut simplement appeler la fonction context_set_by_condition() au bon moment. Cette fonction prends deux paramètres, le premier est la condition à laquelle vous voulez donner une valeur et le second est la valeur de cette condition. Voici un snippet dans le contexte de notre exemple :
/**
* Implements hook_nodeapi().
*/
function group_post_expose_nodeapi($node, $op) {
if($node->type == "concours" && $op == "view") {
// "group_posts" est le nom du champ définit dans le hook_context_conditions()
// $node->type représente la valeur à donner à cette condition (ce champ de formulaire) (ici "concours").
context_set_by_condition('group_posts', $node->type);
}
}
Et le tour est joué ! Lorsque nous afficherons un noeud de type concours, notre contexte sera actif, libre à vous de l'utiliser comme bon vous semble, vous pouvez afficher un bloc supplémentaire, cacher une région etc.
Si vous aussi vous avez des astuces à partager sur Context, n'hésitez pas à les publier dans les commentaires.