2017-02-07 12 views
0

を作業していて、フォームにその動作していないを変更されていない変更します。の$ 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

答えて

0

.moduleファイルのform_alterに適用するために私のアイデアを提案し、クラスではありませんので、この何の$はありません。しかし、あなたのカスタムフォームはクラスです(通常your_module/src/Form/YourForm.phpにあります)。そのため、そこでは動作しますが、.moduleファイルでは動作しません。

深い読み:私は強くは、いくつかのリファクタリングを行うことをお勧めしますう:あなただけのサイドノートで

'#options' => getOptions($form, $form_state), 

などを呼び出すことができる必要があり、あなたの場合はhttp://www.php.net/manual/en/language.oop5.basic.phpWhat does the variable $this mean in PHP?

+0

($ cvvv = $ form_state-> getValue( 'field_nametrain');)あなたの提案を使用して空の値を返す( '#options' => getOptions($ form、$ form_state) –

+0

関数getOptionsが呼び出されます。 **フォーム**をレンダリングする前にも**空であることは普通ですので、最初のフィールドに応じて2番目のフィールドに異なるオプションを表示しようとしていますか?選択フィールドのすべての変更のアヤックス。私はあなたがレンダリングの前に完全な選択リストを構築し、JS/CSSを介してクライアント側で表示/隠しを扱うお勧めします。そして、誰かがブラウザコンソールでオプションをハッキングした場合でも、あなたはまだすることができバックエンドでそれらを検証する。 –

+0

あなたが正しいです。私は2つのコンテンツタイプを入力のための1つを使用しています(値を保存)し、別のフォームが選択リストとしての価値をもたらしている。最初のフィールドENTITY_IDのコンディットイオンセットは第2のフィールドに依存する。 drupal 8 form alter ajaxのリンクの例を教えてもらえますか? –

関連する問題