You are here

function webform_menu_local_tasks_alter in Webform 6.x

Same name and namespace in other branches
  1. 8.5 webform.module \webform_menu_local_tasks_alter()

Implements hook_menu_local_tasks_alter().

File

./webform.module, line 221
Enables the creation of webforms and questionnaires.

Code

function webform_menu_local_tasks_alter(&$data, $route_name, RefinableCacheableDependencyInterface $cacheability) {

  // Change config entities 'Translate *' tab to be just label 'Translate'.
  $webform_entities = [
    'webform',
    'webform_options',
  ];
  foreach ($webform_entities as $webform_entity) {
    if (isset($data['tabs'][0]["config_translation.local_tasks:entity.{$webform_entity}.config_translation_overview"]['#link']['title'])) {
      $data['tabs'][0]["config_translation.local_tasks:entity.{$webform_entity}.config_translation_overview"]['#link']['title'] = t('Translate');
    }
  }

  // Change simple config 'Translate *' tab to be just label 'Translate'.
  if (isset($data['tabs'][1]['config_translation.local_tasks:config_translation.item.overview.webform.config'])) {
    $data['tabs'][1]['config_translation.local_tasks:config_translation.item.overview.webform.config']['#link']['title'] = t('Translate');
  }

  // ISSUE:
  // Devel routes do not use 'webform' parameter which throws the below error.
  // Some mandatory parameters are missing ("webform") to generate a URL for
  // route "entity.webform_submission.canonical"
  //
  // WORKAROUND:
  // Make sure webform parameter is set for all routes.
  if (strpos($route_name, 'entity.webform_submission.devel_') === 0 || $route_name === 'entity.webform_submission.token_devel') {
    foreach ($data['tabs'] as $tab_level) {
      foreach ($tab_level as $tab) {

        /** @var Drupal\Core\Url $url */
        $url = $tab['#link']['url'];
        $tab_route_name = $url
          ->getRouteName();
        $tab_route_parameters = $url
          ->getRouteParameters();
        if (strpos($tab_route_name, 'entity.webform_submission.devel_') !== 0) {
          $webform_submission = WebformSubmission::load($tab_route_parameters['webform_submission']);
          $url
            ->setRouteParameter('webform', $webform_submission
            ->getWebform()
            ->id());
        }
      }
    }
  }

  // Allow webform query string parameters to be transferred
  // from a canonical URL to a test URL.
  //
  // Please note: This behavior is only applicable when a user can
  // test a webform.
  $route_names = [
    'entity.webform.test_form' => 'entity.webform.canonical',
    'entity.node.webform.test_form' => 'entity.node.canonical',
  ];
  if (in_array($route_name, $route_names) || array_key_exists($route_name, $route_names)) {
    $query = \Drupal::request()->query
      ->all();
    $has_test_tab = FALSE;
    foreach ($route_names as $test_route_name => $view_route_name) {
      if (isset($data['tabs'][0][$test_route_name])) {
        $has_test_tab = TRUE;
        if ($query) {
          $data['tabs'][0][$test_route_name]['#link']['url']
            ->setOption('query', $query);
          $data['tabs'][0][$view_route_name]['#link']['url']
            ->setOption('query', $query);
        }
      }
    }

    // Query string to cache context webform canonical and test routes.
    if ($has_test_tab) {
      $cacheability
        ->addCacheContexts([
        'url.query_args',
      ]);
    }
  }
}