entityTypeManager = $entity_type_manager; $this->embedTypeManager = $embed_type_manager; $this->configFactory = $config_factory; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { return new static( $container->get('entity_type.manager'), $container->get('plugin.manager.embed.type'), $container->get('config.factory') ); } /** * {@inheritdoc} */ public function form(array $form, FormStateInterface $form_state) { $form = parent::form($form, $form_state); /** @var \Drupal\embed\EmbedButtonInterface $button */ $button = $this->entity; $form_state->setTemporaryValue('embed_button', $button); $form['label'] = [ '#title' => $this->t('Label'), '#type' => 'textfield', '#default_value' => $button->label(), '#description' => $this->t('The human-readable name of this embed button. This text will be displayed when the user hovers over the CKEditor button. This name must be unique.'), '#required' => TRUE, '#size' => 30, ]; $form['id'] = [ '#type' => 'machine_name', '#default_value' => $button->id(), '#maxlength' => EntityTypeInterface::BUNDLE_MAX_LENGTH, '#disabled' => !$button->isNew(), '#machine_name' => [ 'exists' => ['Drupal\embed\Entity\EmbedButton', 'load'], ], '#description' => $this->t('A unique machine-readable name for this embed button. It must only contain lowercase letters, numbers, and underscores.'), ]; $form['type_id'] = [ '#type' => 'select', '#title' => $this->t('Embed type'), '#options' => $this->embedTypeManager->getDefinitionOptions(), '#default_value' => $button->getTypeId(), '#required' => TRUE, '#ajax' => [ 'callback' => '::updateTypeSettings', 'effect' => 'fade', ], '#disabled' => !$button->isNew(), ]; if (count($form['type_id']['#options']) == 0) { drupal_set_message($this->t('No embed types found.'), 'warning'); } // Add the embed type plugin settings. $form['type_settings'] = [ '#type' => 'container', '#tree' => TRUE, '#prefix' => '
', '#suffix' => '
', ]; try { if ($plugin = $button->getTypePlugin()) { $form['type_settings'] = $plugin->buildConfigurationForm($form['type_settings'], $form_state); } } catch (PluginNotFoundException $exception) { drupal_set_message($exception->getMessage(), 'error'); watchdog_exception('embed', $exception); $form['type_id']['#disabled'] = FALSE; } $config = $this->config('embed.settings'); $upload_location = $config->get('file_scheme') . '://' . $config->get('upload_directory') . '/'; $form['icon_file'] = [ '#title' => $this->t('Button icon'), '#type' => 'managed_file', '#description' => $this->t('Icon for the button to be shown in CKEditor toolbar. Leave empty to use the default Entity icon.'), '#upload_location' => $upload_location, '#upload_validators' => [ 'file_validate_extensions' => ['gif png jpg jpeg'], 'file_validate_image_resolution' => ['32x32', '16x16'], ], ]; if ($file = $button->getIconFile()) { $form['icon_file']['#default_value'] = ['target_id' => $file->id()]; } return $form; } /** * {@inheritdoc} */ public function validateForm(array &$form, FormStateInterface $form_state) { parent::validateForm($form, $form_state); /** @var \Drupal\embed\EmbedButtonInterface $button */ $button = $this->entity; // Run embed type plugin validation. if ($plugin = $button->getTypePlugin()) { $plugin_form_state = clone $form_state; $plugin_form_state->setValues($button->getTypeSettings()); $plugin->validateConfigurationForm($form['type_settings'], $plugin_form_state); if ($errors = $plugin_form_state->getErrors()) { foreach ($errors as $name => $error) { $form_state->setErrorByName($name, $error); } } $form_state->setValue('type_settings', $plugin_form_state->getValues()); } } /** * {@inheritdoc} */ public function save(array $form, FormStateInterface $form_state) { /** @var \Drupal\embed\EmbedButtonInterface $button */ $button = $this->entity; // Run embed type plugin submission. $plugin = $button->getTypePlugin(); $plugin_form_state = clone $form_state; $plugin_form_state->setValues($button->getTypeSettings()); $plugin->submitConfigurationForm($form['type_settings'], $plugin_form_state); $form_state->setValue('type_settings', $plugin->getConfiguration()); $button->set('type_settings', $plugin->getConfiguration()); $icon_fid = $form_state->getValue(['icon_file', '0']); // If a file was uploaded to be used as the icon, get its UUID to be stored // in the config entity. if (!empty($icon_fid) && $file = $this->entityTypeManager->getStorage('file')->load($icon_fid)) { $button->set('icon_uuid', $file->uuid()); } else { $button->set('icon_uuid', NULL); } $status = $button->save(); $t_args = ['%label' => $button->label()]; if ($status == SAVED_UPDATED) { drupal_set_message($this->t('The embed button %label has been updated.', $t_args)); } elseif ($status == SAVED_NEW) { drupal_set_message($this->t('The embed button %label has been added.', $t_args)); $context = array_merge($t_args, ['link' => $button->link($this->t('View'), 'collection')]); $this->logger('embed')->notice('Added embed button %label.', $context); } $form_state->setRedirectUrl($button->urlInfo('collection')); } /** * Ajax callback to update the form fields which depend on embed type. * * @param array $form * The build form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The form state. * * @return \Drupal\Core\Ajax\AjaxResponse * Ajax response with updated options for the embed type. */ public function updateTypeSettings(array &$form, FormStateInterface $form_state) { $response = new AjaxResponse(); // Update options for entity type bundles. $response->addCommand(new ReplaceCommand( '#embed-type-settings-wrapper', $form['type_settings'] )); return $response; } }