Почему блок вьюшки не отрендерился под поисковым полем формы?

Главные вкладки

Аватар пользователя nathan158 nathan158 14 июля 2022 в 0:56

Я создал блок на основе вьюшки с машинным именем 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 $formFormStateInterface $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 &$formFormStateInterface $form_state) {
    
$args $form_state->getValue('search_field');
    
$this->someMethod($args);
  }

}

?>

Но блок не отрендерился.

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 14 июля 2022 в 4:54
1

Он отрендерился, но вы же ничего не возвращаете из ::submitForm() и ничего не меняете в $form. Следовательно, build-структура формы остаётся неизменной. Если была хотя бы такая попытка:

<?php
public function submitForm(array &$formFormStateInterface $form_state) {
    ...
    
$form['my_view'] = $this->someMethod($args);
    
$form_state->setRebuild(TRUE); // Или наоборот FALSE, уже не помню.
  

?>

то, возможно, что-то бы получилось.

Но, честно говоря, вся ваша конструкция выглядит сомнительной.
Я бы сделал иначе.

1. Вывод представления лучше делать в методе ::buildForm(). Ваш кастомный метод ::someMethod() вообще не нужен. Но получаем переданные из submit-функции аргументы из $form_state:

<?php
public function buildForm(array $formFormStateInterface $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 &$formFormStateInterface $form_state) {
    
$args $form_state->getValue('search_field');
    
$form_state->set('view_args'$args);
    
$form_state->setRebuild(TRUE); // Может и не понадобится.
  
}
?>

3. Бинго.

Комментарии

Аватар пользователя OldWarrior OldWarrior 14 июля 2022 в 4:54
1

Он отрендерился, но вы же ничего не возвращаете из ::submitForm() и ничего не меняете в $form. Следовательно, build-структура формы остаётся неизменной. Если была хотя бы такая попытка:

<?php
public function submitForm(array &$formFormStateInterface $form_state) {
    ...
    
$form['my_view'] = $this->someMethod($args);
    
$form_state->setRebuild(TRUE); // Или наоборот FALSE, уже не помню.
  

?>

то, возможно, что-то бы получилось.

Но, честно говоря, вся ваша конструкция выглядит сомнительной.
Я бы сделал иначе.

1. Вывод представления лучше делать в методе ::buildForm(). Ваш кастомный метод ::someMethod() вообще не нужен. Но получаем переданные из submit-функции аргументы из $form_state:

<?php
public function buildForm(array $formFormStateInterface $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 &$formFormStateInterface $form_state) {
    
$args $form_state->getValue('search_field');
    
$form_state->set('view_args'$args);
    
$form_state->setRebuild(TRUE); // Может и не понадобится.
  
}
?>

3. Бинго.