IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire Drupal, erreur mb_strlen()


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 7
    Par défaut Formulaire Drupal, erreur mb_strlen()
    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 :

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

    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):

    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 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
    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;
    }
    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
    /**
    * 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;
     
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 8
    Par défaut
    Citation Envoyé par rps8484a Voir le message
    Je pense que cette erreur vient du nom donné au champ "proportion" de mon formulaire, soit : '#name' => 'proportion[channel_'.$i.']' .
    Je ne serais que te conseiller de changer le nom pour être sur de la provenance de l'erreur

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/09/2008, 09h21
  2. Formulaire dynamique : Erreur 29054
    Par Secco dans le forum VBA Access
    Réponses: 4
    Dernier message: 30/06/2008, 09h53
  3. Formulaire hérité erreur
    Par exile69 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 18/09/2007, 13h07
  4. Réafficher formulaire si erreur
    Par temar dans le forum SQL
    Réponses: 4
    Dernier message: 05/06/2007, 16h11
  5. [Formulaire] Gestion erreur saisie d'une requête
    Par b_steph_2 dans le forum IHM
    Réponses: 6
    Dernier message: 05/01/2006, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo