Mercurial > defr > drupal > noderef_view
comparison noderef_view.module @ 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 | b942365b70eb |
| children | 97954bccf93f |
comparison
equal
deleted
inserted
replaced
| 10:3fdd4dab8407 | 11:e7a597640419 |
|---|---|
| 49 } | 49 } |
| 50 } | 50 } |
| 51 $count++; | 51 $count++; |
| 52 $five = time() + 300; | 52 $five = time() + 300; |
| 53 setrawcookie('noderef['. $node->nid .']', rawurlencode($node->title), $five, '/'); | 53 setrawcookie('noderef['. $node->nid .']', rawurlencode($node->title), $five, '/'); |
| 54 dsm(t('!title added to selection', array('!title' => $node->title))); | 54 drupal_set_message(t('!title added to selection', |
| 55 array('!title' => $node->title))); | |
| 55 } | 56 } |
| 56 | 57 |
| 57 /** | 58 /** |
| 58 * Implémentation de hook_form_alter(). | 59 * Implémentation de hook_form_alter(). |
| 59 * | 60 * |
| 62 */ | 63 */ |
| 63 function noderef_view_form_alter(&$form, $form_state, $form_id) { | 64 function noderef_view_form_alter(&$form, $form_state, $form_id) { |
| 64 if (isset($form['type']) && $form_id == $form['type']['#value'] .'_node_form') { | 65 if (isset($form['type']) && $form_id == $form['type']['#value'] .'_node_form') { |
| 65 // That's a node form, get the fields and alter the form if needed | 66 // That's a node form, get the fields and alter the form if needed |
| 66 $fields = content_fields(); | 67 $fields = content_fields(); |
| 67 $alter = _noderef_view_walk_form($form, $fields); | 68 $alter = _noderef_view_walk_form($form, $fields, $form); |
| 68 if ($alter) { | 69 if ($alter) { |
| 69 // We've changed the form, add the JS-behavior and Views CSS | 70 // We've changed the form, add the JS-behavior and Views CSS |
| 70 // (the latter to deal with exposed filters in the popup) | 71 // (the latter to deal with exposed filters in the popup) |
| 71 $path = drupal_get_path('module', 'noderef_view'); | 72 $path = drupal_get_path('module', 'noderef_view'); |
| 72 drupal_add_js($path .'/noderef_view.js'); | 73 drupal_add_js($path .'/noderef_view.js'); |
| 87 * Parcoure le tableau contenant le formulaire à la recherche | 88 * Parcoure le tableau contenant le formulaire à la recherche |
| 88 * d'élement à modifier. | 89 * d'élement à modifier. |
| 89 * @return | 90 * @return |
| 90 * TRUE si un élement a été modifié, FALSE sinon | 91 * TRUE si un élement a été modifié, FALSE sinon |
| 91 */ | 92 */ |
| 92 function _noderef_view_walk_form(&$form, $fields) { | 93 function _noderef_view_walk_form(&$form, $fields, $items) { |
| 93 $alter = FALSE; | 94 $alter = FALSE; |
| 94 foreach($form as $key => $item) { | 95 foreach($items as $key => $item) { |
| 95 if (is_array($item)) { | 96 if (is_array($item)) { |
| 96 if (isset($fields[$key])) { | 97 if (isset($fields[$key])) { |
| 97 $alter |= noderef_view_alter_item($form, $key, $fields[$key]); | 98 $alter |= noderef_view_alter_item($form, $key, $fields[$key]); |
| 98 } | 99 } |
| 99 else { | 100 else { |
| 100 $alter |= _noderef_view_walk_form($item, $fields); | 101 $alter |= _noderef_view_walk_form($form, $fields, $item); |
| 101 } | 102 } |
| 102 } | 103 } |
| 103 } | 104 } |
| 104 return $alter; | 105 return $alter; |
| 105 } | 106 } |
| 112 */ | 113 */ |
| 113 function noderef_view_alter_item(&$form, $key, $field) { | 114 function noderef_view_alter_item(&$form, $key, $field) { |
| 114 if (is_array($field) && $field['type'] == 'nodereference') { | 115 if (is_array($field) && $field['type'] == 'nodereference') { |
| 115 $link = _noderef_view_get_link($field); | 116 $link = _noderef_view_get_link($field); |
| 116 if (!empty($link)) { | 117 if (!empty($link)) { |
| 117 $form[$key]['#noderef_view_link'] = $link; | |
| 118 $form[$key]['#after_build'][] = 'noderef_view_add_link'; | |
| 119 return TRUE; | 118 return TRUE; |
| 120 } | 119 } |
| 121 } | 120 } |
| 122 return FALSE; | 121 return FALSE; |
| 123 } | |
| 124 | |
| 125 function noderef_view_add_link($form_element) { | |
| 126 $form_element['#prefix'] = "<div class='noderef-view-wrapper'>" . $form_element['#prefix']; | |
| 127 $form_element['#suffix'] .= $form_element['#noderef_view_link'] . '<span class="clear-block"></span></div>'; | |
| 128 return $form_element; | |
| 129 } | 122 } |
| 130 | 123 |
| 131 /** | 124 /** |
| 132 * Création d'un lien vers une éventuelle vue associé au champ. | 125 * Création d'un lien vers une éventuelle vue associé au champ. |
| 133 * | 126 * |
| 134 * @return | 127 * @return |
| 135 * - Un lien vers la vue si une vue est associée | 128 * - Un lien vers la vue si une vue est associée |
| 136 * - Une chaine vide sinon | 129 * - Une chaine vide sinon |
| 137 */ | 130 */ |
| 138 function _noderef_view_get_link($field) { | 131 function _noderef_view_get_link($field) { |
| 139 $path = ''; | 132 $path = ''; |
| 140 // Check if there's a view associated with this field | 133 // Check if there's a view associated with this field |
| 141 if (isset($field['advanced_view']) && $field['advanced_view'] !== '--') { | 134 if (isset($field['advanced_view']) && $field['advanced_view'] !== '--') { |
| 142 $view = views_get_view($field['advanced_view']); | 135 $view = views_get_view($field['advanced_view']); |
| 160 $path = l(t('Search'), $path, $options); | 153 $path = l(t('Search'), $path, $options); |
| 161 } | 154 } |
| 162 return $path; | 155 return $path; |
| 163 } | 156 } |
| 164 | 157 |
| 158 function noderef_view_theme() { | |
| 159 return array( | |
| 160 'noderef_view_autocomplete' => array( | |
| 161 'arguments' => array('element' => NULL) | |
| 162 ) | |
| 163 ); | |
| 164 } | |
| 165 | |
| 166 function noderef_view_widget_info() { | |
| 167 return array( | |
| 168 'noderef_view_autocomplete' => array( | |
| 169 'label' => t('Autocomplete text field with View'), | |
| 170 'field types' => array('nodereference'), | |
| 171 'multiple values' => CONTENT_HANDLE_CORE, | |
| 172 'callbacks' => array( | |
| 173 'default value' => CONTENT_CALLBACK_DEFAULT, | |
| 174 ), | |
| 175 ), | |
| 176 ); | |
| 177 } | |
| 178 | |
| 179 function noderef_view_elements() { | |
| 180 return array( | |
| 181 'noderef_view_autocomplete' => array( | |
| 182 '#input' => TRUE, | |
| 183 '#columns' => array('name'), '#delta' => 0, | |
| 184 '#process' => array('noderef_view_autocomplete_process'), | |
| 185 '#autocomplete_path' => FALSE, | |
| 186 ), | |
| 187 ); | |
| 188 } | |
| 189 | |
| 190 function noderef_view_widget(&$form, &$form_state, $field, $items, $delta = 0) { | |
| 191 switch ($field['widget']['type']) { | |
| 192 case 'noderef_view_autocomplete': | |
| 193 $element = array( | |
| 194 '#type' => 'noderef_view_autocomplete', | |
| 195 '#default_value' => isset($items[$delta]) ? $items[$delta] : NULL, | |
| 196 '#value_callback' => 'nodereference_autocomplete_value', | |
| 197 ); | |
| 198 break; | |
| 199 } | |
| 200 return $element; | |
| 201 } | |
| 202 | |
| 203 /** | |
| 204 * Process an individual element. | |
| 205 * | |
| 206 * Build the form element. When creating a form using FAPI #process, | |
| 207 * note that $element['#value'] is already set. | |
| 208 * | |
| 209 */ | |
| 210 function noderef_view_autocomplete_process($element, $edit, $form_state, $form) { | |
| 211 // The nodereference autocomplete widget doesn't need to create its own | |
| 212 // element, it can wrap around the text_textfield element and add an autocomplete | |
| 213 // path and some extra processing to it. | |
| 214 // Add a validation step where the value can be unwrapped. | |
| 215 $fields = content_fields(); | |
| 216 $link = _noderef_view_get_link($fields[$element['#field_name']]); | |
| 217 $field_key = $element['#columns'][0]; | |
| 218 $element[$field_key] = array( | |
| 219 '#type' => 'text_textfield', | |
| 220 '#default_value' => isset($element['#value']) ? $element['#value'] : '', | |
| 221 '#autocomplete_path' => 'nodereference/autocomplete/'. $element['#field_name'], | |
| 222 // The following values were set by the content module and need | |
| 223 // to be passed down to the nested element. | |
| 224 '#title' => $element['#title'], | |
| 225 '#required' => $element['#required'], | |
| 226 '#description' => $element['#description'], | |
| 227 '#field_name' => $element['#field_name'], | |
| 228 '#type_name' => $element['#type_name'], | |
| 229 '#delta' => $element['#delta'], | |
| 230 '#columns' => $element['#columns'], | |
| 231 ); | |
| 232 if ($link) { | |
| 233 $element[$field_key]['#noderef_view_link'] = $link; | |
| 234 $element[$field_key]['#prefix'] = "<div class='noderef-view-wrapper'>"; | |
| 235 $element[$field_key]['#suffix'] = $link ."</div>"; | |
| 236 } | |
| 237 if (empty($element[$field_key]['#element_validate'])) { | |
| 238 $element[$field_key]['#element_validate'] = array(); | |
| 239 } | |
| 240 array_unshift($element[$field_key]['#element_validate'], 'nodereference_autocomplete_validate'); | |
| 241 | |
| 242 // Used so that hook_field('validate') knows where to flag an error. | |
| 243 $element['_error_element'] = array( | |
| 244 '#type' => 'value', | |
| 245 // Wrapping the element around a text_textfield element creates a | |
| 246 // nested element, so the final id will look like 'field-name-0-nid-nid'. | |
| 247 '#value' => implode('][', array_merge($element['#parents'], array($field_key, $field_key))), | |
| 248 ); | |
| 249 return $element; | |
| 250 } | |
| 251 | |
| 252 function theme_noderef_view_autocomplete($element) { | |
| 253 return <<<EOT | |
| 254 <div class='noderef-view-wrapper'> | |
| 255 {$element['#children']} | |
| 256 {$element['#noderef_view_link']} | |
| 257 <span class='clear-block'></span> | |
| 258 </div> | |
| 259 EOT; | |
| 260 } |
