Mercurial > defr > drupal > noderef_view
changeset 11:e7a597640419
Changement radical dans l'approche: on fournit un nouveau widget
author | Franck Deroche <franck@defr.org> |
---|---|
date | Fri, 27 Feb 2009 17:41:56 +0100 |
parents | 3fdd4dab8407 |
children | 97954bccf93f |
files | noderef_view.module |
diffstat | 1 files changed, 110 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/noderef_view.module Thu Feb 26 16:04:27 2009 +0100 +++ b/noderef_view.module Fri Feb 27 17:41:56 2009 +0100 @@ -51,7 +51,8 @@ $count++; $five = time() + 300; setrawcookie('noderef['. $node->nid .']', rawurlencode($node->title), $five, '/'); - dsm(t('!title added to selection', array('!title' => $node->title))); + drupal_set_message(t('!title added to selection', + array('!title' => $node->title))); } /** @@ -64,7 +65,7 @@ if (isset($form['type']) && $form_id == $form['type']['#value'] .'_node_form') { // That's a node form, get the fields and alter the form if needed $fields = content_fields(); - $alter = _noderef_view_walk_form($form, $fields); + $alter = _noderef_view_walk_form($form, $fields, $form); if ($alter) { // We've changed the form, add the JS-behavior and Views CSS // (the latter to deal with exposed filters in the popup) @@ -89,15 +90,15 @@ * @return * TRUE si un élement a été modifié, FALSE sinon */ -function _noderef_view_walk_form(&$form, $fields) { +function _noderef_view_walk_form(&$form, $fields, $items) { $alter = FALSE; - foreach($form as $key => $item) { + foreach($items as $key => $item) { if (is_array($item)) { if (isset($fields[$key])) { $alter |= noderef_view_alter_item($form, $key, $fields[$key]); } else { - $alter |= _noderef_view_walk_form($item, $fields); + $alter |= _noderef_view_walk_form($form, $fields, $item); } } } @@ -114,27 +115,19 @@ if (is_array($field) && $field['type'] == 'nodereference') { $link = _noderef_view_get_link($field); if (!empty($link)) { - $form[$key]['#noderef_view_link'] = $link; - $form[$key]['#after_build'][] = 'noderef_view_add_link'; return TRUE; } } return FALSE; } -function noderef_view_add_link($form_element) { - $form_element['#prefix'] = "<div class='noderef-view-wrapper'>" . $form_element['#prefix']; - $form_element['#suffix'] .= $form_element['#noderef_view_link'] . '<span class="clear-block"></span></div>'; - return $form_element; -} - /** * Création d'un lien vers une éventuelle vue associé au champ. * * @return * - Un lien vers la vue si une vue est associée * - Une chaine vide sinon - */ + */ function _noderef_view_get_link($field) { $path = ''; // Check if there's a view associated with this field @@ -162,3 +155,106 @@ return $path; } +function noderef_view_theme() { + return array( + 'noderef_view_autocomplete' => array( + 'arguments' => array('element' => NULL) + ) + ); +} + +function noderef_view_widget_info() { + return array( + 'noderef_view_autocomplete' => array( + 'label' => t('Autocomplete text field with View'), + 'field types' => array('nodereference'), + 'multiple values' => CONTENT_HANDLE_CORE, + 'callbacks' => array( + 'default value' => CONTENT_CALLBACK_DEFAULT, + ), + ), + ); +} + +function noderef_view_elements() { + return array( + 'noderef_view_autocomplete' => array( + '#input' => TRUE, + '#columns' => array('name'), '#delta' => 0, + '#process' => array('noderef_view_autocomplete_process'), + '#autocomplete_path' => FALSE, + ), + ); +} + +function noderef_view_widget(&$form, &$form_state, $field, $items, $delta = 0) { + switch ($field['widget']['type']) { + case 'noderef_view_autocomplete': + $element = array( + '#type' => 'noderef_view_autocomplete', + '#default_value' => isset($items[$delta]) ? $items[$delta] : NULL, + '#value_callback' => 'nodereference_autocomplete_value', + ); + break; + } + return $element; +} + +/** + * Process an individual element. + * + * Build the form element. When creating a form using FAPI #process, + * note that $element['#value'] is already set. + * + */ +function noderef_view_autocomplete_process($element, $edit, $form_state, $form) { + // The nodereference autocomplete widget doesn't need to create its own + // element, it can wrap around the text_textfield element and add an autocomplete + // path and some extra processing to it. + // Add a validation step where the value can be unwrapped. + $fields = content_fields(); + $link = _noderef_view_get_link($fields[$element['#field_name']]); + $field_key = $element['#columns'][0]; + $element[$field_key] = array( + '#type' => 'text_textfield', + '#default_value' => isset($element['#value']) ? $element['#value'] : '', + '#autocomplete_path' => 'nodereference/autocomplete/'. $element['#field_name'], + // The following values were set by the content module and need + // to be passed down to the nested element. + '#title' => $element['#title'], + '#required' => $element['#required'], + '#description' => $element['#description'], + '#field_name' => $element['#field_name'], + '#type_name' => $element['#type_name'], + '#delta' => $element['#delta'], + '#columns' => $element['#columns'], + ); + if ($link) { + $element[$field_key]['#noderef_view_link'] = $link; + $element[$field_key]['#prefix'] = "<div class='noderef-view-wrapper'>"; + $element[$field_key]['#suffix'] = $link ."</div>"; + } + if (empty($element[$field_key]['#element_validate'])) { + $element[$field_key]['#element_validate'] = array(); + } + array_unshift($element[$field_key]['#element_validate'], 'nodereference_autocomplete_validate'); + + // Used so that hook_field('validate') knows where to flag an error. + $element['_error_element'] = array( + '#type' => 'value', + // Wrapping the element around a text_textfield element creates a + // nested element, so the final id will look like 'field-name-0-nid-nid'. + '#value' => implode('][', array_merge($element['#parents'], array($field_key, $field_key))), + ); + return $element; +} + +function theme_noderef_view_autocomplete($element) { + return <<<EOT +<div class='noderef-view-wrapper'> + {$element['#children']} + {$element['#noderef_view_link']} + <span class='clear-block'></span> +</div> +EOT; +}