2017-02-07 1 views
0

정상적인 사용자 정의 양식으로 제 아약스 콜백을 받고 있지만 양식에서 작동하지 않는 것으로 변경되었습니다. $ this-> getOptions ($ form_state)는 에러를 나타내는 로그를 사용하여Drupal 8 양식 변경 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; 
    } 

개체 아니며 선단에서 웹 사이트의 상대 오차를 던진다. 하지만 사용자 정의 양식에서는 오류가 발생하여 formter에서만 오류가 발생합니다.

이 친절 양식가 위치한 후크를 변경 드루팔 8

답변

0

.module 파일의 form_alter에 적용하는 나에게 아이디어를 제안, 클래스 아니며, 따라서이 더 $ 없다. 그러나 사용자 정의 양식은 클래스 (일반적으로 your_module/src/Form/YourForm.php에 있음)이므로 .module 파일에서는 작동하지 않습니다.

추가 읽기 : http://www.php.net/manual/en/language.oop5.basic.php 귀하의 경우 What does the variable $this mean in PHP?

그냥 보조 노트에

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

등을 호출 할 수 있어야한다 : 나는 강하게 몇 가지 리팩토링을 수행하는 것이 좋습니다 .

+0

($ cvvv = $ form_state-> getValue ('field_nametrain');) 제안을 사용할 때 빈 값 ('#options'=> getOptions ($ form, $ form_state)을 반환합니다. –

+0

함수 getOptions가 호출됩니다. ** ** 폼을 렌더링하기도 전에 비어있는 것은 정상입니다. 첫 번째 필드에 따라 두 번째 필드의 옵션을 다르게 표시하려고합니다. 그렇지 않습니까? 다음을 통해 데이터베이스를 쿼리하는 좋은 해결책이 아닌 것 같습니다. 선택 필드의 모든 변경 Ajax. 렌더링하기 전에 전체 선택 목록을 작성하고 JS/CSS를 통해 클라이언트 측에서 숨기기/표시를 처리하는 것이 좋습니다. 그리고 누군가 브라우저 콘솔에서 옵션을 해킹했다하더라도 여전히 백엔드에서 유효성을 검사하십시오. –

+0

맞습니다. 입력에 두 개의 내용 유형 (값 저장)을 사용하고 있고 다른 양식이 선택 목록으로 값을 가져오고 있습니다. 첫 번째 필드 entity_id condit 이온 세트는 제 2 필드에 의존한다. drupal 8 form alter ajax에 대한 예제 링크를 제안 해 주시겠습니까? –

관련 문제