Chris@0: configuration['label'])) { Chris@0: return $this->configuration['label']; Chris@0: } Chris@0: Chris@0: $definition = $this->getPluginDefinition(); Chris@0: // Cast the admin label to a string since it is an object. Chris@0: // @see \Drupal\Core\StringTranslation\TranslatableMarkup Chris@0: return (string) $definition['admin_label']; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function __construct(array $configuration, $plugin_id, $plugin_definition) { Chris@0: parent::__construct($configuration, $plugin_id, $plugin_definition); Chris@0: $this->setConfiguration($configuration); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getConfiguration() { Chris@0: return $this->configuration; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setConfiguration(array $configuration) { Chris@0: $this->configuration = NestedArray::mergeDeep( Chris@0: $this->baseConfigurationDefaults(), Chris@0: $this->defaultConfiguration(), Chris@0: $configuration Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns generic default configuration for block plugins. Chris@0: * Chris@0: * @return array Chris@0: * An associative array with the default configuration. Chris@0: */ Chris@0: protected function baseConfigurationDefaults() { Chris@0: return [ Chris@0: 'id' => $this->getPluginId(), Chris@0: 'label' => '', Chris@0: 'provider' => $this->pluginDefinition['provider'], Chris@0: 'label_display' => static::BLOCK_LABEL_VISIBLE, Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function defaultConfiguration() { Chris@0: return []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setConfigurationValue($key, $value) { Chris@0: $this->configuration[$key] = $value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function calculateDependencies() { Chris@0: return []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function access(AccountInterface $account, $return_as_object = FALSE) { Chris@0: $access = $this->blockAccess($account); Chris@0: return $return_as_object ? $access : $access->isAllowed(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Indicates whether the block should be shown. Chris@0: * Chris@0: * Blocks with specific access checking should override this method rather Chris@0: * than access(), in order to avoid repeating the handling of the Chris@0: * $return_as_object argument. Chris@0: * Chris@0: * @param \Drupal\Core\Session\AccountInterface $account Chris@0: * The user session for which to check access. Chris@0: * Chris@0: * @return \Drupal\Core\Access\AccessResult Chris@0: * The access result. Chris@0: * Chris@0: * @see self::access() Chris@0: */ Chris@0: protected function blockAccess(AccountInterface $account) { Chris@0: // By default, the block is visible. Chris@0: return AccessResult::allowed(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: * Chris@0: * Creates a generic configuration form for all block types. Individual Chris@0: * block plugins can add elements to this form by overriding Chris@0: * BlockBase::blockForm(). Most block plugins should not override this Chris@0: * method unless they need to alter the generic form elements. Chris@0: * Chris@0: * @see \Drupal\Core\Block\BlockBase::blockForm() Chris@0: */ Chris@0: public function buildConfigurationForm(array $form, FormStateInterface $form_state) { Chris@0: $definition = $this->getPluginDefinition(); Chris@0: $form['provider'] = [ Chris@0: '#type' => 'value', Chris@0: '#value' => $definition['provider'], Chris@0: ]; Chris@0: Chris@0: $form['admin_label'] = [ Chris@0: '#type' => 'item', Chris@0: '#title' => $this->t('Block description'), Chris@0: '#plain_text' => $definition['admin_label'], Chris@0: ]; Chris@0: $form['label'] = [ Chris@0: '#type' => 'textfield', Chris@0: '#title' => $this->t('Title'), Chris@0: '#maxlength' => 255, Chris@0: '#default_value' => $this->label(), Chris@0: '#required' => TRUE, Chris@0: ]; Chris@0: $form['label_display'] = [ Chris@0: '#type' => 'checkbox', Chris@0: '#title' => $this->t('Display title'), Chris@0: '#default_value' => ($this->configuration['label_display'] === static::BLOCK_LABEL_VISIBLE), Chris@0: '#return_value' => static::BLOCK_LABEL_VISIBLE, Chris@0: ]; Chris@0: Chris@0: // Add context mapping UI form elements. Chris@0: $contexts = $form_state->getTemporaryValue('gathered_contexts') ?: []; Chris@0: $form['context_mapping'] = $this->addContextAssignmentElement($this, $contexts); Chris@0: // Add plugin-specific settings for this block type. Chris@0: $form += $this->blockForm($form, $form_state); Chris@0: return $form; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function blockForm($form, FormStateInterface $form_state) { Chris@0: return []; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: * Chris@0: * Most block plugins should not override this method. To add validation Chris@0: * for a specific block type, override BlockBase::blockValidate(). Chris@0: * Chris@0: * @see \Drupal\Core\Block\BlockBase::blockValidate() Chris@0: */ Chris@0: public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { Chris@0: // Remove the admin_label form item element value so it will not persist. Chris@0: $form_state->unsetValue('admin_label'); Chris@0: Chris@0: $this->blockValidate($form, $form_state); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function blockValidate($form, FormStateInterface $form_state) {} Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: * Chris@0: * Most block plugins should not override this method. To add submission Chris@0: * handling for a specific block type, override BlockBase::blockSubmit(). Chris@0: * Chris@0: * @see \Drupal\Core\Block\BlockBase::blockSubmit() Chris@0: */ Chris@0: public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { Chris@0: // Process the block's submission handling if no errors occurred only. Chris@0: if (!$form_state->getErrors()) { Chris@0: $this->configuration['label'] = $form_state->getValue('label'); Chris@0: $this->configuration['label_display'] = $form_state->getValue('label_display'); Chris@0: $this->configuration['provider'] = $form_state->getValue('provider'); Chris@0: $this->blockSubmit($form, $form_state); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function blockSubmit($form, FormStateInterface $form_state) {} Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getMachineNameSuggestion() { Chris@0: $definition = $this->getPluginDefinition(); Chris@0: $admin_label = $definition['admin_label']; Chris@0: Chris@0: // @todo This is basically the same as what is done in Chris@0: // \Drupal\system\MachineNameController::transliterate(), so it might make Chris@0: // sense to provide a common service for the two. Chris@0: $transliterated = $this->transliteration()->transliterate($admin_label, LanguageInterface::LANGCODE_DEFAULT, '_'); Chris@17: $transliterated = mb_strtolower($transliterated); Chris@0: Chris@0: $transliterated = preg_replace('@[^a-z0-9_.]+@', '', $transliterated); Chris@0: Chris@0: return $transliterated; Chris@0: } Chris@0: Chris@0: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function getPreviewFallbackString() { Chris@18: return $this->t('"@block" block', ['@block' => $this->label()]); Chris@17: } Chris@17: Chris@17: /** Chris@0: * Wraps the transliteration service. Chris@0: * Chris@0: * @return \Drupal\Component\Transliteration\TransliterationInterface Chris@0: */ Chris@0: protected function transliteration() { Chris@0: if (!$this->transliteration) { Chris@0: $this->transliteration = \Drupal::transliteration(); Chris@0: } Chris@0: return $this->transliteration; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets the transliteration service. Chris@0: * Chris@0: * @param \Drupal\Component\Transliteration\TransliterationInterface $transliteration Chris@0: * The transliteration service. Chris@0: */ Chris@0: public function setTransliteration(TransliterationInterface $transliteration) { Chris@0: $this->transliteration = $transliteration; Chris@0: } Chris@0: Chris@0: }