View source
<?php
namespace Drupal\synonyms\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityTypeBundleInfoInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\SubformState;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Drupal\synonyms\ProviderPluginManager;
class SynonymForm extends EntityForm {
protected $entity;
protected $entityTypeManager;
protected $entityTypeBundleInfo;
protected $synonymsProviderPluginManager;
protected $controlledEntityType;
protected $controlledBundle;
protected $container;
public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityTypeBundleInfoInterface $entity_type_bundle_info, ProviderPluginManager $synonyms_provider_plugin_manager, ContainerInterface $container) {
$this->entityTypeManager = $entity_type_manager;
$this->entityTypeBundleInfo = $entity_type_bundle_info;
$this->synonymsProviderPluginManager = $synonyms_provider_plugin_manager;
$this->container = $container;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('entity_type.manager'), $container
->get('entity_type.bundle.info'), $container
->get('plugin.manager.synonyms_provider'), $container);
}
protected function init(FormStateInterface $form_state) {
parent::init($form_state);
if ($this->entity
->isNew()) {
$this->controlledEntityType = $this
->getRequest()
->get('synonyms_entity_type')
->id();
$this->controlledBundle = $this
->getRequest()
->get('bundle');
}
else {
$plugin_definition = $this->entity
->getProviderPluginInstance()
->getPluginDefinition();
$this->controlledEntityType = $plugin_definition['controlled_entity_type'];
$this->controlledBundle = $plugin_definition['controlled_bundle'];
}
}
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$class = get_class($this);
$provider_plugin = $this->entity
->getProviderPlugin();
if ($form_state
->getValue('provider_plugin')) {
$provider_plugin = $form_state
->getValue('provider_plugin');
}
$form['id'] = [
'#type' => 'value',
'#value' => str_replace(':', '.', $provider_plugin),
];
$options = [];
foreach ($this->synonymsProviderPluginManager
->getDefinitions() as $plugin_id => $plugin) {
if ($plugin['controlled_entity_type'] == $this->controlledEntityType && $plugin['controlled_bundle'] == $this->controlledBundle) {
$options[$plugin_id] = $plugin['label'];
}
}
$form['provider_plugin'] = [
'#type' => 'select',
'#title' => $this
->t('Synonyms provider'),
'#description' => $this
->t('Select what synonyms provider it should represent.'),
'#required' => TRUE,
'#options' => $options,
'#default_value' => $this->entity
->getProviderPlugin(),
'#ajax' => [
'wrapper' => 'synonyms-entity-configuration-ajax-wrapper',
'event' => 'change',
'callback' => [
$class,
'ajaxForm',
],
],
];
$form['ajax_wrapper'] = [
'#prefix' => '<div id="synonyms-entity-configuration-ajax-wrapper">',
'#suffix' => '</div>',
];
$form['ajax_wrapper']['provider_configuration'] = [
'#tree' => TRUE,
'#title' => $this
->t('Provider settings'),
'#open' => TRUE,
];
if ($provider_plugin) {
if ($this
->showWordingForm()) {
$form['ajax_wrapper']['provider_configuration']['#type'] = 'details';
$form['ajax_wrapper']['provider_configuration'] += $this->entity
->getProviderPluginInstance()
->buildConfigurationForm($form['ajax_wrapper']['provider_configuration'], $form_state, $this->entity
->getProviderConfiguration(), $this->entity);
}
}
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
if ($this
->showWordingForm()) {
$this->entity
->getProviderPluginInstance()
->validateConfigurationForm($form['ajax_wrapper']['provider_configuration'], $this
->getSubFormState('provider_configuration', $form, $form_state), $this->entity);
}
}
public function submitForm(array &$form, FormStateInterface $form_state) {
parent::submitForm($form, $form_state);
if ($this
->showWordingForm()) {
$provider_configuration = $this->entity
->getProviderPluginInstance()
->submitConfigurationForm($form['ajax_wrapper']['provider_configuration'], $this
->getSubFormState('provider_configuration', $form, $form_state), $this->entity);
$this->entity
->setProviderConfiguration($provider_configuration);
}
}
public function save(array $form, FormStateInterface $form_state) {
$status = $this->entity
->save();
if ($status) {
$this
->messenger()
->addStatus($this
->t('Saved the %label synonym configuration.', [
'%label' => $this->entity
->label(),
]));
}
else {
$this
->messenger()
->addError($this
->t('The %label synonym configuration was not saved.', [
'%label' => $this->entity
->label(),
]));
}
$form_state
->setRedirect('synonym.entity_type.bundle', [
'synonyms_entity_type' => $this->controlledEntityType,
'bundle' => $this->controlledBundle,
]);
}
public function exist($id) {
$entity = $this->entityTypeManager
->getStorage('synonym')
->getQuery()
->condition('id', $id)
->execute();
return (bool) $entity;
}
public static function ajaxForm(array &$form, FormStateInterface $form_state, Request $request) {
return $form['ajax_wrapper'];
}
protected function getSubFormState($element_name, array $form, FormStateInterface $form_state) {
return SubformState::createForSubform($form['ajax_wrapper'][$element_name], $form, $form_state);
}
public function showWordingForm() {
return \Drupal::config('synonyms.settings')
->get('wording_type') == 'provider';
}
}