1

我有一个定义内容类型的模块。假设我只有titlebody字段。

当节点表单呈现时,它具有标准title (textfield)body (textarea).

我想将这两个字段包装成fieldset.

这就是我实现这一目标的方式,但我认为这不是最好的方式。

/**
 * Implements hook_form().
 */
function hook_form($node, $form_state) {
  return node_content_form($node, $form_state);
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function hook_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'content_type_name_node_form') {
    $form['info'] = array(
      '#type' => 'fieldset',
      '#title' => t('Describe your content')
    );

    $form['info']['title'] = $form['title'];
    unset($form['title']);

    $form['info']['body'] = $form['body'];
    unset($form['body']);
  }
}

关于如何使它变得更好的任何建议?

更新

我想到的另一个变体。几乎是一样的,只是稍微改进了一点。

/**
 * Implements hook_form_FORM_ID_alter().
 */
function hook_form_node_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'content_type_name_node_form') {
    $groups = array(
      'info' => array(
        'title' => t('Describe your content'),
        'fields' => array('title', 'body')
      )
    );

    foreach ($groups as $key => $group) {
      $form[$key] = array(
        '#type' => 'fieldset',
        '#title' => $group['title']
      );
      foreach ($group['fields'] as $field) {
        $form[$key][$field] = $form[$field];
        unset($form[$field]);
      }
    }
  }
}
4

2 回答 2

4

我必须同意 David Fells 的观点——我认为你的做法没有问题。

但只是为您提供一种在字段集中设置标题和正文字段的非编程方式:您可以查看字段组模块

顾名思义,Fieldgroup 将字段组合在一起。所有可字段实体都可以添加组以将其字段包装在一起。Fieldgroup 带有默认的 HTML 包装器,如垂直选项卡、水平选项卡、手风琴、字段集或 div 包装器

老实说,如果您只想为您的标题和正文创建一个字段集,这可能有点矫枉过正,但如果您对字段分组和主题有其他类似的要求,让 UI 为您做这件事可能会很有用。

于 2012-08-10T23:19:04.077 回答
3

你做的正是你应该做的,弗拉德。这就是 API 的使用方式,实际上没有其他方法可以通过代码来实现。

您也可以使用 Panels 更改布局,尽管我自己没有这样做并且无法解释该过程,我也不能肯定地说它会完全按照您在此处所做的。使用自定义模块可能是最直接的途径。

于 2012-08-10T19:33:33.117 回答