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 }