无法从自定义 Drupal 8 Webform Handler 中的 $form_state 获取值

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

我正在 Drupal 8 中工作,正在构建一个自定义 WebformHandler。我有一个带有 ajax 组件的元素。我似乎无法通过 ajax 回调中的

$form_state->getValue('key')
访问任何表单值(也无法在任何地方访问)。我已经用头撞墙有一段时间了。

我遵循了互联网上可以找到的所有指南,但没有成功。下面提供了我的代码。

<?php

namespace Drupal\campaign_monitor_transactional\Plugin\WebformHandler;

use Drupal\Core\Form\FormStateInterface;
use Drupal\samlauth\Element\MultiValue;
use Drupal\webform\Plugin\WebformHandlerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Test Campaign Monitor webform handler
 *
 * @WebformHandler(
 *   id = "campaign_monitor_transactional",
 *   label = @Translation("Campaign Montior Transactional"),
 *   category = @Translation("Campaign Monitor"),
 *   description = @Translation("Trigger Campaign Monitor Transaction Emails"),
 *   cardinality = \Drupal\webform\Plugin\WebformHandlerInterface::CARDINALITY_UNLIMITED,
 *   results = \Drupal\webform\Plugin\WebformHandlerInterface::RESULTS_PROCESSED,
 *
 * )
 */
class TransactionalWebformHandler extends WebformHandlerBase {
  /**
   * Logger service
   *
   * @var \Drupal\Core\Logger\LoggerChannelFactory
   */
  protected $loggerFactory;

  /**
   * The Campaign Monitor RESTCLient
   *
   * @var \Drupal\CampaignMonitorRestClientFactory
   */
  protected $campaignMonitorRESTClient;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition)
  {
    $instance = parent::create(
      $container,
      $configuration,
      $plugin_id,
      $plugin_definition
    );

    // TODO webform_campaign_monitor may not be correct
    $instance->loggerFactory = $container
             ->get('logger.factory')
             ->get('webform_campaign_monitor');

    $instance->campaignMonitorRESTClient = $container
             ->get('campaign_monitor_rest_client');

    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state)
  {

    // Campaign monitor settings
    $form['template_settings'] = [
      '#type' => 'details',
      '#title' => $this->t('Template settings'),
      '#open' => TRUE
    ];

    # I am just using this for testing purposes
    $form['example_select'] = [
      '#type' => 'select',
      '#title' => $this->t('Select element'),
      '#options' => [
        '1' => $this->t('One'),
        '2' => $this->t('Two'),
        '3' => $this->t('Three'),
      ]
    ];

    $form['template_settings']['email_template'] = [
      '#type' => 'select',
      '#title' => $this->t('Email Template'),
      '#options' => $this->getTransactionEmailOptions(),
      '#ajax' => [
        'callback' => [$this, 'fetchParamsCallback'],
        'wrapper' => 'cm-param-textarea',
        'progress' => [
          'type' => 'throbber',
          'message' => $this->t('Loading params...')
        ]
      ]
    ];

    $form['template_settings']['params'] = [
      '#type' => 'textarea',
      '#title' => $this->t('Campaign Monitor Params'),
      '#disabled' => True,
      '#prefix' => '<div id="cm-param-textarea">',
      '#suffix' => '</div>'
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state)
  {
    parent::submitConfigurationForm($form, $form_state);
    $this->applyFormStateToConfiguration($form_state);
  }

  /**
   * Loads Campaign Monitor params based on selected email template
   */
  public function fetchParamsCallback(array &$form, FormStateInterface $form_state)
  {

    $smart_email_id = $form_state->getValue('example_select');
    ### ISSUE IS HERE.... $SMART_EMAIL_ID is blank

    return  [
      '#type' => 'textfield',
      '#size' => '60',
      '#disabled' => TRUE,
      '#value' => 'SEI: ' . $smart_email_id,
      '#prefix' => '<div id="edit-output">',
      '#suffix' => '</div>',
    ];
  }

  /**
   * Helper function producing sender dropdown options
   * @return array
   *   Options for sender dropdown
   */
  protected function getSenderOptions()
  {
    return array(
      'you' => 'Your Email',
      'custom' => 'Custom email address(es)',
      'author' => 'Webform author',
      'none' => 'None'
    );
  }


  /**
   * Helper function to fetch all active transactional emails
   *
   * @return array
   *   Options for transactional email dropdown
   */
  protected function getTransactionEmailOptions()
  {
    $options = array();
    # TODO client ID should not be hard coded
    $clientID = 'XXX';
    $params = [
      'query' => [
        'status' => 'all',
        'clientID' => $clientID
      ]
    ];

    $email_templates = $this->campaignMonitorRESTClient
      ->get('transactional/smartEmail', $params)
      ->getBody()
      ->getContents();

    foreach(json_decode($email_templates) as $template) {
      $options[$template->ID] = $template->Name;
    }

    return $options;
  }
}
php ajax drupal
1个回答
0
投票

$form_state->getValue()
返回特定键的已提交表单值。

要获取所需的信息,您需要调试

$form_state
以获取存储所需信息的正确密钥。

然后阅读如下信息:

$form_state->getValue(['your-key'])

© www.soinside.com 2019 - 2024. All rights reserved.