workbench_access-8.x-1.x-dev/src/Form/WorkbenchAccessByRoleForm.php
src/Form/WorkbenchAccessByRoleForm.php
<?php namespace Drupal\workbench_access\Form; use Drupal\Core\Form\FormBase; use Drupal\Core\Form\FormStateInterface; use Drupal\Core\Messenger\MessengerInterface; use Drupal\Core\StringTranslation\TranslatableMarkup; use Drupal\workbench_access\Entity\AccessSchemeInterface; use Drupal\workbench_access\RoleSectionStorageInterface; use Drupal\workbench_access\Traits\WorkbenchAccessFormPageTitleTrait; use Drupal\workbench_access\WorkbenchAccessManagerInterface; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Configure Workbench Access per role. */ class WorkbenchAccessByRoleForm extends FormBase { use WorkbenchAccessFormPageTitleTrait; /** * The Workbench Access manager service. * * @var \Drupal\workbench_access\WorkbenchAccessManager */ protected $manager; /** * The role section storage service. * * @var \Drupal\workbench_access\RoleSectionStorageInterface */ protected $roleSectionStorage; /** * The active access scheme. * * @var \Drupal\workbench_access\Entity\AccessSchemeInterface */ protected $scheme; /** * The messenger service. * * @var \Drupal\Core\Messenger\MessengerInterface */ protected $messenger; /** * Constructs a new WorkbenchAccessConfigForm. * * @param \Drupal\workbench_access\WorkbenchAccessManagerInterface $manager * The Workbench Access hierarchy manager. * @param \Drupal\workbench_access\RoleSectionStorageInterface $role_section_storage * The role section storage service. * @param \Drupal\Core\Messenger\MessengerInterface $messenger * The core messenger service. */ public function __construct(WorkbenchAccessManagerInterface $manager, RoleSectionStorageInterface $role_section_storage, MessengerInterface $messenger) { $this->manager = $manager; $this->roleSectionStorage = $role_section_storage; $this->messenger = $messenger; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('plugin.manager.workbench_access.scheme'), $container->get('workbench_access.role_section_storage'), $container->get('messenger') ); } /** * {@inheritdoc} */ public function getFormId() { return 'workbench_access_by_role'; } /** * {@inheritdoc} */ public function buildForm(array $form, FormStateInterface $form_state, AccessSchemeInterface $access_scheme = NULL, $id = NULL) { $this->scheme = $access_scheme; $existing_roles = $this->roleSectionStorage->getRoles($access_scheme, $id); $potential_roles = $this->roleSectionStorage->getPotentialRolesFiltered($id); $form['existing_roles'] = ['#type' => 'value', '#value' => $existing_roles]; $form['section_id'] = ['#type' => 'value', '#value' => $id]; if (!$existing_roles) { $text = $this->t('There are no roles assigned to the %label section.', ['%label' => $access_scheme->label()]); $form['help'] = [ '#type' => 'markup', '#markup' => '<p>' . $text . '</p>', ]; } if ($potential_roles) { $form['roles'] = [ '#title' => $this->t('Roles for the %label section.', ['%label' => $access_scheme->label()]), '#type' => 'checkboxes', '#options' => $potential_roles, '#default_value' => $existing_roles, ]; $form['actions'] = ['#type' => 'actions']; $form['actions']['submit'] = [ '#type' => 'submit', '#value' => $this->t('Submit'), ]; } if (count($potential_roles) === count($existing_roles)) { $form['message'] = [ '#type' => 'markup', '#markup' => '<p>' . $this->t('There are no additional roles that can be added to the %label section', ['%label' => $access_scheme->label()]) . '</p>', ]; } return $form; } /** * {@inheritdoc} */ public function submitForm(array &$form, FormStateInterface $form_state) { $roles = $form_state->getValue('roles'); $id = $form_state->getValue('section_id'); foreach ($roles as $role_id => $value) { // Add role to section. if ($value === $role_id) { $this->roleSectionStorage->addRole($this->scheme, $role_id, [$id]); } // Remove role from section. else { $this->roleSectionStorage->removeRole($this->scheme, $role_id, [$id]); } } $this->messenger->addMessage($this->t('Role assignments updated.')); } /** * Returns a dynamic page title for the route. * * @param \Drupal\workbench_access\Entity\AccessSchemeInterface $access_scheme * Access scheme. * @param string $id * The section id. * * @return \Drupal\Core\StringTranslation\TranslatableMarkup * A page title. */ public function pageTitle(AccessSchemeInterface $access_scheme, string $id): TranslatableMarkup { return $this->getPageTitle('Roles', $access_scheme, $id); } }