govcms8-8.x-1.0-alpha7/modules/custom/core/govcms_media/src/Plugin/EntityBrowser/Widget/EntityFormProxy.php
modules/custom/core/govcms_media/src/Plugin/EntityBrowser/Widget/EntityFormProxy.php
<?php namespace Drupal\govcms_media\Plugin\EntityBrowser\Widget; use Drupal\Core\Ajax\AjaxResponse; use Drupal\Core\Ajax\ReplaceCommand; use Drupal\Core\Form\FormStateInterface; use Drupal\entity_browser\WidgetBase; use Drupal\inline_entity_form\ElementSubmit; use Drupal\govcms_media\Exception\IndeterminateBundleException; use Drupal\govcms_media\MediaHelper; use Symfony\Component\DependencyInjection\ContainerInterface; /** * Base class for EB widgets which wrap around an (inline) entity form. * * Code from \Drupal\lightning_media\Plugin\EntityBrowser\Widget\EntityFormProxy * in lightning_media 8.x-2.3 submodule. */ abstract class EntityFormProxy extends WidgetBase { /** * The media helper service. * * @var \Drupal\govcms_media\MediaHelper */ protected $helper; /** * EntityFormProxy constructor. * * @param array $configuration * Plugin configuration. * @param string $plugin_id * The plugin ID. * @param mixed $plugin_definition * The plugin definition. * @param mixed $event_dispatcher * The event dispatcher. * @param mixed $entity_type_manager * The entity type manager service. * @param mixed $widget_validation_manager * The widget validation manager. * @param \Drupal\govcms_media\MediaHelper $helper * The media helper service. */ public function __construct(array $configuration, $plugin_id, $plugin_definition, $event_dispatcher, $entity_type_manager, $widget_validation_manager, MediaHelper $helper) { parent::__construct($configuration, $plugin_id, $plugin_definition, $event_dispatcher, $entity_type_manager, $widget_validation_manager); $this->helper = $helper; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { return new static( $configuration, $plugin_id, $plugin_definition, $container->get('event_dispatcher'), $container->get('entity_type.manager'), $container->get('plugin.manager.entity_browser.widget_validation'), $container->get('govcms_media.media_helper') ); } /** * Returns the bundles that this widget may use. * * @param \Drupal\Core\Form\FormStateInterface $form_state * The current form state. * * @return string[] * The bundles that this widget may use. If all bundles may be used, the * returned array will be empty. */ protected function getAllowedBundles(FormStateInterface $form_state) { return (array) $form_state->get(['entity_browser', 'widget_context', 'target_bundles', ]); } /** * {@inheritdoc} */ public function getForm(array &$original_form, FormStateInterface $form_state, array $additional_widget_parameters) { $form = parent::getForm($original_form, $form_state, $additional_widget_parameters); if (isset($form['actions'])) { $form['actions']['#weight'] = 100; } $form['entity'] = [ '#prefix' => '<div id="entity">', '#suffix' => '</div>', '#weight' => 99, ]; $value = $this->getInputValue($form_state); if (empty($value)) { $form['entity']['#markup'] = NULL; return $form; } try { $entity = $this->helper->createFromInput($value, $this->getAllowedBundles($form_state)); } catch (IndeterminateBundleException $e) { return $form; } $form['entity'] += [ '#type' => 'inline_entity_form', '#entity_type' => $entity->getEntityTypeId(), '#bundle' => $entity->bundle(), '#default_value' => $entity, '#form_mode' => $this->configuration['form_mode'], ]; // Without this, IEF won't know where to hook into the widget. Don't pass // $original_form as the second argument to addCallback(), because it's not // just the entity browser part of the form, not the actual complete form. ElementSubmit::addCallback($form['actions']['submit'], $form_state->getCompleteForm()); return $form; } /** * {@inheritdoc} */ protected function prepareEntities(array $form, FormStateInterface $form_state) { if (isset($form['widget']['entity']['#entity'])) { return [ $form['widget']['entity']['#entity'], ]; } else { return []; } } /** * {@inheritdoc} */ public function validate(array &$form, FormStateInterface $form_state) { parent::validate($form, $form_state); $value = $this->getInputValue($form_state); try { $this->helper->getBundleFromInput($value, TRUE, $this->getAllowedBundles($form_state)); } catch (IndeterminateBundleException $e) { $form_state->setError($form['widget'], $e->getMessage()); } } /** * {@inheritdoc} */ public function submit(array &$element, array &$form, FormStateInterface $form_state) { // IEF will take care of creating the entity upon submission. All we need to // do is send it upstream to Entity Browser. $entity = $form['widget']['entity']['#entity']; $this->selectEntities([$entity], $form_state); } /** * AJAX callback. Returns the rebuilt inline entity form. * * @param array $form * The complete form. * @param \Drupal\Core\Form\FormStateInterface $form_state * The current form state. * * @return \Drupal\Core\Ajax\AjaxResponse * The AJAX response. */ public static function ajax(array &$form, FormStateInterface $form_state) { return (new AjaxResponse()) ->addCommand( new ReplaceCommand('#entity', $form['widget']['entity']) ); } /** * Returns the current input value, if any. * * @param \Drupal\Core\Form\FormStateInterface $form_state * The current form state. * * @return mixed * The input value, ready for further processing. Nothing will be done with * the value if it's empty. */ protected function getInputValue(FormStateInterface $form_state) { return $form_state->getValue('input'); } /** * {@inheritdoc} */ public function defaultConfiguration() { $configuration = parent::defaultConfiguration(); $configuration['form_mode'] = 'summary'; return $configuration; } }