を作業していて、フォームにその動作していないを変更されていない変更します。の$ this - を使用してオンDrupalの8フォームはAJAXコールバックが、私は通常のカスタムフォームでの私のAJAXコールバックを取得しています
function sample_ajax_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
if ($form_id === 'node_sampleajax_form' || $form_id === 'node_sampleajax_edit_form') {
$form['field_nametrain']= array(
'#title' => t('training name'),
'#type' => 'select',
'#options' => _load_training(),
'#required' => FALSE,
'#ajax' => [
'callback' => [$this, 'changeOptionsAjax'],
// 'callback' => '::changeOptionsAjax',
'wrapper' => 'second_field_wrapper',
],
);
$form['field_namedomain'] = [
'#type' => 'select',
'#title' => t('Domain program'),
'#options' => $this->getOptions($form_state),
'#prefix' => '<div id="second_field_wrapper">',
'#suffix' => '</div>',
];
return $form;
}
}
function _load_training() {
$training = array('- Select domain training -');
$query = db_select("node__field_trainingname", "a");
$query->fields("a", array('field_trainingname_value', 'entity_id'));
$query->orderBy("a.field_trainingname_value");
$result = $query->execute();
while($row = $result->fetchObject()){
$training[$row->entity_id] = $row->field_trainingname_value;
}
return $training;
}
function changeOptionsAjax(array &$form, FormStateInterface $form_state) {
return $form['field_namedomain'];
}
function getOptions(array &$form, FormStateInterface $form_state) {
$cvvv = $form_state->getValue('field_nametrain');
<!-- return ["shgsh", $form_state->get(['field_nametrain'])]; -->
$options = array('- Select subdomain category -');
$query = db_select("node__field_trainingname", "a");
$query->fields("a", array('field_trainingname_value', 'entity_id'));
$query = db_select("node__field_cms", "b");
$query->fields("b", array('field_cms_value', 'entity_id'));
$query->join("node__field_trainingname", "b", "b.entity_id=a.entity_id");
$query->condition("a.entity_id", $cvvv);
$result = $query->execute();
while($row = $result->fetchObject()){
$options[$row->entity_id] = $row->field_cms_value;
}
return $options;
}
> GETOPTIONS($ form_state)それはオブジェクトではありませんし、フロントエンドでウェブサイトの出会いエラーをスローエラー・ログを表します。しかし、カスタムフォームではエラーが発生しませんでした。
が親切にフォームが配置されているフックを変えるのDrupal 8
($ cvvv = $ form_state-> getValue( 'field_nametrain');)あなたの提案を使用して空の値を返す( '#options' => getOptions($ form、$ form_state) –
関数getOptionsが呼び出されます。 **フォーム**をレンダリングする前にも**空であることは普通ですので、最初のフィールドに応じて2番目のフィールドに異なるオプションを表示しようとしていますか?選択フィールドのすべての変更のアヤックス。私はあなたがレンダリングの前に完全な選択リストを構築し、JS/CSSを介してクライアント側で表示/隠しを扱うお勧めします。そして、誰かがブラウザコンソールでオプションをハッキングした場合でも、あなたはまだすることができバックエンドでそれらを検証する。 –
あなたが正しいです。私は2つのコンテンツタイプを入力のための1つを使用しています(値を保存)し、別のフォームが選択リストとしての価値をもたらしている。最初のフィールドENTITY_IDのコンディットイオンセットは第2のフィールドに依存する。 drupal 8 form alter ajaxのリンクの例を教えてもらえますか? –