annotate noderef_view.module @ 5:4fc2f22efcdf

Better name for the attribute to prevent collision, add to #after_build #link was probably overly too broad, so I've renamed the attribute to include the module name. The code previously also fully took over #after_build, which killed other modules registrations. Now the module's a good citizen and only add its handler leaving the others as is.
author Franck Deroche <franck@defr.org>
date Mon, 26 Jan 2009 14:59:57 +0100
parents 9372c6448311
children e3f85c9247b7
rev   line source
franck@0 1 <?php
franck@0 2 // vim: set ts=2 sw=2 expandtab syntax=php:
franck@0 3
franck@0 4 /**
franck@0 5 * @file
franck@0 6 * Fichier principale du module noderef_view
franck@0 7 *
franck@0 8 * Ce module permet d'ajouter à tous les champs de type "Node Reference"
franck@1 9 * pour lesquels une vue définissant les nodes autorisés a été définie
franck@1 10 * un lien 'Search' affichant la vue dans une popup (via le module Popups API),
franck@0 11 * permettant de choisir les nodes à mettre dans le champ en disposant de la
franck@1 12 * puissance de Views pour la recherche (Exposed Filters notamment).
franck@0 13 */
franck@0 14
franck@0 15 /**
franck@0 16 * Implémentation de hook_view_action_info().
franck@0 17 *
franck@0 18 * On crée une nouvelle action, nommée Select, et qui sera utilisée pour marquer
franck@0 19 * les nodes comme données à utiliser. L'utilisation concrète qui en est faite
franck@0 20 * dans ce module consiste à utiliser ces nœuds selectionés pour les ajouter
franck@0 21 * dans le champ Node Reference étant à l'origine de la recherche.
franck@0 22 */
franck@0 23 function noderef_view_action_info() {
franck@0 24 return array(
franck@0 25 'noderef_view_select' => array(
franck@0 26 'description' => t('Select for later use'),
franck@0 27 'type' => 'node',
franck@0 28 'configurable' => FALSE,
franck@0 29 'hooks' => array(
franck@0 30 'nodeapi' => array()
franck@0 31 )
franck@0 32 )
franck@0 33 );
franck@0 34 }
franck@0 35
franck@0 36 /**
franck@0 37 * Implémentation concrète de l'action de selection.
franck@0 38 *
franck@0 39 * On vide toute eventuelle selection précédente, puis on passe dans le cookie
franck@0 40 * les informations sur la selection qui a été faite.
franck@0 41 */
franck@0 42 function noderef_view_select($node, $context) {
franck@0 43 static $count = 0;
franck@0 44 if ($count == 0 && is_array($_COOKIE['noderef'])) {
franck@0 45 // Reset the cookies
franck@0 46 $before = time() - 300;
franck@0 47 foreach($_COOKIE['noderef'] as $id => $val) {
franck@0 48 setcookie('noderef['. $id .']', 0, $before, '/');
franck@0 49 }
franck@0 50 }
franck@0 51 $count++;
franck@0 52 $five = time() + 300;
franck@0 53 setrawcookie('noderef['. $node->nid .']', rawurlencode($node->title), $five, '/');
franck@0 54 dsm(t('!title added to selection', array('!title' => $node->title)));
franck@0 55 }
franck@0 56
franck@0 57 /**
franck@0 58 * Implémentation de hook_form_alter().
franck@0 59 *
franck@0 60 * On parcoure tous les formulaires à la recherche d'éventuels champs
franck@0 61 * de type "Node Reference" sur lesquels appliqués nos transformations.
franck@0 62 */
franck@0 63 function noderef_view_form_alter(&$form, $form_state, $form_id) {
franck@0 64 if (isset($form['type']) && $form_id == $form['type']['#value'] .'_node_form') {
franck@0 65 // That's a node form, get the fields and alter the form if needed
franck@0 66 $fields = content_fields();
franck@0 67 $alter = _noderef_view_walk_form($form, $fields);
franck@0 68 if ($alter) {
franck@0 69 // We've changed the form, add the JS-behavior and Views CSS
franck@0 70 // (the latter to deal with exposed filters in the popup)
franck@0 71 drupal_add_css(drupal_get_path('module', 'views') .'/css/views.css');
franck@0 72 drupal_add_js(drupal_get_path('module', 'noderef_view') .'/noderef_view.js');
franck@0 73 }
franck@0 74 }
franck@0 75 elseif ($form_id == 'views_exposed_form' && isset($_GET['destination'])) {
franck@0 76 // Views "Exposed Filter" forms doesn't preserve destination by default.
franck@0 77 $form['destination'] = array(
franck@0 78 '#type' => 'hidden',
franck@0 79 '#value' => $_GET['destination']
franck@0 80 );
franck@0 81 }
franck@0 82 }
franck@0 83
franck@0 84 /**
franck@0 85 * Parcoure le tableau contenant le formulaire à la recherche
franck@0 86 * d'élement à modifier.
franck@0 87 * @return
franck@0 88 * TRUE si un élement a été modifié, FALSE sinon
franck@0 89 */
franck@0 90 function _noderef_view_walk_form(&$form, $fields) {
franck@0 91 $alter = FALSE;
franck@0 92 foreach($form as $key => $item) {
franck@0 93 if (is_array($item)) {
franck@0 94 if (isset($fields[$key])) {
franck@0 95 $alter |= noderef_view_alter_item($form, $key, $fields[$key]);
franck@0 96 }
franck@0 97 else {
franck@0 98 $alter |= _noderef_view_walk_form($item, $fields);
franck@0 99 }
franck@0 100 }
franck@0 101 }
franck@0 102 return $alter;
franck@0 103 }
franck@0 104
franck@0 105 /**
franck@0 106 * Modification d'un élement en particulier du formulaire.
franck@0 107 *
franck@0 108 * @return
franck@0 109 * TRUE si l'element a été modifié, FALSE sinon.
franck@0 110 */
franck@0 111 function noderef_view_alter_item(&$form, $key, $field) {
franck@0 112 if (is_array($field) && $field['type'] == 'nodereference') {
franck@2 113 $link = _noderef_view_get_link($field);
franck@0 114 if (!empty($link)) {
franck@5 115 $form[$key]['#noderef_view_link'] = $link;
franck@5 116 $form[$key]['#after_build'][] = 'noderef_view_add_link';
franck@0 117 return TRUE;
franck@0 118 }
franck@0 119 }
franck@0 120 return FALSE;
franck@0 121 }
franck@0 122
franck@3 123 function noderef_view_add_link($form_element) {
franck@3 124 $form_element['#prefix'] = "<div class='noderef-view-wrapper'>" . $form_element['#prefix'];
franck@3 125 $form_element['#suffix'] .= $form_element['#links'] . '<span class="clear"></span></div>';
franck@3 126 return $form_element;
franck@3 127 }
franck@3 128
franck@0 129 /**
franck@0 130 * Création d'un lien vers une éventuelle vue associé au champ.
franck@0 131 *
franck@0 132 * @return
franck@0 133 * - Un lien vers la vue si une vue est associée
franck@0 134 * - Une chaine vide sinon
franck@0 135 */
franck@0 136 function _noderef_view_get_link($field) {
franck@0 137 $path = '';
franck@0 138 // Check if there's a view associated with this field
franck@0 139 if (isset($field['advanced_view']) && $field['advanced_view'] !== '--') {
franck@0 140 $view = views_get_view($field['advanced_view']);
franck@0 141 // Try to find a path for this view, looking at the displays
franck@0 142 $path = '';
franck@0 143 foreach($view->display as $display) {
franck@0 144 if (is_array($display->display_options)
franck@0 145 && isset($display->display_options['path'])) {
franck@0 146 $path = $display->display_options['path'];
franck@2 147 break;
franck@0 148 }
franck@0 149 }
franck@0 150 }
franck@0 151 // If we found a view with a suitable display, then link to it
franck@0 152 if (!empty($path)) {
franck@0 153 popups_add_popups();
franck@0 154 $options = array(
franck@2 155 'attributes' => array('class' => 'popups noderef_view_link'),
franck@0 156 'query' => array('destination' => 'node')
franck@0 157 );
franck@0 158 $path = l(t('Search'), $path, $options);
franck@0 159 }
franck@2 160 return $path;
franck@0 161 }
franck@0 162