(非)各フォーム要素のフォーマット


7

のようなものを宣言するとき

$form['textfield'] = array(
  '#type' => 'textfield',
  '#title' => 'textfield title',
  '#maxlength' => 8,
  '#required' => true,
);

出力は次のようになります。

<div id="edit-textfield-wrapper" class="form-item">
  <label for="edit-textfield">textfield title: <span title="This field is required." class="form-required">*</span></label>
  <input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">
</div>

しかし、私はコンテナを削除して喜んでdivlabel私のフィールドの一部から、このような何か:

<input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">

出来ますか?どこかに例はありますか?

回答:


4

が呼び出されたときに呼び出されるテーマ関数を変更するには、hook_theme_registry_alter()を実装するだけですtheme('form_element')。通常、呼び出されるテーマ関数はtheme_form_element()です。

function theme_form_element($element, $value) {
  // This is also used in the installer, pre-database setup.
  $t = get_t();

  $output = '<div class="form-item"';
  if (!empty($element['#id'])) {
    $output .= ' id="' . $element['#id'] . '-wrapper"';
  }
  $output .= ">\n";
  $required = !empty($element['#required']) ? '<span class="form-required" title="' . $t('This field is required.') . '">*</span>' : '';

  if (!empty($element['#title'])) {
    $title = $element['#title'];
    if (!empty($element['#id'])) {
      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
    else {
      $output .= ' <label>' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
  }

  $output .= " $value\n";

  if (!empty($element['#description'])) {
    $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
  }

  $output .= "</div>\n";

  return $output;
}
function mymodule_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['form_element']) {
    $theme_registry['form_element']['function'] = "theme_mymodule_form_element";
  }
}

のコードを使用してtheme_form_element()、独自のテーマ関数を記述し、不要なHTMLタグを削除できます。theme('form_element')フォームAPIですべてのフォーム要素出力に対して呼び出されることを覚えておいてください。form要素のみのHTML出力を変更する場合は、#type値を確認する必要があります。
theme_textfield()は、テキストフィールドにテーマを設定するテーマ関数です<div>が、すでに出力されているラベルやラッピングは出力しませんtheme_form_element()

または、これはをオーバーライドするテーマで行うこともできますtheme_form_element()
どちらのアプローチを使用するかは、特定のテーマの出力を変更する必要があるか、Drupalサイトで有効になっているすべてのテーマの出力を変更する必要があるかによって異なります。後者の場合、モジュールで報告したフックを実装する必要があります。


kiamlaluno、答えの最初に感謝しますが、コアテーマ(たとえば、ガーランド)でこれらの関数を使用することは可能ですか?
acm

@andre matos Drupalコアテーマの場合、説明したフック関数を実装するカスタムモジュールを実装する必要があります。これは、テーマのコードを変更せずにモジュールを変更する唯一の方法であり、Drupalを更新するたびに変更する必要があります。Drupalを更新するが、そのテーマは更新しないのは良い考えではありません。モジュールで変更されたものがあり、それらの変更を取得できません。
kiamlaluno

drupal 7は有効ですか?私は、hook_element_info_alterを使用することで異なると思います
khaled_webdev

0

私の知る限り<div>、テーマを変更しない限り、ラッパーを削除することはできません。


私が使用しているテーマがコアテーマであることを考えると、明らかにハッキングせずにそれを行う方法はありますか?
acm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.