2010-07-31 16 views
4

Je n'ai pas d'expérience en php. J'ai suivi quelques tutoriels pour modifier mes formulaires Drupal en utilisant la méthode theme dans template.php.Modification des champs de formulaire Drupal - [#weight] dans le tableau n'est pas respecté?

Pour une raison quelconque, la propriété [#weight] d'un champ n'adhère pas à ses valeurs. Je voudrais déplacer le champ Catégorie [cid] au-dessus du champ Sujet [sujet]. Ce sont les lignes de code I utilisées:

$form['cid']['#weight'] = 0.003; 
$form['subject']['#weight'] = 0.004; 

Quand j'imprimer mon tableau pour voir je vois les valeurs ont changé, mais quand je rends la forme aucune modification. J'ai déjà effacé le cache de performance après chaque modification.

Si vous êtes intéressé ici est un extrait de mon tableau imprimé:

[subject] => Array 
     (
      [#type] => textfield 
      [#title] => Subject 
      [#maxlength] => 255 
      [#required] => 1 
      [#post] => Array 
       (
       ) 

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

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

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

      [#input] => 1 
      [#size] => 60 
      [#autocomplete_path] => 
      [#process] => Array 
       (
        [0] => form_expand_ahah 
       ) 

      [#name] => subject 
      [#id] => edit-subject 
      [#value] => 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

    [cid] => Array 
     (
      [#type] => select 
      [#title] => Category 
      [#default_value] => 1 
      [#options] => Array 
       (
        [1] => General Enquiries 
        [2] => Support 
       ) 

      [#required] => 1 
      [#post] => Array 
       (
       ) 

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

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

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

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

      [#name] => cid 
      [#id] => edit-cid 
      [#value] => 1 
      [#defaults_loaded] => 1 
      [#sorted] => 1 
     ) 

Très apprécié,

Chris

Répondre

9

Vous voyez généralement que le comportement sur les formes de nœud lorsque CCK est activé. En effet, CCK remplace poids pour les champs par défaut et CCK avec son propre système de commande configurable en allant Gestion de contenu ->types de contenu ->[Type de contenu] -> Gérer champs.

Bien sûr, si vous désactivez CCK (probablement pas une option), vos valeurs #weight seront respectées. Une chose à noter est que, bien que l'API Forms permette des nombres décimaux pour #weight, il est recommandé d'utiliser des entiers.


Modifier

Si vous voulez travailler dans les contraintes présente CCK, dans un module personnalisé, vous devez implémenter un gestionnaire #pre_render qui modifiera le poids des éléments de forme après alters CCK les:

function mymodule_form_alter(&$form, &$form_state, $form_id) { 
    $form['#pre_render'][] = 'mymodule_form_alter_weight'; 
} 

function mymodule_form_alter_weight($elements) { 
    $elements['cid']['#weight'] = 0.003; 
    $elements['subject']['#weight'] = 0.004; 

    return $elements; 
} 

Le problème est, vous aurez aucune idée de ce que les valeurs de poids CCK a utilisé pour d'autres éléments de formulaire, de sorte que lorsque vous aurez commandé avant cid sujet, les deux champs pourraient apparaître au milieu de tous les autres champs sur la page et pas dans leur position d'origine. CCK vous force dans un coin quand il s'agit de poids. Le bon, Drupal/CCK façon de gérer la commande de formulaire doit respecter les choix effectués par un administrateur sur Gestion de contenu ->types de contenu ->[Type de contenu] -> Gérer les champs .

Si vous avez un élément de formulaire personnalisé, vous pouvez le signaler à CCK afin qu'il apparaisse dans Gérer les champs en implémentant hook_content_extra_fields(). Poursuivant avec le code ci-dessus:

function mymodule_content_extra_fields() { 
    $extras['mymodule'] = array(// Name of field 
    'label' => t('Mymodule'), 
    'description' => t('Mymodule field'), 
    'weight' => 10, // The default weight, can be overriden on Manage Fields 
); 

    return $extras; 
} 
+0

Cela a du sens. Alors, y a-t-il un moyen de contourner cela? J'ai besoin d'une exception juste pour le formulaire de contact.Je sais que je pourrais probablement le thématiser, mais y a-t-il une solution de codage? –

+0

@Chris, oui et non. J'ai mis à jour ma réponse avec plus d'informations et quelques solutions possibles. –

+0

Merci pour la solution. Je comprends comment CCK gère les champs de formulaire maintenant. Je suppose que si j'avais un formulaire personnalisé, j'irais dans cette direction, mais comme j'ai juste besoin de réorganiser un champ [cid] dans le formulaire de contact à l'échelle du site, je vais aller avec CSS à thème. Je prendrai note de votre solution pour référence future. Merci beaucoup! –