View source
<?php
namespace Drupal\draggable_dashboard\Form;
use Drupal\block\Entity\Block;
use Drupal\Core\Block\BlockManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Theme\ThemeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
abstract class DashboardFormBase extends FormBase {
const MAX_COLUMNS_COUNT = 4;
protected $dashboard;
protected $themeManager;
protected $blockManager;
public function __construct(ThemeManagerInterface $theme_manager, BlockManagerInterface $block_manager) {
$this->themeManager = $theme_manager;
$this->blockManager = $block_manager;
}
public static function create(ContainerInterface $container) {
return new static($container
->get('theme.manager'), $container
->get('plugin.manager.block'));
}
protected abstract function buildDashboard($did);
public function buildForm(array $form, FormStateInterface $form_state, $did = NULL) {
$this->dashboard = $this
->buildDashboard($did);
$form['title'] = [
'#title' => $this
->t('Title'),
'#type' => 'textfield',
'#size' => 48,
'#maxlength' => 255,
'#default_value' => $this->dashboard
->get('title'),
'#description' => '',
];
$form['description'] = [
'#title' => $this
->t('Description'),
'#type' => 'textarea',
'#default_value' => $this->dashboard
->get('description'),
'#description' => '',
];
$form['columns'] = [
'#type' => 'select',
'#title' => $this
->t('Dashboard columns'),
'#options' => [
1 => $this
->t('1 Column'),
2 => $this
->t('2 Columns'),
3 => $this
->t('3 Columns'),
4 => $this
->t('4 Columns'),
],
'#default_value' => $this->dashboard
->get('columns'),
];
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this
->t('Save'),
'#button_type' => 'primary',
];
return $form;
}
public function validateForm(array &$form, FormStateInterface $form_state) {
}
public function submitForm(array &$form, FormStateInterface $form_state) {
$form_state
->cleanValues();
$did = $form_state
->getValue('did', 0);
$args = [
'id' => empty($did) ? time() : $did,
'title' => $form_state
->getValue('title', ''),
'description' => $form_state
->getValue('description', ''),
'columns' => $form_state
->getValue('columns', 2),
];
foreach ($args as $key => $value) {
$this->dashboard
->set($key, $value);
}
$this->dashboard
->save();
if (!empty($did) && $this->dashboard
->get('columns') > $args['columns']) {
$all_blocks = json_decode($this->dashboard
->get('blocks'), TRUE);
for ($i = $args['columns'] + 1; $i <= self::MAX_COLUMNS_COUNT; $i++) {
foreach ($all_blocks as $key => $relation) {
if ($relation['cln'] == $i) {
$block = Block::load($relation['bid']);
if ($block) {
$block
->delete();
}
unset($all_blocks[$key]);
}
}
}
$this->dashboard
->set('blocks', json_encode($all_blocks))
->save();
}
$this->blockManager
->clearCachedDefinitions();
$this
->messenger()
->addMessage($this
->t('Dashboard has been saved.'));
if (empty($did)) {
$form_state
->setRedirect('draggable_dashboard.manage_dashboard', [
'did' => $args['id'],
]);
}
else {
$form_state
->setRedirect('draggable_dashboard.overview');
}
}
}