web-dev-qa-db-ja.com

検索ブロックフォームIDを見つけるにはどうすればよいですか?

テーマに検索ブロックをいくつか追加し、それぞれをカスタムの場所に配置しました。
この目的で function hook_form_FORM_ID_alter を使用して各テーマを編集したいと思います。

グローバルなhook_form_alter()の代わりにフォーム固有の変更を提供します。

モジュールは、hook_form_alter()を実装してフォームIDをチェックしたり、長いswitchステートメントを使用して複数のフォームを変更したりする代わりに、hook_form_FORM_ID_alter()を実装して特定のフォームを変更できます。

各検索ブロックフォームIDを見つけるにはどうすればよいですか? ThemeName_form_search_block_form_alter()でそれらを編集して、それぞれに特別なクラスを追加するにはどうすればよいですか?

この目的のために Devel モジュールを使用しましたが、Develモジュールでは、これらのすべてのフォームが同じID(search_block_form)を持っているようです。

これは私が使用したコードです。

function ThemeName_form_search_block_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message(kint($form));
  $form['keys']['#attributes']['placeholder'][] = t('Search');
  $form['actions']['submit']['#attributes']['class'][] = 'my-class';
}
4
Mojtaba Reyhani

最初に行うことは、カスタムIDを指定できるようにSearchBlockFormを拡張することです。コードをmymodule/src/Form/MymoduleSearchBlockForm.phpに入れます

namespace Drupal\mymodule\Form;

use Drupal\search\Form\SearchBlockForm;

class MymoduleSearchBlockForm extends SearchBlockForm
{
  protected $formIdentifier;

  public function setFormIdentifier($formIdentifier)
  {
      $this->formIdentifier = $formIdentifier;
  }

  public function getFormId()
  {
    $form_id = 'search_block_form';
    if($this->formIdentifier)
    {
        $form_id .= '-' . $this->formIdentifier;
    }
    return $form_id;
  }
}

次に、次のようにフォームを呼び出すことができます。

$form = \Drupal::service('class_resolver')->getInstanceFromDefinition('Drupal\mymodule\Form\Mymodule\SearchBlockForm');
$form->setFormIdentifier('some_custom_value');

return \Drupal::formBuilder()->getForm($form);

ここのコードの重要な行はこれです:

$form->setFormIdentifier('some_custom_value');

フォームを生成するたびに異なる値を渡すと、各フォームは異なるフォームIDを取得します。フォームIDは次のようになります。

search_block_form-some_custom_value

その後、$ form_idがsearch_block_form-some_custom_valueのhook_form_alterで使用できるようになります。

4
Jaypan