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;
+}