View source
<?php
namespace Drupal\content_planner\Form;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\content_planner\DashboardSettingsService;
use Drupal\Core\Form\ConfigFormBase;
use Symfony\Component\HttpFoundation\Request;
use Drupal\Core\Form\FormStateInterface;
class DashboardBlockConfigForm extends ConfigFormBase {
protected $dashboardSettingsService;
protected $dashboardBlockPluginManager;
public function __construct(ConfigFactoryInterface $config_factory) {
parent::__construct($config_factory);
$this->dashboardSettingsService = \Drupal::service('content_planner.dashboard_settings_service');
$this->dashboardBlockPluginManager = \Drupal::service('content_planner.dashboard_block_plugin_manager');
}
public function getFormId() {
return 'content_planner_dashboard_block_config_form';
}
protected function getEditableConfigNames() {
return [
DashboardSettingsService::CONFIG_NAME,
];
}
public function buildForm(array $form, FormStateInterface $form_state, Request $request = NULL, $block_id = NULL) {
$plugin_definition = $this->dashboardBlockPluginManager
->getDefinition($block_id);
if (!$plugin_definition) {
$this
->messenger()
->addError($this
->t('Plugin with @block_id does not exist', [
'@block_id' => $block_id,
]));
return [];
}
$form['block_id'] = [
'#type' => 'value',
'#value' => $block_id,
];
$block_configuration = $this->dashboardSettingsService
->getBlockConfiguration($block_id);
$this
->buildBasicFields($form, $form_state, $request, $block_configuration);
$instance = $this
->createInstanceFromBlockId($block_id);
if ($config_specific_fields = $instance
->getConfigSpecificFormFields($form_state, $request, $block_configuration)) {
$form['plugin_specific_config'] = [
'#type' => 'fieldset',
'#title' => t('Extra Settings'),
'#collapsible' => FALSE,
'#collapsed' => FALSE,
'#tree' => TRUE,
];
foreach ($config_specific_fields as $field_name => $field_settings) {
$form['plugin_specific_config'][$field_name] = $field_settings;
}
}
return parent::buildForm($form, $form_state);
}
protected function buildBasicFields(array &$form, FormStateInterface &$form_state, Request &$request, $block_configuration) {
$form['title'] = [
'#type' => 'textfield',
'#title' => $this
->t('Title'),
'#maxlength' => 255,
'#default_value' => isset($block_configuration['title']) ? $block_configuration['title'] : '',
'#description' => $this
->t("If this field is blank, the Plugin's default name will be used."),
];
$form['weight'] = [
'#type' => 'weight',
'#title' => $this
->t('Weight'),
'#default_value' => isset($block_configuration['weight']) ? $block_configuration['weight'] : 0,
'#delta' => 10,
];
}
protected function createInstanceFromBlockId($block_id) {
$plugin_definition = $this->dashboardBlockPluginManager
->getDefinition($block_id);
return $this->dashboardBlockPluginManager
->createInstance($plugin_definition['id']);
}
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
$block_id = $form_state
->getValue('block_id');
$instance = $this
->createInstanceFromBlockId($block_id);
$instance
->validateForm($form, $form_state);
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$block_id = $form_state
->getValue('block_id');
$block_configuration = $this->dashboardSettingsService
->getBlockConfiguration($block_id);
$block_configuration['title'] = $form_state
->getValue('title');
$block_configuration['weight'] = $form_state
->getValue('weight');
$block_configuration['configured'] = TRUE;
$block_configuration['plugin_specific_config'] = $form_state
->getValue('plugin_specific_config');
$this->dashboardSettingsService
->saveBlockConfiguration($block_id, $block_configuration);
}
}