2010-01-09 11 views
1

Je travaille avec un hook_form_alter sur un type CCK (pour vous drupal-ers). J'ai un champ qui est normalement une liste de sélection dans mon formulaire de noeud. Toutefois, dans ce cas, je souhaite masquer la liste de sélection et remplir sa valeur dans le formulaire avec une requête SQL.Drupal 6: Insérer uniquement le premier caractère de la valeur à MySQL

Tout allait bien. Je pouvais voir que ma valeur désirée apparaissait dans la source HTML, donc je savais que ma requête s'exécutait correctement. Toutefois, lorsque je soumets le formulaire, il insère uniquement le premier caractère de la valeur. Quelques-uns de mes tests étaient des valeurs de 566, 784, 1004 - les valeurs de la colonne étaient 5,7,1, respectivement. Au début, je pensais que ce devait être les attributs de la colonne DB, mais quand j'ai supprimé mon form_alter qui rend le champ caché et sélectionnez la valeur manuellement, la valeur correcte est insérée?!? Est-ce que quelqu'un peut voir pourquoi seul le premier caractère serait inséré ???

Remarque: J'ai essayé de supprimer et de recréer la colonne, en utilisant la valeur # & #default_value, et elle ne soumet toujours que le premier caractère de l'entier. En outre, j'ai éliminé le gestionnaire de soumission en tant que cause possible en le supprimant, ce qui entraîne toujours un seul caractère soumis

Plus de mises à jour - Rechercher toujours! D'accord, quelques bonnes questions. Permettez-moi de leur répondre:

  1. Le type de colonne DB est entier (4)
  2. Le code HTML crochet produit est:

    type d'entrée

    = "hidden" name = "field_sr_account" id = » edit-champ sr-compte » value = "2589"

Dernière mise à jour: Je pense que la question a été réduit à la structure du tableau. Quand je fais var_dump sur ce champ après la forme alter a été traitée, ce que je reçois ..

[43] => Array 
     (
      [#type] => hidden 
      [#default_value] => 2589 
      [#post] => Array 
       (
       ) 

      [#programmed] => 
      [#tree] => 
      [#parents] => Array 
       (
        [0] => field_sr_account 
       ) 

      [#array_parents] => Array 
       (
        [0] => field_sr_account 
       ) 

      [#weight] => 0.016 
      [#processed] => 1 
      [#description] => 
      [#attributes] => Array 
       (
       ) 

      [#required] => 
      [#input] => 1 
      [#process] => Array 
       (
        [0] => form_expand_ahah 
       ) 

      [#name] => field_sr_account 
      [#id] => edit-field-sr-account 
      [#value] => 2589 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

Quelle est la structure du champ que je peux définir la valeur de formulaire. Il doit bien y avoir quelque chose comme ce qui suggère abhaga est ..

+0

Pourrions-nous voir le code où vous affectez la valeur à $ club? –

+0

Bien sûr - J'ai mis à jour le message original. C'est tout le code associé qui se trouve dans un module personnalisé. – tpow

Répondre

2

Étant donné que le champ que vous essayez de modifier utilisait à l'origine un widget de sélection, CCK recherchera $form_state['values']['field_sr_account'][0]['value']. En définissant le champ sur un type #hidden et en définissant #value, vous obtiendrez sa valeur dans $form_state['values']['field_sr_account'].CCK va essayer d'accéder au premier élément et finir avec le premier caractère de la valeur.

Mise à jour: La meilleure façon d'obtenir ce que vous avez besoin serait de faire quelque chose:

function addSR_form_service_request_node_form_alter(&$form, $form_state) { 
    if (arg(0) == 'user' && is_numeric(arg(1))) { 
    $account = arg(1); 
    $club = 2589; 
    // Use this property to store the value to restore back 
    $form['#field_sr_account'] = $club; 
    $form['field_sr_account'] = array('#type' => 'hidden','#value' => $club); 
    } 
} 

/*in your submit handler, restore the value in the proper format*/ 
$form_state['values']['field_sr_account'] = array('0' => array('value' => $form['#field_sr_account'])); 

Vieille réponse

Une façon d'accomplir ce que vous êtes essaie de faire est de copier l'ensemble $form['field_sr_account'] en $form['#field_sr_account'] et puis fournir la valeur à travers le SQL requête dans le bon format dans le gestionnaire de soumission lui-même.

+0

J'ai suggéré un moyen plus simple de réaliser ce dont tu as besoin même si ça ne sent pas tout à fait la façon Drupal :) – abhaga

+0

hmm, quelque chose ne va pas ici. Quand j'exécute cet extrait, j'obtiens un avertissement: preg_match() attend que le paramètre 2 soit string, array donné dans bootstrap.inc sur la ligne 777. J'ai vérifié cette fonction et c'est - function drupal_validate_utf8 ($ text) { ~ 777 ~ return (preg_match ('/^./ us', $ texte) == 1); donc il échoue à valider comme utf8. La valeur HTML pour le champ est null. – tpow

+0

Hmm ... bizarrement je n'ai pas eu d'erreur quand j'ai essayé mais en regardant la documentation officielle, '#value pour type # hidden' ne peut être que' text ou number'. Par conséquent, l'utilisation d'un tableau comme valeur est problématique. Vous pouvez conserver la valeur dans une propriété différente dans $ form et l'assigner dans $ form_state ['values'] 'dans le gestionnaire de soumission. – abhaga

0

Ok jeter un oeil à http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#hidden contre http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html#value

Il est également recommandé d'utiliser la valeur au lieu de caché. Vous pouvez trouver cette information sur http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6

De même, le type caché n'est pas autorisé à avoir des propriétés que vous lui attribuez, ce qui peut causer un problème. Tous les problèmes d'utilisation que vous pouvez rencontrer avec l'API des formulaires doivent être résolus dans ces ressources, car je ne sais toujours pas exactement ce que vous essayez d'accomplir ... en particulier avec le bouton Soumettre

Ancienne réponse:

Ok si je comprends bien club $ n'est pas réglé correctement. Si le premier résultat de votre recherche est le numéro que vous cherchez alors cette devrait fonctionner.

Essayez d'appeler

<?php print_r(db_fetch_array($result)) ?> 

pour obtenir un coup d'œil à tout retourné de la requête.

Je ne comprends pas très bien ce qui est incorrectement défini. Si c'est #value à l'intérieur de votre tableau associé alors le coupable doit être la requête. Si #value est réglé correctement et quoi que vous en fassiez plus tard peut être le coupable (non montré ici). Si ses valeurs dans votre $form_state I ne voient pas que vous utilisez $club ici du tout.

Aussi, dans votre addSR_submit_function vous ne semblez pas en utilisant la variable $form , ou en utilisant le club de $ pour quoi que ce soit sauf pour le réglage du message qui apparaît en haut de la page votre sur quand il est appelé .

Je pourrais avoir besoin d'une clarification supplémentaire pour savoir ce qui ne va pas.

Aussi, lorsque vous appelez la fonction drupal_set_message, vous faites juste pour le débogage fins?

+0

C'est un peu difficile parce qu'il y a des éléments dans la forme qui ne correspondent pas du tout à la question. 1-le message drupal_set_message est pour le débogage. 2-La raison pour laquelle $ club n'est pas appelé dans la fonction de soumission est que tous les éléments du formulaire doivent être soumis avec un gestionnaire de soumission personnalisé, même s'il n'est pas explicitement appelé, n'est-ce pas? Je pourrais me tromper à ce sujet, mais pourquoi ne soumettrait-il que le premier personnage? 3- Je peux vérifier que le résultat de la requête SQL est correct en regardant la source HTML de l'élément input via firebug. – tpow

+0

Réponse mise à jour, espérons que cela éclaircira votre problème. –

+0

J'ai essayé #value (dans la publication actuelle) et #hidden, ainsi qu'avec et sans les attributs ajoutés (#size et #maxlength), sans succès. L'autre code dans la fonction de soumission remplace l'UID du nœud pour une raison spécifique à mon application, mais sans rapport avec ce problème. – tpow

0

Ne devriez-vous vérifier

drupal_set_message($form_state['values']['field_sr_account']); 

au lieu de

drupal_set_message($club); 

à addSR_submit_function?

OK, juste un quess: vous ne savez pas quel type renvoie db_result pour votre requête, peut-être que cela a quelque chose à voir avec les conversions de types? Donc, c'est pour s'assurer que la valeur est int.

'#value' => (int)$club 
+0

drupal_set_message ($ form_state ['values'] ['field_sr_account']); renvoie la valeur correcte sur la page suivante (après l'insertion), mais la valeur de la base de données est la même (premier caractère uniquement) – tpow

+0

Pourriez-vous publier le code INSERT dans la base de données? – Kniganapolke

+0

Aucun code pour cela - Drupal l'introduit automatiquement avec la soumission du formulaire. En outre, SQL est fiable, donc c'est soit le format de mon tableau, soit un bug dans la façon dont CCK gère le champ. En d'autres termes, le fait que le bon premier caractère arrive à la DB à chaque fois me fait confiance au SQL et me méfie du code ... – tpow

0

cinqoTimo, par curiosité quel type de champ CCK est-ce? Est-ce un nombre entier, décimal, flottant? et avez-vous des paramètres spéciaux sur ce champ qui ne sont normalement pas activés par défaut? Quel est le type de colonne dans la base de données?

Pouvez-vous publier la sortie html du formulaire. Cela pourrait donner une idée de ce qui pourrait se passer.

Utilisez-vous un javascript pour modifier les valeurs de ce champ?

Avez-vous essayé de sortir les résultats de la valeur de addSR_form_service_request_node_submit hook? Toute différence là-bas.

Désolé pour toutes les questions. Il suffit de penser à voix haute car il semble que vous avez couvert la plupart de vos bases.