форма с виджетом автозаполнения таксономии выдает ошибку при отправке: Неверный аргумент, указанный для foreach()


У меня есть пользовательская форма с этим полем в ней:

$form['first']['field_city'] = array(
    '#title' => t('Woonplaats'),
    '#type' => 'textfield',
    '#size' => 25,
    '#autocomplete_path' => 'taxonomy/autocomplete/field_city',
    '#element_validate' => array('taxonomy_autocomplete_validate'),
    '#required' => TRUE,
);

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

Warning: Invalid argument supplied for foreach() in taxonomy_autocomplete_validate()

В результате этой ошибки и wsod (белый экран смерти)

   PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '))' at line 2: 
SELECT base.tid AS tid, base.vid AS vid, base.name AS name, base.description AS description, base.format AS format, base.weight AS weight, v.machine_name AS vocabulary_machine_name FROM {taxonomy_term_data} base INNER JOIN {taxonomy_vocabulary} v ON base.vid = v.vid WHERE (base.name LIKE :db_condition_placeholder_0 ESCAPE '\\') AND (base.vid IN ()) ; Array ( [:db_condition_placeholder_0] => Amsterdam )

Я думаю, что я что-то упустил в декларировании формы или где-то ошибся. Так что же что-то не так с этим? Спасибо!

Некоторые предполагают, что machine_name поля может быть неправильным. (имя машины на самом деле stad, когда я смотрю в таксономию в пользовательском интерфейсе администратора).

Author: kiamlaluno, 2012-04-27

2 answers

Я почти уверен, что эта ошибка будет исходить из следующего цикла в taxonomy_autocomplete_validate()

 // Collect candidate vocabularies.
    $field = field_widget_field($element, $form_state);
    $vocabularies = array();
    foreach ($field['settings']['allowed_values'] as $tree) {
      if ($vocabulary = taxonomy_vocabulary_machine_name_load($tree['vocabulary'])) {
        $vocabularies[$vocabulary->vid] = $vocabulary;
      }
    }

Который собирает словари, разрешенные для этого поля, проверьте:

  1. Поле задано как ссылка на термин
  2. Поле содержит по крайней мере один допустимый набор слов
  3. field_city - правильное имя машины для рассматриваемого поля
 0
Author: TCLopez, 2012-04-27 14:15:39

Он работает без проверки, а также путем изменения имени машины поля таксономии с помощью пользовательского интерфейса с stad на field_city:

$voca = taxonomy_vocabulary_machine_name_load('field_city');
$form['first']['field_city'][$voca->vid] = array(
    '#type' => 'textfield',
    '#title' => $voca->name,
    '#required' => TRUE,
    '#field_name' => $voca->machine_name,
    // '#language' => 'nl',
    // '#field_parents' => array($voca->machine_name),
    // '#element_validate' => array('taxonomy_autocomplete_validate'),
    // '#default_value' => 'test_default_value',
    '#autocomplete_path' => 'taxonomy/autocomplete/' . $voca->machine_name,
    '#size' => 25,
);

Также удаление #element_validate предотвращает отображение ошибки, поэтому, я думаю, мне придется написать пользовательскую проверку, чтобы она действительно исправила ее.

Источник: OP редактировать.

 0
Author: kenorb, 2017-04-13 12:47:02