Further modules included.
[yaffs-website] / web / modules / contrib / drupalmoduleupgrader / src / Plugin / DMU / Routing / FormRoute.php
diff --git a/web/modules/contrib/drupalmoduleupgrader/src/Plugin/DMU/Routing/FormRoute.php b/web/modules/contrib/drupalmoduleupgrader/src/Plugin/DMU/Routing/FormRoute.php
new file mode 100644 (file)
index 0000000..b60727c
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\drupalmoduleupgrader\Plugin\DMU\Routing;
+
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Routing\RouteProviderInterface;
+use Drupal\Core\StringTranslation\TranslationInterface;
+use Drupal\drupalmoduleupgrader\Routing\Drupal7\RouteWrapper;
+use Drupal\drupalmoduleupgrader\Routing\ParameterMap;
+use Drupal\drupalmoduleupgrader\TargetInterface;
+use Drupal\drupalmoduleupgrader\Utility\FormConverterFactory;
+use Psr\Log\LoggerInterface;
+
+/**
+ * @Converter(
+ *  id = "drupal_get_form",
+ *  description = @Translation("Converts a drupal_get_form() menu item to a _form route."),
+ *  dependencies = { "router.route_provider", "plugin.manager.drupalmoduleupgrader.rewriter", "drupalmoduleupgrader.form_converter" }
+ * )
+ */
+class FormRoute extends ContentRoute {
+
+  /**
+   * @var \Drupal\drupalmoduleupgrader\Utility\FormConverter
+   */
+  protected $formConverter;
+
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, TranslationInterface $translator, LoggerInterface $log, RouteProviderInterface $route_provider, PluginManagerInterface $rewriters, FormConverterFactory $form_converter) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $translator, $log, $route_provider, $rewriters);
+    $this->formConverter = $form_converter;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getName(TargetInterface $target, RouteWrapper $route) {
+    $name = $target->id() . '.' . $this->unPrefix($route['page arguments'][0], $target->id());
+
+    $arguments = array_filter(array_slice($route['page arguments'], 1), 'is_string');
+    if ($arguments) {
+      $name .= '_' . implode('_', $arguments);
+    }
+
+    return $name;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildParameterMap(TargetInterface $target, RouteWrapper $route) {
+    $map = parent::buildParameterMap($target, $route);
+
+    $indexer = $target->getIndexer('function');
+    if ($indexer->has($route['page arguments'][0])) {
+      $builder = $indexer->get($route['page arguments'][0]);
+      $parameters = $this->bumpKeys(array_slice($builder->getParameters()->toArray(), 2), 2);
+      $arguments = $this->bumpKeys(array_slice($route['page arguments'], 1), 2);
+      $map->merge(new ParameterMap($route->getPath(), $parameters, $arguments));
+    }
+
+    return $map;
+  }
+
+  /**
+   * Returns a copy of the input array with the keys increased by $offset. This
+   * only works on numerically indexed arrays; I don't know what it does to
+   * associative arrays, but probably nothing good.
+   *
+   * @param array $input
+   *  The input array.
+   *
+   * @param int $offset
+   *  The offset to add to the keys.
+   *
+   * @return array
+   */
+  private function bumpKeys(array $input, $offset = 0) {
+    $output = [];
+
+    foreach ($input as $key => $value) {
+      $output[ $key + $offset ] = $value;
+    }
+
+    return $output;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRoute(TargetInterface $target, RouteWrapper $route) {
+    $controller = $this->formConverter->get($target, $route['page arguments'][0])->build();
+    $target->getIndexer('class')->addFile($this->writeClass($target, $controller));
+  }
+
+  protected function getController(TargetInterface $target, RouteWrapper $route) {
+    return $this->formConverter->get($target, $route['page arguments'][0])->render();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRouteDefinition(TargetInterface $target, RouteWrapper $route) {
+    $definition = parent::buildRouteDefinition($target, $route);
+    $definition->setDefault('_form', $this->getController($target, $route)->getName()->getAbsolutePath());
+
+    return $definition;
+  }
+
+}