1

コンテンツ タイプを定義したモジュールがあります。titlebodyフィールドしかないと仮定しましょう。

ノード フォームがレンダリングされると、標準title (textfield)body (textarea).

この 2 つのフィールドを にラップしたいと思います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 に同意せざるを得ません -- あなたのやり方に問題はありません。

しかし、タイトルと本文のフィールドをフィールドセットに設定するための非プログラミング的な方法を提供するために、Field Group モジュールをチェックアウトできます。

フィールドグループは、名前が示すように、フィールドをグループ化します。すべてのフィールド可能なエンティティは、グループを追加してフィールドをまとめる可能性があります。フィールドグループには、垂直タブ、水平タブ、アコーディオン、フィールドセット、または div ラッパーなどのデフォルトの HTML ラッパーが付属しています

正直に言うと、タイトルと本文用のフィールドセットを作成するだけではやり過ぎの可能性がありますが、フィールドのグループ化とテーマ設定に関して他にも同様の要件がある場合は、UI でそれを行うと便利な場合があります。

于 2012-08-10T23:19:04.077 に答える
3

ヴラド、あなたはまさにあなたがすべきことをしているのです。これが API の意図した使用方法であり、コードを介してそれを行う方法は他にありません。

パネルを使用してレイアウトを変更することもできますが、私は自分で行ったことがないため、プロセスを説明することはできません。また、ここで行っていることとまったく同じようになるとは断言できません。カスタム モジュールを使用するのが、おそらく最も直接的な方法です。

于 2012-08-10T19:33:33.117 に答える