フォーム要素のdivラッパーのクラスを変更する


11

フォームAPIを使用してクラスをフォームラッパー(DIV)に追加または変更する方法はありますか?

それとも、テーマ機能だけで行われますか?

もしそうなら、それを変更するためにどのテーマ機能が使用されますか?


それはテーマ関数だと思います。どのテーマ関数を使用するかが問題です。:)
akalata 2011

ああ、あなたはそこにいます。
chrisjlee 2011

#attributeキーを使用してクラスを定義することもできると思います
Mika A.

@Mika A.これは、ラッパーのクラスを変更する<input>タグ(<div>)にのみ適用されます。
chrisjlee 2011

回答:


5

theme_form_element()テーマをグローバルに変更する場合は、通常どおりオーバーライドできます。特定のフォーム要素を1つだけ変更したい場合は、いくつかの選択肢があることを知っています。

  1. 興味のある特定のタイプのフォーム要素(テキストフィールドなど)に新しいテーマ関数を登録できます。次に、このテーマ関数を(たとえば、元のに基づいて)作成しますが、最後にtheme_textfield()呼び出さtheme('form_element', ...)れません(1つのテーマ関数でラッパーと要素の両方を処理するか、別のラッパーテーマ関数を作成できます)そしてそれを使用してください)。最後#themeに、特定のフォーム要素にプロパティを追加すると、その要素がカスタムテーマを取得します。

  2. form_element.tpl.phpというデフォルトの動作を持つテンプレートファイルを作成し、theme_form_element()それを使用hook_preprocess_form_element()してテンプレートの提案を追加できます。次に、提案に一致する新しいテンプレートを作成します。テンプレートは関数よりも少し遅いという話をよく耳にしますが、このように頻繁に使用されるテーマの呼び出しでは、テンプレートの使用に抵抗している人を想像できます。自分でこれを測定したことはありません。また、提案を行うには、前処理段階で十分なコンテキストが必要です。


例を挙げていただけますか?
chrisjlee 2012年

@ ChrisJ.Leeすべての要素のラッパーを変更しますか、それとも特定のラッパーを1つだけ変更しますか?
アンディ

1つだけ。
chrisjlee、2012

@chrisjlee答えを更新しました。
アンディ

4

私はこれが超古いスレッドであることを知っていますが、フォーム要素を変更してクラスを追加する方法を学んでいます。私はカスタムモジュールを作ることに慣れました:

function yourtheme_custom_form_alter(&$form, &$form_state, $form_id) {
 case'webform_number_whatever':
   _yourtheme_form_add_wrapper($form['submitted']['yourfieldhere'], array('form-field-some-style', 'not-label', 'whatever-other-styles-you-want'));
 break;
}

function _yourtheme_form_add_wrapper(&$element, $classes = array(), $type = array('form-item', 'form-type-textfield'), $removeTitle = FALSE){
  $element['#prefix'] = '<div class="' . implode(" ", $classes) . '"><div class="' . implode(" ", $type) . '">';
  $element['#suffix'] = '</div></div>';
}

これは優れた代替ソリューションです。ラッピングdivにクラスを追加せずに、ラッピングdivを独自のdivでラップするだけで、必要なクラスを適用できます。
Felix Eve

3

「ラッパー」を変更するには、form_elementをオーバーライドする必要があります。基本的に、すべてのフォーム要素はform_elementテーマtheme_form_element($element,$value);(form.incファイル)でレンダリングされます

したがって、フォーム要素のレンダリング方法を変更するには、その関数をtemplate.phpフォルダーにコピーし、名前を次のように変更します。 phptemplate_form_element($element,$value)

これで変更を加えることができ、元の関数の代わりに使用されます

  1. theme_form_element($element,$value);form.incからコピー
  2. (テーマ)template.phpに貼り付けます
  3. 名前を次のように変更します。 phptemplate_form_element($element,$value)
  4. すべてのテーマキャッシュをクリアする
  5. 必要な変更を加えれば、それらが使用されます。

1

wrapper_attributesプロパティを使用できます。

$form['example'] = [
  '#type' => 'textfield',
  '#title' => $this->t('Example'),
  '#wrapper_attributes' => ['class' => ['wrapper-class']],
];

この回答は役に立ちましたが、特にDrupal 8.x以降に適用されることに注意してください。
マーティン

0

重要なのは、theme_form_elementは直接の親ラッパーdivのみを変更し、これはCSS効果の対象となるターゲットではない可能性があることです。

[プログラムではありませんが、ノードフィールドのトップラッパー(ラッパー、ラッパー、ラッパー)にクラスを適用するだけの場合は、特定のコンテンツタイプの[フィールドの管理]を選択して[フィールドグループ]モジュールを使用し、単純なDIVとして[新しいグループを追加]を選択します。次に、ラベルを削除して、必要なクラスを追加のラッパーに割り当てることができます(ただし、ラッパーはさらに増えました)-ネストは無制限です]


0

あなたは使うことができます

'#prefix' => '<div class="new_class">', '#suffix' => '</div>'

そしてこれはそれを包みます


0

ラッパー属性を構成可能にします!

テーマに独自のフォーム要素テーマ関数を作成します... sites/all/themes/MY_THEME/theme/form-element.theme.inc

function my_theme_form_element($variables) {
  $element = &$variables['element'];

  $attributes = isset($element['#my_theme_wrapper_attributes']) ?
    $element['#my_theme_wrapper_attributes'] : array();

  ...

  $output = '<div' . drupal_attributes($attributes) . '>' . "\n";

  ...
}

次に、このようなことを行うことができます...

function my_module_form_alter(&$form, &$form_state, $form_id) {
  $form['account']['mail']['#my_theme_wrapper_attributes']['class'][] = 'form-field--inline';
}

0

望ましい結果が得られない、#prefix/#suffixまたは#attributes => array('class')得られない場合もあります。私の特別なケースは、managed_file要素の周りのajax-wrapper divにクラスを追加することです。 #prefix/#suffix新しいコンテナを作成し#attributes/'class'、最も外側ではなく、内側の要素のクラスを変更します。

通常の最も外側のdivはちょうどです

<div id="edit-doc1--XX-ajax-wrapper">

これはCSSでターゲットにするのが難しいです。私がターゲットにすることができます[id^="edit-doc"]または[id$="-ajax-wrapper"]それ以上、私が欲しかっただけの要素よりもこれらのターゲットの両方。

私が思いついた解決策は、フォームに#process要素を追加し、要素のコードを手動で操作することです。次に#process、フォームアイテムの宣言に追加される属性を示します。

$form['doc1'] = array(
  '#type' => 'managed_file',
  '#process' => array('mymodule_managed_file_process'),
);

そしてここにmymodule_managed_file_process()関数があります:

function mymodule_managed_file_process($element, &$form_state, $form) {

  // Call the original function to perform its processing.
  $element = file_managed_file_process($element, $form_state, $form);

  // Add our own class for theming.
  $element['#prefix'] = str_replace(
    'id=',
    'class="managed-file-wrapper" id=',
    $element['#prefix']
  );

  return $element;
}

文字列置換に依存することは移植str_replace性が低いため、自己責任で使用してください。ただし、このコードは実際に最も外側のDIVを変更して必要なクラスを追加します。

<div class="managed-file-wrapper" id="edit-doc1--XX-ajax-wrapper">

-1
<?php
    $form['#attributes'] = array('class' => 'your-class-name');
?> 

上記の方法を使用して、フォーム要素にクラスを追加できます。


6
次に、divのクラスをどのように変更しますか?上記のコードは、<input />タグのクラスを変更します。
chrisjlee 2011

1
この答えは、ここで尋ねられた特定の質問に対しては間違っています。
doublejosh 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.