我正在 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;
}
}
$form_state->getValue()
返回特定键的已提交表单值。
要获取所需的信息,您需要调试
$form_state
以获取存储所需信息的正确密钥。
然后阅读如下信息:
$form_state->getValue(['your-key'])