このフィールドを含むカスタムフォームがあります。
$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
のフィールドが間違っている可能性があります。 (管理UIで分類法を見ると、マシン名は実際にはstad
です)。
このエラーは、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;
}
}
フィールドで許可されている語彙を収集しています。以下を確認してください。
これは検証なしで機能し、UIを使用して分類フィールドのマシン名を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編集 。