форма с виджетом автозаполнения таксономии выдает ошибку при отправке: Неверный аргумент, указанный для 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
, когда я смотрю в таксономию в пользовательском интерфейсе администратора).
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;
}
}
Который собирает словари, разрешенные для этого поля, проверьте:
- Поле задано как ссылка на термин
- Поле содержит по крайней мере один допустимый набор слов
- field_city - правильное имя машины для рассматриваемого поля
Он работает без проверки, а также путем изменения имени машины поля таксономии с помощью пользовательского интерфейса с 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 редактировать.