フォームAPIを使用して<button type =“ submit”>を生成する


12

統合するテーマの多いフォームがあります。その構造を以下に示します。私は、提出を除いて、ほとんどのところそこにいます。

 <form action="#">
   <fieldset>
     <legend>Authentification</legend>
       <label for="email">Courriel*</label>
       <input type="text" name="email" id="email">
       <label for="password">Mot de passe*</label>
       <input type="password" name="password" id="password" class="last">
       <a href="#" title="Mot de passe oublié?" class="clearfix">Forgot password?</a>
       <button type="submit" class="clearfix"><span>Login</span></button>
   </fieldset>
 </form>

私はさまざまな組み合わせを試しましたが、button_typeはコアに影響を与えないことがわかりました。だから私はこのハックを使っ、それが私の問題を修正することを望みました。悲しいかな、それは 'type'属性(明らかに)のみを変更し、要素自体は変更しません。ボタンタイプは他の要素を保持できます。この場合、背景画像を保持するためにスパンが必要です。ボタン内のテキストが動的であるため、ストレッチするためにスパン内にある必要があります。

フォームAPIを使用して次のマークアップ行を生成する方法について誰かが手掛かりを持っていますか?

<button type="submit" class="clearfix"><span>Login</span></button>

Drupal 8の場合、送信ボタンはになり<botton type="submit">ます。drupal.org/ node / 1671190を
Philipp Michael

回答:


12

D7では、次のことをお勧めします。

$form['custom-form'] = array(
  '#prefix' => '<button type="submit">',
  '#suffix' => '</button>',
  '#markup' => '<span>' . t('Login') . '</span>',
);

これにより、ボタンのHTMLを再構築することなく、必要に応じて後でalter関数の#markupを置き換えることができます。


このメソッドは自動競合をサポートしていません。
Peter Lozovitskiy

17

さらに、誰かが私と同じ問題に遭遇した場合に備えて- フォームのグループで#markupor #prefix/ #suffixトリックを使用する、type要素が存在しない限りactions、送信コールバック関数はまったく呼び出されませんsubmit。私の回避策はこのようなものでした:

$form['actions']['submit'] = array
(
    '#type' => 'submit',
    '#value' => '',
    '#attributes' => array( 'style' => array( 'display: none' )), // hide the input field
    '#submit' => array( 'my_callback_for_the_form_submit' ),
    '#prefix' => '<button type="submit" class="btn btn-primary">Add <i class="fa fa-plus-square-o">',
    '#suffix' => '</i></button>',
);

これにより、送信アクショングループにカスタムHTMLを使用できます。


これは、与えられた最良の回答でした...
Pratip Ghosh '30

5

カスタムタグを追加するには、次のスニペットを使用できます。

// Drupal 6.
$form = array();

// Other elements.

$form['custom-form'] = array(
    '#value' => '<button type="submit" class="clearfix"><span>Login</span></button>',
);
// Drupal 7.
$form = array();

// Other elements.

$form['custom-form'] = array(
    '#markup' => '<button type="submit" class="clearfix"><span>Login</span></button>',
);

これは実際に動作しませんでしたが、それは代わりに#VALUEの「#markup」をしようとしての私を手に入れた、とそのトリックをやりました。仲間に感謝します、感謝します。
stefgosselin

1
Drupalのバージョンについて知らされていません。#valueはDrupal6用です。#markupはDrupal 7で導入されました
Shoaib Nawaz

はい、友達、私の悪いです。私はバージョン番号に言及すべきでした。
stefgosselin

2

完全を期すために、オーバーライドを含む代替ソリューションを投稿しますtheme_buttonこのブログ投稿から取得)

まずbuttontype、フォーム要素に属性を追加します。

$form['submit'] = array (
    '#type' => 'submit',
    '#buttontype' => 'button',
    '#value' => 'Search',
);

そして、テーマボタンを上書きします:

/**
 * Override of theme_button().
 *
 * Render the button element as a button and the submit element as an input element.
 */
function MYTHEME_button($variables) {
  $element = $variables['element'];
  $element['#attributes']['type'] = 'submit';

  element_set_attributes($element, array('id', 'name', 'value'));  

  $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
  if (!empty($element['#attributes']['disabled'])) {
    $element['#attributes']['class'][] = 'form-button-disabled';
  }

  if (isset($element['#buttontype']) && $element['#buttontype'] == 'button') {
    $value = $element['#value'];
    unset($element['#attributes']['value']);
    return '<button' . drupal_attributes($element['#attributes']) . '>' . $value . '</button>';
  }
  else {
    return '<input' . drupal_attributes($element['#attributes']) . ' />';
  }
}

ただし、Drupalがどのボタンがクリックされたかを検出できないため、フォームに複数のボタンがある場合、これにより問題が発生します。

これは#after_build、フォームにコールバックを追加することで対処できます。

$form['#after_build'][] = 'mymodule_force_triggering_element';

その後、ビルド後の関数で:

function mymodule_force_triggering_element($form, &$form_state) {
  if (isset($form_state['input']['submit'])) {
    $form_state['triggering_element'] = $form['submit'];
  } elseif (isset($form_state['input']['other_button'])) {
    $form_state['triggering_element'] = $form['other_button'];
  }
  return $form;
}

1

オスカーゴメスアルカニスの回答を試しましたが、フォームがまだ送信されいません。回避策として、私は彼のソリューションを変更して、入力がボタンの上に配置されるようにしましたが、透過的になりました。

$form['actions']['submit'] = array (
    '#type' => 'submit',
    '#value' => '',
    '#attributes' => array( 'style' => 'position: absolute; left: 0; right: 0; top: 0; bottom: 0; border: none; opacity: 0; width: 100%;'), // put input field over the top of button and make transparent
    '#prefix' => '<button type="submit" class="btn btn-primary">Add <i class="fa fa-plus-square-o">',
    '#suffix' => '</i></button>',
);

このようにして、実際input[type="submit]のボタンがクリックされてアクションがトリガーされますが、ボタンは

おそらく、実際のCSSをすべてスタイルシートに配置することをお勧めしますが、ここでは例としてインラインスタイルタグを挿入します。


0

Drupal 8でこれを実現する方法を次に示します。基本的に、新しいテーマの提案を作成して、ボタンをカスタムtwigファイルで上書きできるようにします。

mythemename.themeファイル内に次のコードを追加します。

/**
 * Add twig suggestions for input elements.
 *
 * If a form api element has a data-twig-suggestion attribute, then allow twig
 * theme override, add to suggestions.
 *
 * @param array $suggestions
 *   Current list of twig suggestions.
 * @param array $variables
 *   Every variable of the current element.
 */
function mythemename_theme_suggestions_input_alter(&$suggestions, array $variables) {
  $element = $variables['element'];

  if (isset($element['#attributes']['data-twig-suggestion'])) {
    $suggestions[] = 'input__' . $element['#type'] . '__' . $element['#attributes']['data-twig-suggestion'];
  }
}

フォームを作成するコードのどこにでも、 'data-twig-suggestion'属性を送信ボタンに追加します。

$form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Submit') . ' >',
      '#attributes' => [
        'data-twig-suggestion' => 'button',
      ],
    ];

twigデバッグを有効にしていて、サイトでボタンのhtmlソースを確認すると、新しいtwig提案が表示されます。

<!-- FILE NAME SUGGESTIONS:
   * input--submit.html.twig
   * input--submit--button.html.twig
   x input.html.twig
-->

これで、input--submit--button.html.twigファイルを作成できます(これをmythemename / templates / form_elementsに配置しますが、必要に応じて他の場所に配置することもできます)。

<button{{ attributes }} type='submit'>
    <span class="great-success">Submit</span>
</button>

-3

より正しい方法は次のとおりです。

$form['submit'] = array(
  '#type' => 'button',
  '#value' => '<span>Login</span>',
);

次のような有効なHTMLが生成されます。

<button value="&lt;span&gt;Login&lt;/span&gt;" type="submit">
    <span>Login</span>
</button>

...そしてこの方法はオートコンプリートやその他の機能を妨げません。


1
<button>少なくともD7では、タグを返しません。theme_button()include / form.inc の最後の行はreturn '<input' . drupal_attributes($element['#attributes']) . ' />';
daniels

再確認していただけますか?作業中のカスタムモジュールからこのコードをコピーしました。
Peter Lozovitskiy

うまくいく場合は、カスタムテーマまたはモジュールのtheme_buttonをオーバーライドしたことを意味します。ダニエルズは正しいです。
Felix Eve

@FelixEve、正解です。カスタム関数のボタンをオーバーライドしました。カスタム関数なしでこれを行う他の方法はありますか?
Peter Lozovitskiy 2015年

このスレッドには、利用可能なすべてのメソッドの概要が含まれています。
Felix Eve
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.