You are here

FormRoute.php in Drupal 7 to 8/9 Module Upgrader 8

File

src/Plugin/DMU/Routing/FormRoute.php
View source
<?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;
  }

}

Classes

Namesort descending Description
FormRoute Plugin annotation @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",…