Как сбросить значения поля ajax формы?

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

Аватар пользователя Balor Balor 11 мая 2018 в 13:37

Всем привет! Ребят помогите новичку, решил сделать форму поиска по каталогу.

<?php
public function buildForm(array $formFormStateInterface $form_state) {

       

$form['products_field'] = [
           
'#type'            => 'select',
           
'#options'        => $this -> getProductsFieldOptions(),
           
'#empty_option' => $this -> t('Select product'),
           
'#empty_value'    => 'non-selection',
           
'#ajax'            => [
               
'callback'    =>  '::brandChangeOptionsAjax',
               
'wrapper'    => 'brand-field-wrapper',
               
'progress'     => [
                   
'type'        => 'throbber',
                   
'message'    => null,
               ],
           ],
       ];

       

$form['brands_field'] = [
           
'#type'                => 'select',
           
'#options'            => $this -> getBrandFieldOptions($form_state),
           
'#empty_option'     => $this -> t('Select brand'),
           
'#empty_value'        => 'non-selection',
           
'#wrapper_attributes'    => [
               
'id'    => 'brand-field-wrapper'
           
],
           
'#ajax'            => [
               
'callback'    => '::modelChangeOptionsAjax',
               
'wrapper'    => 'model-field-wrapper',
               
'progress'    => [
                   
'type'        => 'throbber',
                   
'message'    => null,
               ],
           ],
       ];

       

$form['models_field'] = [
           
'#type'            => 'select',
           
'#options'        => $this -> getModelFieldOptions($form_state),
           
'#empty_option' => $this -> t('Select model'),
           
'#empty_value'    => 'non-selection',
           
'#wrapper_attributes' => [
               
'id'        => 'model-field-wrapper',
           ],        
       ];

       

$form['submit'] = [
          
'#type'         => 'submit',
          
'#value'        => $this -> t('Search'),
    ];

    return 

$form;
}

public function 

brandChangeOptionsAjax(array $formFormStateInterface $form_state) {
       return 
$form['brands_field'];
}

public function 

modelChangeOptionsAjax(array $formFormStateInterface $form_state) {
    return 
$form['models_field'];
}
    
/**
* Возвращает массив содержащий наименование продуктов каталога, 
* ключи массива tid термина таксономии,
* значения массива имена терминов таксономии.
return array
*/
public function getProductsFieldOptions() {

       

$options = [];
       
$taxonomy_terms $this -> getTaxonomyTerms();

       foreach(

$taxonomy_terms as $term) {
           
$options[$term->tid] = $term -> name;
       }

       return 

$options;
}
    
/**
* Возвращает массив содержащий название производителей продуктов, 
* ключи массива tid термина таксономии,
* значения массива имена терминов таксономии.
param Drupal\Core\Form\FormStateInterface $form_state
return array
*/
public function getBrandFieldOptions(FormStateInterface $form_state) {

    

$options = [];
    
$form_value $form_state -> getValue('products_field');

    if (

'non-selection' != $form_value) {
        
$taxonomy_terms $this -> getTaxonomyTerms($form_value);
        foreach(
$taxonomy_terms as $term) {
            
$options[$term -> tid] = $term -> name;
        }
    } else {
        
$options['no-result'] = $this -> t('No results');
    }

    return 

$options;
}
    
/**
* Так как название модели продукта уникально в каталоге, здесь мы не используем термины таксономии, 
* что бы не получить ссылку по сути являющейся ссылкой самой на себя (мне кажется это будет немного не правильным), 
* а используем значение скрытого поля данного типа материала. 
* ключи массива nid ноды, 
* значение указывает на модель продукта заданного производителя.
param Drupal\Core\Form\FormStateInterface $form_state
return array
*/
public function getModelFieldOptions(FormStateInterface $form_state) {

    

$options = [];
    
$form_value $form_state -> getValue('brands_field');

    if (

'non-selection' != $form_value) {
        
$query = \Drupal::database() -> query('SELECT nftt.entity_id, nfm.field_model_value FROM node__field_taxonomy_term nftt, node__field_model nfm, node_field_data nfd WHERE nftt.field_taxonomy_term_target_id = :id AND nftt.entity_id = nfd.nid AND nfd.status = 1 AND nfd.type = :type AND nfm.entity_id = nftt.entity_id', [':id' => $form_value':type' => 'products']);
        
$records $query -> fetchAll();

        foreach(

$records as $record => $rec) {
            
$options[$rec -> entity_id] = $rec -> field_model_value;
        }
    } else {
        
$options['non-result'] = $this -> t('No results');
    }

    return 

$options;
}
    
/**
* Возвращает массив объектов содержащих дочерние термины таксономии, первого уровня, 
* принадлежащие к переданному в метод идентификатору термина таксономии. 
param $taxonomy_id tid термина таксономии 
return array
*/
public function getTaxonomyTerms($taxonomy_id 0) {
    return 
$taxonomy_terms = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadTree('products'$taxonomy_id1);
}

/**
* {inheritdoc}.
*/
public function submitForm(array &$formFormStateInterface $form_state) {
           
    
$messenger = \Drupal::messenger();
       
$field_products_value $form_state -> getValue('products_field');
       
$field_brands_value $form_state -> getValue('brands_field');
       
$field_model_value $form_state -> getValue('models_field');
        
    
/**
    * Мы разрешаем выбрать только одно поле, и если выбраны не все поля, 
    * мы переадресовываем пользователя на страницу таксономии в зависимости от количества выбранных полей, 
    * страницу таксономии производители или страницу таксономии продукты.
    */
       
if ('non-selection' === $field_products_value) {
           
$messenger -> addMessage($this->t('Поле "Выберите продукт" обязательно для заполнения.'), 'error');
       } elseif (
'non-selection' != $field_products_value && 'non-selection' === $field_brands_value) {
           
$url Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $field_products_value]);
        return 
$form_state -> setRedirectUrl($url);
       } elseif (
'non-selection' != $field_products_value && 'non-selection' != $field_brands_value && 'non-selection' === $field_model_value) {
           
$url Url::fromRoute('entity.taxonomy_term.canonical', ['taxonomy_term' => $field_brands_value]);
        return 
$form_state -> setRedirectUrl($url);
       } elseif (
'non-selection' != $field_products_value && 'non-selection' != $field_brands_value && 'non-selection' != $field_model_value){
           
$url Url::fromRoute('entity.node.canonical', ['node' => $field_model_value]);
        return 
$form_state -> setRedirectUrl($url);
       }
}
?>

Вопрос, как сбросить значение поля если пользователь с начала выберет все поля формы, а потом передумает и начнет все с начала. В этом случае значение второго поля изменится автоматический, а вот значение последнего поля останется прежним, а мне бы хотелось что бы оно сбрасывалось.