Buat template fieldset kustom
Skenario normal
Dalam formulir kustom (dibuat menggunakan FAPI) saya memiliki definisi fieldset:
$company_field_set = [
'#type' => 'fieldset',
];
Jika saya ingin menyesuaikan template fieldset, saya biasanya akan membuat hook_theme_suggestions_HOOK_alterfungsi untuk menambahkan saran dan kemudian menimpa template tersebut.
Alternatif
Saya bertanya-tanya mengapa saya tidak hanya menggunakan #themekunci, jadi saya mencoba ini:
$company_field_set = [
'#type' => 'fieldset',
'#theme' => 'my_custom_company_fieldset',
];
Ini memang membuat template kustom saya, bukan fieldset.html.twig, tetapi saya tidak mendapatkan variabel apa pun di dalamnya. Saya mengharapkannya untuk berperilaku seperti fieldset.html.twig.
Saya telah mencoba beberapa definisi tema:
// Same as default fieldset
'my_custom_company_fieldset' => [
'render element' => 'element',
]
// Another tryout
'my_custom_company_fieldset' => [
'render element' => 'children',
]
Template saya saat ini terlihat seperti ini:
{% extends 'fieldset.html.twig' %}
Saya juga mencoba:
{{ children }}
Saya melihat konten template (seperti teks statis dan semacamnya), tetapi tidak ada variabel.
Saya rasa saya tahu sedikit tentang ini dan saya melewatkan sesuatu di suatu tempat. Adakah yang bisa menunjukkan kesalahan saya dan / atau memberi tahu saya apakah ini mungkin atau tidak?
Jawaban
Setelah melihat lebih dalam tentang inti Drupal, saya menemukan bahwa dalam kasus ini saya tidak boleh menimpa #theme, melainkan menggunakan #theme_wrappers.
Jadi definisi tema saya:
function mymodule_theme($existing, $type, $theme, $path) {
return [
'my_custom_fieldset' => [
'render element' => 'children',
],
];
}
Dalam bentuk saya:
$form['some_fieldset'] = [ '#type' => 'fieldset', '#title' => 'Some title', '#theme_wrappers' => ['my_custom_fieldset'], ]; $form['some_fieldset']['some_field1'] = [
'#type' => 'textfield',
'#title' => 'Some title',
];
$form['some_fieldset']['some_field2'] = [
'#type' => 'textfield',
'#title' => 'Another title',
];
Dan kemudian template saya my-custom-fieldset.html.twig:
<fieldset>{{children}}</fieldset>
Atau misalnya:
<fieldset>
{{ children.some_field1 }}
Some customization here
{{ children.some_field2 }}
Something custom here
</fieldset>
Solusi Normal (mudah).
/*
* Implements hook_theme_suggestions_HOOK_alter()
*/
function journey_talk_theme_suggestions_fieldset_alter(array &$suggestions, array $variables) {
$suggestions[] = 'fieldset__' . $variables['element']['#parents'][0];
}
Solusi Alternatif (bisa dilakukan, tidak disarankan, Anda akan bekerja lebih keras).
Pertama, Anda perlu mendeklarasikan tema dan nama variabel di hook_theme ()
function mymodule_theme($existing, $type, $theme, $path) {
return [
'my_custom_company_fieldset' => [
'variables' => ['my_var' => null],
],
];
}
Kedua, Anda menyetel nilai variabel tempat Anda menetapkan #theme (ATAU juga dalam fungsi preprocess)
$form['book']['title'] = [ '#type' => 'textfield', '#title' => $this->t('Title'),
];
$form['book']['publisher'] = [ '#type' => 'textfield', '#title' => $this->t('Publisher'),
];
// You have to put your fieldset after your fields, otherwise they won't be inside $form['book']; $form['book'] = [
'#type' => 'fieldset',
'#title' => $this->t('Book Info (type = fieldset)'), '#theme' => 'my_custom_company_fieldset', '#my_var' => $form['book'], // setting a value for the "my_var" variable declared in hook_theme()
];
dan di ranting Anda dapat membuat bidang dengan
{{ my_var.title }}
{{ my_var.publisher }}
Tetapi kelemahan dari pendekatan ini adalah Anda tidak dapat mengakses semua variabel yang ada yang tersedia di fieldset.html.twig. Meskipun, Anda pada akhirnya bisa mendapatkan akses ke nilai-nilai tersebut melalui pohon variabel (my_var) Anda.
Anda tahu apa yang dikatakan, bekerja lebih cerdas, bukan lebih keras! Jadi, solusi normal adalah jalan yang harus ditempuh.