テーマに検索ブロックをいくつか追加し、それぞれをカスタムの場所に配置しました。
この目的で 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';
}
最初に行うことは、カスタム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で使用できるようになります。