This repository has been archived on 2025-09-29. You can view files and clone it, but you cannot make any changes to it's state, such as pushing and creating new issues, pull requests or comments.
drupalcampbristol/web/modules/contrib/webform/src/BreadCrumb/WebformBreadcrumbBuilder.php
2017-03-16 15:29:07 +00:00

206 lines
8.7 KiB
PHP

<?php
namespace Drupal\webform\BreadCrumb;
use Drupal\Core\Breadcrumb\BreadcrumbBuilderInterface;
use Drupal\Core\Breadcrumb\Breadcrumb;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Link;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\Core\Url;
use Drupal\webform\WebformInterface;
use Drupal\webform\WebformRequestInterface;
use Drupal\webform\WebformSubmissionInterface;
/**
* Provides a webform breadcrumb builder.
*/
class WebformBreadcrumbBuilder implements BreadcrumbBuilderInterface {
use StringTranslationTrait;
/**
* The current route's entity or plugin type.
*
* @var string
*/
protected $type;
/**
* Webform request handler.
*
* @var \Drupal\webform\WebformRequestInterface
*/
protected $requestHandler;
/**
* The module handler service.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface
*/
protected $moduleHandler;
/**
* Constructs a WebformBreadcrumbBuilder.
*
* @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
* The module handler service.
* @param \Drupal\webform\WebformRequestInterface $request_handler
* The webform request handler.
* @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
* The string translation service.
*/
public function __construct(ModuleHandlerInterface $module_handler, WebformRequestInterface $request_handler, TranslationInterface $string_translation) {
$this->moduleHandler = $module_handler;
$this->requestHandler = $request_handler;
$this->setStringTranslation($string_translation);
}
/**
* {@inheritdoc}
*/
public function applies(RouteMatchInterface $route_match) {
$route_name = $route_match->getRouteName();
// All routes must begin or contain 'webform.
if (strpos($route_name, 'webform') === FALSE) {
return FALSE;
}
$args = explode('.', $route_name);
// Skip all config_translation routes except the overview
// and allow Drupal to use the path as the breadcrumb.
if (strpos($route_name, 'config_translation') !== FALSE && $route_name != 'entity.webform.config_translation_overview') {
return FALSE;
}
try {
$path = Url::fromRouteMatch($route_match)->toString();
$base_path = base_path();
}
catch (\Exception $exception) {
$path = '';
$base_path = '/';
}
if ((count($args) > 2) && $args[0] == 'entity' && ($args[2] == 'webform' || $args[2] == 'webform_submission')) {
$this->type = 'webform_source_entity';
}
elseif (strpos($route_name, 'entity.webform_ui.element') === 0) {
$this->type = 'webform_element';
}
elseif (strpos($route_name, 'entity.webform.handler.') === 0) {
$this->type = 'webform_handler';
}
elseif ($route_match->getParameter('webform_submission') instanceof WebformSubmissionInterface && strpos($route_name, 'webform.user.submission') !== FALSE) {
$this->type = 'webform_user_submission';
}
elseif (strpos($route_match->getRouteName(), 'webform.user.submissions') !== FALSE) {
$this->type = 'webform_user_submissions';
}
elseif ($route_match->getParameter('webform_submission') instanceof WebformSubmissionInterface && $route_match->getParameter('webform_submission')->access('admin')) {
$this->type = 'webform_submission';
}
elseif (($route_match->getParameter('webform') instanceof WebformInterface && $route_match->getParameter('webform')->access('admin'))) {
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $route_match->getParameter('webform');
$this->type = ($webform->isTemplate() && $this->moduleHandler->moduleExists('webform_templates')) ? 'webform_template' : 'webform';
}
elseif (strpos($path, $base_path . 'admin/structure/webform/test/') === 0) {
$this->type = 'webform_test';
}
else {
$this->type = NULL;
}
return ($this->type) ? TRUE : FALSE;
}
/**
* {@inheritdoc}
*/
public function build(RouteMatchInterface $route_match) {
if ($this->type == 'webform_source_entity') {
$source_entity = $this->requestHandler->getCurrentSourceEntity(['webform', 'webform_submission']);
$entity_type = $source_entity->getEntityTypeId();
$entity_id = $source_entity->id();
$breadcrumb = new Breadcrumb();
$breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
$breadcrumb->addLink($source_entity->toLink());
if ($webform_submission = $route_match->getParameter('webform_submission')) {
if (strpos($route_match->getRouteName(), 'webform.user.submission') !== FALSE) {
$breadcrumb->addLink(Link::createFromRoute($this->t('Submissions'), "entity.$entity_type.webform.user.submissions", [$entity_type => $entity_id]));
}
elseif ($source_entity->access('webform_submission_view') || $webform_submission->access('view_any')) {
$breadcrumb->addLink(Link::createFromRoute($this->t('Results'), "entity.$entity_type.webform.results_submissions", [$entity_type => $entity_id]));
}
elseif ($webform_submission->access('view_own')) {
$breadcrumb->addLink(Link::createFromRoute($this->t('Results'), "entity.$entity_type.webform.user.submissions", [$entity_type => $entity_id]));
}
}
}
else {
$breadcrumb = new Breadcrumb();
$breadcrumb->addLink(Link::createFromRoute($this->t('Home'), '<front>'));
$breadcrumb->addLink(Link::createFromRoute($this->t('Administration'), 'system.admin'));
$breadcrumb->addLink(Link::createFromRoute($this->t('Structure'), 'system.admin_structure'));
$breadcrumb->addLink(Link::createFromRoute($this->t('Webforms'), 'entity.webform.collection'));
switch ($this->type) {
case 'webform_test':
$breadcrumb->addLink(Link::createFromRoute($this->t('Testing'), 'webform_test.index'));
break;
case 'webform_template':
$breadcrumb->addLink(Link::createFromRoute($this->t('Templates'), 'entity.webform.templates'));
break;
case 'webform_element':
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $route_match->getParameter('webform');
$breadcrumb->addLink(Link::createFromRoute($webform->label(), 'entity.webform.canonical', ['webform' => $webform->id()]));
$breadcrumb->addLink(Link::createFromRoute($this->t('Elements'), 'entity.webform.edit_form', ['webform' => $webform->id()]));
break;
case 'webform_handler':
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $route_match->getParameter('webform');
$breadcrumb->addLink(Link::createFromRoute($webform->label(), 'entity.webform.canonical', ['webform' => $webform->id()]));
$breadcrumb->addLink(Link::createFromRoute($this->t('Emails / Handlers'), 'entity.webform.handlers_form', ['webform' => $webform->id()]));
break;
case 'webform_submission':
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $route_match->getParameter('webform_submission');
$webform = $webform_submission->getWebform();
$breadcrumb->addLink(Link::createFromRoute($webform->label(), 'entity.webform.canonical', ['webform' => $webform->id()]));
$breadcrumb->addLink(Link::createFromRoute($this->t('Results'), 'entity.webform.results_submissions', ['webform' => $webform->id()]));
break;
case 'webform_user_submissions':
/** @var \Drupal\webform\WebformInterface $webform */
$webform = $route_match->getParameter('webform');
$breadcrumb = new Breadcrumb();
$breadcrumb->addLink(Link::createFromRoute($webform->label(), 'entity.webform.canonical', ['webform' => $webform->id()]));
break;
case 'webform_user_submission':
/** @var \Drupal\webform\WebformSubmissionInterface $webform_submission */
$webform_submission = $route_match->getParameter('webform_submission');
$webform = $webform_submission->getWebform();
$breadcrumb = new Breadcrumb();
$breadcrumb->addLink(Link::createFromRoute($webform->label(), 'entity.webform.canonical', ['webform' => $webform->id()]));
$breadcrumb->addLink(Link::createFromRoute($this->t('Submissions'), 'entity.webform.user.submissions', ['webform' => $webform->id()]));
break;
}
}
// This breadcrumb builder is based on a route parameter, and hence it
// depends on the 'route' cache context.
$breadcrumb->addCacheContexts(['route']);
return $breadcrumb;
}
}