Drupal 8表单改变了ajax回调不起作用

问题描述 投票:0回答:2

我正在以正常的自定义形式获取我的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;
   }

在使用$ this-> getOptions($ form_state)时,它表示错误日志,它不是对象,并在前端引发网站遇到错误。但在自定义表单上没有错误只出现在形式中它会引发错误。

请建议我在Drupal 8的form_alter中应用的想法

ajax drupal drupal-modules
2个回答
0
投票

表单alter hook所在的.module文件不是类,因此没有$ this。然而,您的自定义表单是一个类(通常在your_module / src / Form / YourForm.php中),这就是它在那里工作但不在.module文件中的原因。

进一步阅读:http://www.php.net/manual/en/language.oop5.basic.phpWhat does the variable $this mean in PHP?

在你的情况下,你应该可以打电话

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

还有更多的旁注:我强烈建议做一些代码重构。


0
投票

在自定义提交处理程序中,firt从表单状态获取表单对象。

$formObj = $formState->getFormObject();

然后在表单对象上调用submitForm()并传递表单并形成状态变量。

$formObj->submitForm($form, $formState);

最后,你只需要在对象上触发save()函数。

$formObj->save($form, $formState);

所以整个解决方案都是这样的

function YOR_CUSTOM_SUBMIT_HANLDLER(array $form, FormStateInterface $form_state) {
  /** @var Drupal\user\RegisterForm $entity */
      $formObj = $form_state->getFormObject();
      $formObj->submitForm($form, $form_state);
      $formObj->save($form, $form_state);
}
© www.soinside.com 2019 - 2024. All rights reserved.