使用node_form的更好方法

时间:2012-08-04 14:59:23

标签: drupal drupal-7 drupal-theming

我有一个模块,我定义了内容类型。我们假设我只有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]);
      }
    }
  }
}

2 个答案:

答案 0 :(得分:4)

我不得不同意大卫·费尔斯的观点 - 我不知道你们是如何做到这一点的。

但只是为您提供一种非编程方式来设置字段集中的标题和正文字段:您可以查看Field Group module

  

顾名思义,Fieldgroup将组合字段组合在一起。所有   可现场实体将有可能添加要换行的组   他们的田地在一起Fieldgroup附带默认的HTML包装器   像垂直标签,水平标签,手风琴,字段集或div   包装

说实话,如果您想要做的就是为您的标题和正文创建一个字段集,那么它可能有点过分,但如果您对字段分组和主题有其他类似的要求,那么让UI执行它可能会很有用。你。

答案 1 :(得分:3)

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

你也可以使用面板改变布局,虽然我自己也没有这样做,也无法解释这个过程,也不能肯定地说它会完全按照你在这里做的那样去做。使用自定义模块可能是最直接的途径。