drupalmoduleupgrader-8.x-1.5/src/Plugin/DMU/Routing/FormRoute.php
src/Plugin/DMU/Routing/FormRoute.php
<?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;
}
}
