web-dev-qa-db-ja.com

分類オートコンプリートウィジェットを含むフォームが送信時にエラーをスローする: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のフィールドが間違っている可能性があります。 (管理UIで分類法を見ると、マシン名は実際にはstadです)。

3
FLY

このエラーは、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. フィールドには、許可された語彙セットが少なくとも1つあります
  3. field_cityは、問題のフィールドの正しいマシン名です
0
TCLopez

これは検証なしで機能し、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編集

0
kenorb