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