View source
<?php
namespace Drupal\panels\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormState;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContextAwarePluginAssignmentTrait;
use Drupal\Core\Plugin\ContextAwarePluginInterface;
use Drupal\panels\CachedValuesGetterTrait;
use Drupal\user\SharedTempStoreFactory;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class PanelsBlockConfigureFormBase extends FormBase {
use ContextAwarePluginAssignmentTrait;
use CachedValuesGetterTrait;
protected $tempstore;
protected $tempstore_id;
protected $variantPlugin;
protected $block;
public function __construct(SharedTempStoreFactory $tempstore) {
$this->tempstore = $tempstore;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('user.shared_tempstore'));
}
protected function getTempstoreId() {
return $this->tempstore_id;
}
protected function getTempstore() {
return $this->tempstore
->get($this
->getTempstoreId());
}
protected abstract function prepareBlock($block_id);
protected abstract function submitText();
public function buildForm(array $form, FormStateInterface $form_state, $tempstore_id = NULL, $machine_name = NULL, $block_id = NULL) {
$this->tempstore_id = $tempstore_id;
$cached_values = $this
->getCachedValues($this->tempstore, $tempstore_id, $machine_name);
$this->variantPlugin = $cached_values['plugin'];
$contexts = $this->variantPlugin
->getPattern()
->getDefaultContexts($this->tempstore, $this
->getTempstoreId(), $machine_name);
$this->variantPlugin
->setContexts($contexts);
$form_state
->setTemporaryValue('gathered_contexts', $contexts);
$this->block = $this
->prepareBlock($block_id);
$form_state
->set('machine_name', $machine_name);
$form_state
->set('block_id', $this->block
->getConfiguration()['uuid']);
$form_state
->set('block_theme', $this
->config('system.theme')
->get('default'));
$form['#tree'] = TRUE;
$form['settings'] = $this->block
->buildConfigurationForm([], $form_state);
$form['settings']['id'] = [
'#type' => 'value',
'#value' => $this->block
->getPluginId(),
];
$form['region'] = [
'#title' => $this
->t('Region'),
'#type' => 'select',
'#options' => $this->variantPlugin
->getRegionNames(),
'#default_value' => $this->variantPlugin
->getRegionAssignment($this->block
->getConfiguration()['uuid']),
'#required' => TRUE,
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->submitText(),
'#button_type' => 'primary',
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
$this->block = $this
->getVariantPlugin()
->getBlock($form_state
->get('block_id'));
$settings = (new FormState())
->setValues($form_state
->getValue('settings'));
$this->block
->validateConfigurationForm($form, $settings);
$form_state
->setValue('settings', $settings
->getValues());
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$settings = (new FormState())
->setValues($form_state
->getValue('settings'));
$this->block
->submitConfigurationForm($form, $settings);
$form_state
->setValue('settings', $settings
->getValues());
if ($this->block instanceof ContextAwarePluginInterface) {
$this->block
->setContextMapping($settings
->getValue('context_mapping', []));
}
$configuration = $this->block
->getConfiguration();
$configuration['region'] = $form_state
->getValue('region');
$this
->getVariantPlugin()
->updateBlock($this->block
->getConfiguration()['uuid'], $configuration);
$cached_values = $this
->getCachedValues($this->tempstore, $this->tempstore_id, $form_state
->get('machine_name'));
$cached_values['plugin'] = $this
->getVariantPlugin();
if (isset($cached_values['page_variant'])) {
$cached_values['page_variant']
->getVariantPlugin()
->setConfiguration($cached_values['plugin']
->getConfiguration());
}
$this
->getTempstore()
->set($cached_values['id'], $cached_values);
}
protected function getVariantPlugin() {
return $this->variantPlugin;
}
}