2010-05-10 7 views
3

J'ai créé mon propre module appelé "cssswitch". J'essaye de créer ma propre disposition html pour montrer la partie de forme d'admin du module. Je comprends comment utiliser le hook_form_alter() pour modifier les éléments du formulaire, mais j'ai besoin de créer l'ensemble du formulaire pour que certains champs apparaissent les uns à côté des autres. Il semble que j'ai besoin de quelque chose comme la vue frontale du nœud affiché avec theme_cssswitch_display(), mais pour la partie admin du nœud.mise en page en drupal depuis un module

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

Répondre

2

J'ai tout compris maintenant. Mon hook_theme est la suivante:

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éé les thèmes de fichiers/guirlande/cssswitch nœud-form.tpl.php Ensuite, je peux avoir le contrôle sur l'endroit où placer des éléments de formulaire comme celui-ci:

<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); ?> 
1

hook_form_alter est nécessaire uniquement, si vous voulez changer une forme 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 est l'attribut #theme du formulaire lui-même et/ou ses éléments. Avec lui, vous pouvez utiliser vos propres fonctions de thème pour rendre le formulaire et ses éléments.

Rechercher de l'aide dans Drupal's FAPI reference.

+0

Merci de m'indiquer dans la bonne direction. Je sens que je l'ai presque maintenant, mais ma forme n'est pas thématisée avec la fonction dans mon module.J'ai ajouté le nom de la fonction de thème dans la fonction de formulaire comme ceci: $ form ['# theme'] = 'cssswitch_form'; fonction cssswitch_theme() { \t réseau de retour ( \t 'cssswitch_display' => array ( \t 'arguments' => array ('noeud'), \t), \t 'cssswitch_form' => array ( \t 'arguments' => array(), \t), \t \t); } function theme_cssswitch_form ($ form) { $ output = ' test 123'; $ output. = Drupal_render ($ form); return $ output; } – EricP

+0

@EricP N'oubliez pas d'effacer le cache, c'est le problème le plus normal avec les fonctions de thème. – googletorp

0

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é qui était" cssswitch_node_form ".J'ai utilisé cela dans ma fonction de construction de formulaire appelée" cssswitch_form() comme ceci: $ form ['# theme'] = ' cssswitch_node_form ';

Je dois aussi 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_ » pré-ajouté aux:

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; 

} 

Je encore avoir le problème du code html entourant les éléments de formulaire avec divs automatiquement ce qui n'est pas ce que je voulais. Dans ce cas, je souhaite placer des éléments de formulaire côte à côte. Je suppose que c'est ce que fait la fonction drupal_render(). Y at-il un appel de fonction qui va juste me donner l'élément de formulaire sans tout le balisage html?

merci