3

我创建了自己的名为“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;
}

谢谢你的帮助

4

3 回答 3

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

      );

}

我创建了文件主题/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); ?>
于 2010-05-17T18:27:42.870 回答
1

hook_form_alter仅当您想更改另一个模块已定义的表单时才需要。由于您正在定义表单,因此您无需更改它,而是可以随意定义它。

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

在Drupal 的 FAPI 参考中寻求帮助。

于 2010-05-10T20:24:57.240 回答
0

我找到了我现在需要的大部分东西。我必须使用 Themer Info 给我的“建议”表单 ID,即“cssswitch_node_form”。我在我的表单构建函数中使用了它,称为“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 代码自动围绕带有 div 的表单元素的问题,这不是我想要的。在这种情况下,我想并排放置一些表单元素。我猜这就是 drupal_render() 函数的作用。是否有一个函数调用只会给我没有所有 html 标记的表单元素?

谢谢

于 2010-05-11T18:03:17.043 回答