franck@0: array( franck@0: 'description' => t('Select for later use'), franck@0: 'type' => 'node', franck@0: 'configurable' => FALSE, franck@0: 'hooks' => array( franck@0: 'nodeapi' => array() franck@0: ) franck@0: ) franck@0: ); franck@0: } franck@0: franck@0: /** franck@0: * Implémentation concrète de l'action de selection. franck@0: * franck@0: * On vide toute eventuelle selection précédente, puis on passe dans le cookie franck@0: * les informations sur la selection qui a été faite. franck@0: */ franck@0: function noderef_view_select($node, $context) { franck@0: static $count = 0; franck@0: if ($count == 0 && is_array($_COOKIE['noderef'])) { franck@0: // Reset the cookies franck@0: $before = time() - 300; franck@0: foreach($_COOKIE['noderef'] as $id => $val) { franck@0: setcookie('noderef['. $id .']', 0, $before, '/'); franck@0: } franck@0: } franck@0: $count++; franck@0: $five = time() + 300; franck@0: setrawcookie('noderef['. $node->nid .']', rawurlencode($node->title), $five, '/'); franck@0: dsm(t('!title added to selection', array('!title' => $node->title))); franck@0: } franck@0: franck@0: /** franck@0: * Implémentation de hook_form_alter(). franck@0: * franck@0: * On parcoure tous les formulaires à la recherche d'éventuels champs franck@0: * de type "Node Reference" sur lesquels appliqués nos transformations. franck@0: */ franck@0: function noderef_view_form_alter(&$form, $form_state, $form_id) { franck@0: if (isset($form['type']) && $form_id == $form['type']['#value'] .'_node_form') { franck@0: // That's a node form, get the fields and alter the form if needed franck@0: $fields = content_fields(); franck@0: $alter = _noderef_view_walk_form($form, $fields); franck@0: if ($alter) { franck@0: // We've changed the form, add the JS-behavior and Views CSS franck@0: // (the latter to deal with exposed filters in the popup) franck@6: $path = drupal_get_path('module', 'noderef_view'); franck@6: drupal_add_js($path .'/noderef_view.js'); franck@6: drupal_add_css($path .'/noderef_view.css'); franck@0: drupal_add_css(drupal_get_path('module', 'views') .'/css/views.css'); franck@0: } franck@0: } franck@0: elseif ($form_id == 'views_exposed_form' && isset($_GET['destination'])) { franck@0: // Views "Exposed Filter" forms doesn't preserve destination by default. franck@0: $form['destination'] = array( franck@0: '#type' => 'hidden', franck@0: '#value' => $_GET['destination'] franck@0: ); franck@0: } franck@0: } franck@0: franck@0: /** franck@0: * Parcoure le tableau contenant le formulaire à la recherche franck@0: * d'élement à modifier. franck@0: * @return franck@0: * TRUE si un élement a été modifié, FALSE sinon franck@0: */ franck@0: function _noderef_view_walk_form(&$form, $fields) { franck@0: $alter = FALSE; franck@0: foreach($form as $key => $item) { franck@0: if (is_array($item)) { franck@0: if (isset($fields[$key])) { franck@0: $alter |= noderef_view_alter_item($form, $key, $fields[$key]); franck@0: } franck@0: else { franck@0: $alter |= _noderef_view_walk_form($item, $fields); franck@0: } franck@0: } franck@0: } franck@0: return $alter; franck@0: } franck@0: franck@0: /** franck@0: * Modification d'un élement en particulier du formulaire. franck@0: * franck@0: * @return franck@0: * TRUE si l'element a été modifié, FALSE sinon. franck@0: */ franck@0: function noderef_view_alter_item(&$form, $key, $field) { franck@0: if (is_array($field) && $field['type'] == 'nodereference') { franck@2: $link = _noderef_view_get_link($field); franck@0: if (!empty($link)) { franck@5: $form[$key]['#noderef_view_link'] = $link; franck@5: $form[$key]['#after_build'][] = 'noderef_view_add_link'; franck@0: return TRUE; franck@0: } franck@0: } franck@0: return FALSE; franck@0: } franck@0: franck@3: function noderef_view_add_link($form_element) { franck@3: $form_element['#prefix'] = "
" . $form_element['#prefix']; franck@6: $form_element['#suffix'] .= $form_element['#noderef_view_link'] . '
'; franck@3: return $form_element; franck@3: } franck@3: franck@0: /** franck@0: * Création d'un lien vers une éventuelle vue associé au champ. franck@0: * franck@0: * @return franck@0: * - Un lien vers la vue si une vue est associée franck@0: * - Une chaine vide sinon franck@0: */ franck@0: function _noderef_view_get_link($field) { franck@0: $path = ''; franck@0: // Check if there's a view associated with this field franck@0: if (isset($field['advanced_view']) && $field['advanced_view'] !== '--') { franck@0: $view = views_get_view($field['advanced_view']); franck@0: // Try to find a path for this view, looking at the displays franck@0: $path = ''; franck@0: foreach($view->display as $display) { franck@0: if (is_array($display->display_options) franck@0: && isset($display->display_options['path'])) { franck@0: $path = $display->display_options['path']; franck@2: break; franck@0: } franck@0: } franck@0: } franck@0: // If we found a view with a suitable display, then link to it franck@0: if (!empty($path)) { franck@0: popups_add_popups(); franck@0: $options = array( franck@2: 'attributes' => array('class' => 'popups noderef_view_link'), franck@0: 'query' => array('destination' => 'node') franck@0: ); franck@0: $path = l(t('Search'), $path, $options); franck@0: } franck@2: return $path; franck@0: } franck@0: