Я создал блок на основе вьюшки с машинным именем search_entity_product_block:
Потом я создал кастомную форму с методом someMethod
который должен рендерить блок вьюшки под поисковым полем:
<?php
class SearchFieldForm extends FormBase {
public function
getFormId() {
return 'entity_product_admin_search_field';
}
public function
someMethod($args) {
$view = [
'#type' => 'view',
'#name' => 'search_entity_product',
'#display_id' => 'search_entity_product_block',
'#arguments' => $args,
'#embed' => TRUE,
];
return
$view;
}
public function
buildForm(array $form, FormStateInterface $form_state) {
$form['search_field'] = [
'#type' => 'textfield',
'#title' => $this->t('Search Product'),
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
return
$form;
}
public function
submitForm(array &$form, FormStateInterface $form_state) {
$args = $form_state->getValue('search_field');
$this->someMethod($args);
}
}
?>
Но блок не отрендерился.
Комментарии
Он отрендерился, но вы же ничего не возвращаете из
::submitForm()
и ничего не меняете в$form
. Следовательно, build-структура формы остаётся неизменной. Если была хотя бы такая попытка:<?php
public function submitForm(array &$form, FormStateInterface $form_state) {
...
$form['my_view'] = $this->someMethod($args);
$form_state->setRebuild(TRUE); // Или наоборот FALSE, уже не помню.
}
?>
то, возможно, что-то бы получилось.
Но, честно говоря, вся ваша конструкция выглядит сомнительной.
Я бы сделал иначе.
1. Вывод представления лучше делать в методе
::buildForm()
. Ваш кастомный метод::someMethod()
вообще не нужен. Но получаем переданные из submit-функции аргументы из$form_state
:<?php
public function buildForm(array $form, FormStateInterface $form_state) {
$form['search_field'] = [
'#type' => 'textfield',
'#title' => $this->t('Search Product'),
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Save'),
];
$form['my_view'] = [
'#type' => 'view',
'#name' => 'search_entity_product',
'#display_id' => 'search_entity_product_block',
'#arguments' => $form_state->get('view_args'), // здесь читаем аргументы из сабмита
'#access' => (bool) $form_state->get('view_args'), // здесь скрываем view, если аргументов из сабмита ещё нет
'#embed' => TRUE,
];
return
$form;}
?>
2. В submit-функции просто сохраняем в
$form_state
значение из'search_field'
для использования в::buildForm()
выше.<?php
public function submitForm(array &$form, FormStateInterface $form_state) {
$args = $form_state->getValue('search_field');
$form_state->set('view_args', $args);
$form_state->setRebuild(TRUE); // Может и не понадобится.
}
?>
3. Бинго.