3 votes

mise en page d'un formulaire dans drupal à partir d'un module

J'ai créé mon propre module appelé "cssswitch". J'essaie de créer ma propre mise en page html pour afficher la partie formulaire d'administration du module. Je comprends comment utiliser la fonction hook_form_alter() pour modifier les éléments du formulaire, mais j'ai besoin de créer toute la mise en page du formulaire pour faire apparaître certains champs les uns à côté des autres. Il semble que j'ai besoin de quelque chose de similaire à la façon dont j'ai affiché la vue frontale du nœud avec theme_cssswitch_display(), mais pour la partie admin du nœud.

function cssswitch_form_alter(&$form, $form_state, $form_id) {

    switch($form_id) {  

        case 'cssswitch_node_form':
            $form['hour_start']['#prefix'] = '<div class="start-box">';
            $form['ampm_start']['#suffix'] = '</div>';
            $form['ampm_start']['#attributes'] = array("style" => "border-width:2px;");
            break;
    }

}

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

    );

}

// to display the view of the node
function theme_cssswitch_display($node) {

  $output = '<div class="cssswitch-cssfilename">Filename: '.
    check_plain($node->cssfilename). '</div>';
  $output .= '<div class="cssswitch-time_start">Start: '.
    check_plain($node->hour_start). ':'.check_plain($node->minute_start).' '.check_plain($node->ampm_start).'</div>';

  $output .= '<div class="cssswitch-time_end">End: '.
    check_plain($node->hour_end). ':'.check_plain($node->minute_end).' '.check_plain($node->ampm_end).'</div>';    

  return $output;
}

Merci pour toute aide

2voto

EricP Points 810

J'ai tout réglé maintenant. Mon hook_theme est le suivant :

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

      'cssswitch_node_form' => array(
        'arguments' => array('form' => NULL),
        'template' => 'cssswitch-node-form.tpl.php',
      ),

      );

}

J'ai créé le fichier themes/garland/cssswitch-node-form.tpl.php. Je peux alors avoir le contrôle sur l'endroit où placer les éléments de formulaire comme ceci :

<style>
#edit-hour-start-wrapper, #edit-minute-start-wrapper, #edit-ampm-start-wrapper, #edit-hour-end-wrapper, #edit-minute-end-wrapper, #edit-ampm-end-wrapper {
    float:left;
    margin-right:25px;
}
</style>
<div id="regform1">

<?php print drupal_render($form['title']); ?>
<?php print drupal_render($form['cssfilename']); ?>

    <fieldset class="group-account-basics collapsible">
        <legend>Time Start</legend>
        <?php print drupal_render($form['hour_start']); ?>
        <?php print drupal_render($form['minute_start']); ?>
        <?php print drupal_render($form['ampm_start']); ?>
    </fieldset>

    <fieldset class="group-account-basics collapsible"><legend>Time end</legend>
        <?php print drupal_render($form['hour_end']); ?>
        <?php print drupal_render($form['minute_end']); ?>
        <?php print drupal_render($form['ampm_end']); ?>    
    </fieldset>
</div>

<?php print drupal_render($form['options']); ?>
<?php print drupal_render($form['author']); ?>
<?php print drupal_render($form['revision_information']); ?>
<?php print drupal_render($form['path']); ?>
<?php print drupal_render($form['attachments']); ?>
<?php print drupal_render($form['comment_settings']); ?>
<?php print drupal_render($form); ?>

1voto

googletorp Points 22395

hook_form_alter n'est nécessaire que si vous voulez modifier un formulaire qu'un autre module a défini. Puisque vous définissez le formulaire, vous n'avez pas besoin de le modifier, vous pouvez simplement le définir comme vous le souhaitez.

Ce que vous devez utiliser, pour modifier le balisage du formulaire, c'est la fonction #theme du formulaire lui-même et/ou de ses éléments. Il vous permet d'utiliser les fonctions de votre propre thème pour rendre le formulaire et ses éléments.

Cherchez de l'aide dans Référence FAPI de Drupal .

0voto

EricP Points 810

J'ai trouvé la plupart de ce dont j'ai besoin maintenant. J'ai dû utiliser l'identifiant de formulaire "suggéré" que Themer Info" m'a donné, à savoir "cssswitch_node_form". Je l'ai utilisé dans ma fonction de création de formulaire appelée "cssswitch_form()" comme ceci : $form['#theme'] = 'cssswitch_node_form' ;

J'ai également besoin d'utiliser ce nom dans cette fonction :

function cssswitch_theme() {

    return array(
      'cssswitch_display' => array(
        'arguments' => array('node'),
      ),

      'cssswitch_node_form' => array(
        'arguments' => array('form' => NULL),
      ),      

    );

Et voici la fonction du même nom mais avec "theme_" en préambule :

function theme_cssswitch_node_form($form) {

    $output='';
    $output.='<span>testing 123</span>';
    $output.=drupal_render($form['hour_start']['name']);
    $output.=drupal_render($form['minute_start']);
        $output .= drupal_render($form);

  return $output;

}

J'ai toujours le problème du code html qui entoure automatiquement les éléments du formulaire avec des divs, ce qui n'est pas ce que je voulais. Dans ce cas, je veux placer certains éléments de formulaire côte à côte. Je suppose que c'est ce que fait la fonction drupal_render(). Existe-t-il un appel de fonction qui me donne simplement l'élément de formulaire sans tout le balisage html ?

merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X