Bonjour,
Je développe en PHP pour le CMS Drupal. J'ai réalisé un formulaire avec l'API Drupal. Le formulaire s'affiche correctement, cependant je reçois l'erreur suivante :
Je pense que cette erreur vient du nom donné au champ "proportion" de mon formulaire, soit : '#name' => 'proportion[channel_'.$i.']' . Le nom étant, je le pense, considéré comme un array. Cependant j'ai été obligée de donner ce nom là pour pouvoir récupérer les données dans la fonction channel_form_submit(). Je n'arrive pas à résoudre cette erreur, quelqu'un aurait-il une idée ?Warning: mb_strlen() expects parameter 1 to be string, array given in drupal_strlen() (line 441 of C:\wamp\www\drupal-7.8\includes\unicode.inc).
Je met le code plus complet à la suite, si besoin. Merci.
La fonction qui crée le formulaire est la suivante (je n'ai gardé ici que la partie du formulaire):
et ici se trouve la fonction qui permet de mettre en forme le formulaire (dans mon cas, je l'insère dans un tableau )
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 /** * Define a channel form. */ function channel_form() { foreach ($result_sort_channel as $sort_channel) { if($sort_channel->simple == '1') { $form['sort_'.$sort_channel->idsort_of_channel]['name'] = array('#markup' => check_plain($sort_channel->name)); for($i=1;$i<= $j; $i++) { if(isset($channel[$sort_channel->idsort_of_channel][$i])) { //print($i); $options['channel_'.$i] = ''; $enabled[] = 'channel_'.$i; $form['channel_'.$i]['name'] = array('#markup' => check_plain($channel[$sort_channel->idsort_of_channel][$i])); $form['channel_'.$i]['proportion'] = array('#title' => '','#type' => 'textfield','#size' => 10,'#id' => 'prop_'.$i ,'#name' => 'proportion[channel_'.$i.']'); $form['channel_'.$i]['commission'] = array('#type' => 'textfield', '#id' => 'commission_'.$i, '#default_value' => check_plain($cost[$i][1]), '#size' => 1); $form['channel_'.$i]['monthly_cost'] = array('#type' => 'textfield', '#id' => 'monthly_cost_'.$i, '#default_value' => check_plain($cost[$i][2]), '#size' => 1); $form['channel_'.$i]['cost_per_reservation'] = array('#type' => 'textfield', '#id' => 'cost_per_reservation_'.$i,'#default_value' => check_plain($cost[$i][3]), '#size' => 1); $form['channel_'.$i]['salary_per_hour_chf'] = array('#type' => 'textfield', '#id' => 'salary_per_hour_chf_'.$i,'#default_value' => check_plain($cost[$i][4]), '#size' => 1); $form['channel_'.$i]['salary_per_hour_m'] = array('#type' => 'textfield', '#id' => 'salary_per_hour_m_'.$i,'#default_value' => check_plain($cost[$i][5]), '#size' => 1); $form['channel_'.$i]['distribution_cost'] = array('#type' => 'textfield', '#id' => 'distribution_cost_'.$i,'#default_value' => check_plain($cost[$i][6]), '#size' => 1); $form['channel_'.$i]['idsort_of_channel'] = array('#type' => 'textfield', '#id' => 'idsort_of_channel'.$i,'#default_value' => check_plain($sort_channel->idsort_of_channel), '#size' => 1,'#name' => 'idsort_of_channel[channel_'.$i.']'); } } } }
Et finalement, la fonction qui récupère les données du formulaire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 function theme_channel_form($variables) { $form = $variables['form']; $rows = array(); foreach(element_children($form) as $chan) { $sort_award = explode("_", $chan); if($sort_award[0] == 'sort') { $row = array(); $row[] = array('data' => drupal_render($form[$chan]['name']), 'colspan' => '9','id' => 'sort_channel_'.$chan.'','class' => 'sort_channel',); $rows[] = $row; } else { if($sort_award[0] == 'channel') { //print($chan); // résultat : channel_1 channel_2 channel_3 channel_4 channel_5 channel_6 channel_7 channel_8 channel_9 channel_10 channel_11 $row = array(); $row[] = array('data' => drupal_render($form['enabled'][$chan]),'id' => 'channel_'.$chan.'','class' => 'checkboxes_channel',); $row[] = array('data' => drupal_render($form[$chan]['name']),'id' => 'name_'.$chan.'','class' => 'name_channel',); $row[] = array('data' => drupal_render($form[$chan]['proportion']),'id' => 'prop_'.$chan.'','class' => 'prop_channel',); $row[] = array('data' => '<img src="'.$module_path.'/img/info.png" alt="" /> ','id' => 'cost_'.$chan.'','class' => 'cost_channel',); $row[] = array('data' => drupal_render($form[$chan]['commission']),'id' => 'commission_'.$chan.'','class' => 'costs_channel'); $row[] = array('data' => drupal_render($form[$chan]['monthly_cost']),'id' => 'monthly_cost_'.$chan.'','class' => 'costs_channel',); $row[] = array('data' => drupal_render($form[$chan]['cost_per_reservation']),'id' => 'cost_per_reservation_'.$chan.'','class' => 'costs_channel',); $row[] = array('data' => drupal_render($form[$chan]['salary_per_hour_chf']),'id' => 'salary_per_hour_chf_'.$chan.'','class' => 'costs_channel',); $row[] = array('data' => drupal_render($form[$chan]['salary_per_hour_m']),'id' => 'salary_per_hour_m'.$chan.'','class' => 'costs_channel',); $row[] = array('data' => drupal_render($form[$chan]['distribution_cost']),'id' => 'distribution_cost'.$chan.'','class' => 'costs_channel',); $row[] = array('data' => drupal_render($form[$chan]['idsort_of_channel']),'id' => 'idsort_of_channel'.$chan.'','class' => 'idsort_of_channel',); $rows[] = $row; } } } $row = array(); $row[] = array('data' => t('Total'),'colspan' => '2', 'class' => 'total_channel',); $row[] = array('data' => drupal_render($form['total']),'id' => 'total_prop','class' => 'total_channel',); $rows[] = $row; $row = array(); $row[] = array('data' => drupal_render($form['submit']),'id' => 'cost_calculation','class' => 'total_channel', 'colspan' => '2',); $rows[] = $row; $header = array( array('data' => t('title'),'id' => 't_clear', 'colspan' => '2'), array('data' => t('Proportion (%)')), array('data' => t('Informations'))); $output = theme('table', array('header' => $header, 'rows' => $rows,'attributes' => array('id' => 'choose_channel'))); $output .= drupal_render_children($form); return $output; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 /** * Handle post-validation form submission. */ function channel_form_submit($form, &$form_state) { $selectedchannels = array(); foreach (element_children($form_state['values']['enabled']) as $key) { if ($form_state['values']['enabled'][$key]) { $chan = $form_state['values']['enabled'][$key]; $idchan = explode("_", $chan); // 1 $prop = $form_state['values']['proportion'][$key]; $idsort_of_channel = $form_state['values']['idsort_of_channel'][$key]; $channel = array( 'idchannel' => $idchan[1], 'name' => drupal_render($form[$chan]['name']), 'proportion' => $prop, 'idsort_of_channel' => $idsort_of_channel, ); $selectedchannels[] = $channel; } } $_SESSION['selectedchannels'] = $selectedchannels; }
Partager