monster_menus-9.0.x-dev/modules/mm_webform/src/RouteProcessor/OutboundRouteProcessor.php

modules/mm_webform/src/RouteProcessor/OutboundRouteProcessor.php
<?php

namespace Drupal\mm_webform\RouteProcessor;

use Drupal\Core\Render\BubbleableMetadata;
use Drupal\Core\RouteProcessor\OutboundRouteProcessorInterface;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\webform\Entity\Webform;
use Symfony\Component\Routing\Route;

/**
 * Processes outbound routes, switching them to node-specific routes when needed.
 */
class OutboundRouteProcessor implements OutboundRouteProcessorInterface {

  /**
   * The route provider.
   *
   * @var \Drupal\Core\Routing\RouteProviderInterface
   */
  protected $routeProvider;

  /**
   * The route match service.
   *
   * @var \Drupal\Core\Routing\RouteMatchInterface
   */
  protected $currentRouteMatch;

  /**
   * Constructs a OutboundRouteProcessor object.
   *
   * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
   *   The route provider.
   */
  public function __construct(RouteProviderInterface $route_provider, RouteMatchInterface $current_route_match) {
    $this->routeProvider = $route_provider;
    $this->currentRouteMatch = $current_route_match;
  }

  /**
   * {@inheritdoc}
   */
  public function processOutbound($route_name, Route $route, array &$parameters, BubbleableMetadata $bubbleable_metadata = NULL) {
    $page_route_params = $this->currentRouteMatch->getParameters();
    $mm_tree = NULL;
    $applies = ($node = $page_route_params->get('node')) && mm_webform_has_webform_field($node);
    if (!$applies) {
      // In some cases the webform module uses the links contained in the
      // Webform entity, which aren't associated with a node. So attempt to
      // figure out which node to use.
      //
      // There is a webform parameter...
      if (isset($parameters['webform']) && ($webform = Webform::load($parameters['webform']))) {
        // and the webform is associated with one or more nodes...
        if ($nodes = mm_webform_get_nodes_from_webform($webform)) {
          // and one of those nodes is on the current page.
          if ($mm_tree = $page_route_params->get('mm_tree')) {
            if ($nids = array_intersect(mm_content_get_nids_by_mmtid($mm_tree->id()), array_keys($nodes))) {
              $node = reset($nids);
            }
            else {
              return;
            }
          }
        }
      }
    }

    $routes = [
      'entity.webform.edit_form' =>                 'mm_webform.edit_form',
      'entity.webform.settings' =>                  'mm_webform.settings',
      'entity.webform.settings_form' =>             'mm_webform.settings_form',
      'entity.webform.settings_submissions' =>      'mm_webform.settings_submissions',
      'entity.webform.settings_confirmation' =>     'mm_webform.settings_confirmation',
      'entity.webform.handler.edit_form' =>         'mm_webform.handler.edit_form',
      'entity.webform.handler.duplicate_form' =>    'mm_webform.handler.duplicate_form',
      'entity.webform.handler.delete_form' =>       'mm_webform.handler.delete_form',
      'entity.webform.handler.disable' =>           'mm_webform.handler.disable',
      'entity.webform.handler.enable' =>            'mm_webform.handler.enable',
      'entity.webform_ui.element' =>                'mm_webform_ui.element',
      'entity.webform_ui.element.add_form' =>       'mm_webform_ui.element.add_form',
      'entity.webform_ui.element.add_page' =>       'mm_webform_ui.element.add_page',
      'entity.webform_ui.element.add_layout' =>     'mm_webform_ui.element.add_layout',
      'entity.webform_ui.element.edit_form' =>      'mm_webform_ui.element.edit_form',
      'entity.webform_ui.element.duplicate_form' => 'mm_webform_ui.element.duplicate_form',
      'entity.webform_ui.element.delete_form' =>    'mm_webform_ui.element.delete_form',
    ];
    if (isset($routes[$route_name])) {
      $source_route = $this->routeProvider->getRouteByName($routes[$route_name]);
      $requirements = $source_route->getRequirements();
      foreach (['mm_tree' => $mm_tree, 'node' => $node] as $parameter_name => $value) {
        if (!empty($requirements[$parameter_name])) {
          if (!$value) {
            $value = $page_route_params->get($parameter_name);
          }
          if ($value) {
            $parameters[$parameter_name] = is_numeric($value) ? $value : $value->id();
          }
          else {
            // Don't have required parameter, probably because this is not an
            // MM page.
            return;
          }
        }
      }
      $route->setPath($source_route->getPath());
      $route->setDefaults($source_route->getDefaults());
      $route->setRequirements($requirements);
      $route->setOptions($source_route->getOptions());
      $route->setHost($source_route->getHost());
      $route->setSchemes($source_route->getSchemes());
      $route->setMethods($source_route->getMethods());
    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc