Всем привет! Ребят помогите новичку, решил сделать форму поиска по каталогу.
<?php
public function buildForm(array $form, FormStateInterface $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 $form, FormStateInterface $form_state) {
return $form['brands_field'];
}
public function
modelChangeOptionsAjax(array $form, FormStateInterface $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_id, 1);
}
/**
* {inheritdoc}.
*/
public function submitForm(array &$form, FormStateInterface $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);
}
}
?>
Вопрос, как сбросить значение поля если пользователь с начала выберет все поля формы, а потом передумает и начнет все с начала. В этом случае значение второго поля изменится автоматический, а вот значение последнего поля останется прежним, а мне бы хотелось что бы оно сбрасывалось.