来自模块的drupal中的表单布局

时间:2010-05-10 19:53:12

标签: php drupal drupal-fapi drupal-alter

我创建了自己的模块“cssswitch”。我正在尝试创建自己的html布局来显示模块的管理表单部分。我理解如何使用hook_form_alter()来修改表单元素,但我需要创建整个表单布局以使某些字段彼此相邻。 看来我需要的东西就像我使用theme_cssswitch_display()显示的节点的前端视图,但是对于节点的管理部分。

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

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

我现在整理好了。 我的hook_theme是这样的:

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',
      ),

      );

}

我创建了文件themes / garland / cssswitch-node-form.tpl.php 然后我可以控制放置任何表单元素的位置:

<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 :(得分:1)

如果要更改另一个模块已定义的表单,则仅需要

hook_form_alter。由于您正在定义表单,因此您无需更改表单,而只需按您的意愿定义它。

更改表单标记需要使用的是表单本身和/或元素的#theme属性。有了它,您可以使用自己的主题函数来呈现表单及其元素。

Drupal's FAPI reference中寻求帮助。

答案 2 :(得分:0)

我发现了我现在需要的大部分内容。我不得不使用Themer Info“给我的”cssswitch_node_form“的”建议“表单ID。我在我的表单构建函数中使用了这个名为”cssswitch_form()的代码: $ form ['#theme'] ='cssswitch_node_form';

我还需要在这个函数中使用该名称:

function cssswitch_theme() {

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

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


    );

这是同名的功能,但前面加上“theme_”:

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;

}

我仍然有自动包含表单元素的html代码问题,这不是我想要的。在这种情况下,我想并排放置一些表单元素。我猜这就是drupal_render()的功能。是否有函数调用只给我一个没有所有html标记的表单元素?

感谢