После AJAX форма не сабмитается.

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

Аватар пользователя andrewbess andrewbess 28 ноября 2016 в 18:33

Ребята, добрый день.
Может кто-нибудь поможет.
Есть форма, в которой при вводе данных в текстовое поле обновляется дропдаун (select) посредством AJAX.
Все обновляется, только вот проблема не сабмитится данное поле.
Проходил по коду xDebug-ом и увидел что при моей валидации (а если бы ее не было) то при сабмите в свойствах (получаю $form_state->getValues()) данное поле - пустое, такое как при начальной форме.
Пробовал разными способами, но либо не проходит валидацию с фразой "An illegal choice has been detected. Please contact the site administrator." (из FormValidator), либо просто в этом поле пустое значение.
Вообще не понятно.
Пробовал как в родных модулях, но там все немного не так, как у меня.
Там не сабмитятся опциональные значения.
Может кто сталкивался с данной проблемой.
То что ищет ГУГЛ не подходит, т.к. там стандартные вещи написаны из книг или из старых версий друпала.
ПОМОГИТЕ!!!!

Комментарии

Аватар пользователя andrewbess andrewbess 3 декабря 2016 в 21:21

Ребята спасибо, что пытались помочь.
Вроде как разобрался.
У меня просто ситуация не совсем стандартная была.
У меня не SELECT меняет поля, а поле меняет опции SELECT. При этом валидатор ругается. Я писал об этом.
Получается что мне нужно было перестроить форму заново. (Это я понял после дэбагинга соответствующих методов).
Использую метод $this->getCompleteForm() в методе buildForm моей формы. В зависимости от ситуации (новая форма или переформированная AJAXом) меняю опции. И вуаля... Работает...
Получилось немного костыльно, но....
Если кому интересны подробности могу рассказать.
Если знаете более хороший вариант, давайте обсудим.

Аватар пользователя postgres postgres 5 декабря 2016 в 13:25

Понятно, ты делаешь autocomplete?
Если да, в друпале есть стандартный механизм, либо через ctools, либо через собственный колбэк...

Если через свой колбэк -
в модуле реализуеи hook_menu

<?php

$items

['options/autocomplete/%'] = array(
      
'page callback' => 'my_options_autocomplete',
      
'page arguments' => array(2),
      
'type' => MENU_CALLBACK,
  );
return 
$items;

function 

my_options_autocomplete($nodetype$text){
    
$titles db_select('node''n')
        ->
fields('n',array('nid','title'))
        ->
condition('type'$nodetype ,'=')
        ->
condition('title'"%$text%" ,'LIKE')
        ->
execute()
        ->
fetchAllKeyed();
    
$match = array();
    foreach(
$titles as $key=>$value){
          
$match["$value [id: $key]"] = '<span class="autocomplete_title">'.$value .'</span>';
 }   
   
drupal_json_output($match);
}

//в форме

$form['text_field_with_autocomplete'] = array(
        
'#type' => 'textfield',
        
'#size' => '100',
        
'#autocomplete_path' => 'options/autocomplete/' $my_node_type,  // например 'article'
        
'#description' => t('начинайте набор'),
        );

?>

Форму надо вызывать через get_form иначе ajax не подключится
либо включать его вручную

ctools_include('ajax'); в форме

Аватар пользователя postgres postgres 6 декабря 2016 в 10:33

Честно говоря не проверял до самых запятых Drupal 8 Form API. Вот врут или нет когда пишут, что движек 8 подобен Drupa 7? Подобен в смысле что возможности сохранены в полной мере (и расширены за счет поддержки HTML5).

Да, резевирование путей будет другим, но возможности автокомплита сохранены, что важно:
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Render%21...

Аватар пользователя andrewbess andrewbess 20 декабря 2016 в 9:21

В том то и дело что не очень он похож.
Я бы все таки перед тем как давать такой полный ответ, разобрался, а будет ли это работать.
Скажем так, $items['....'] уже не работает. Это заменено роутингами.
Как-то так.