You are here

public function WebformPluginHandlerController::listHandlers in Webform 8.5

Same name and namespace in other branches
  1. 6.x src/Controller/WebformPluginHandlerController.php \Drupal\webform\Controller\WebformPluginHandlerController::listHandlers()

Shows a list of webform handlers that can be added to a webform.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The current request.

\Drupal\webform\WebformInterface $webform: A webform.

Return value

array A render array as expected by the renderer.

1 string reference to 'WebformPluginHandlerController::listHandlers'
webform.routing.yml in ./webform.routing.yml
webform.routing.yml

File

src/Controller/WebformPluginHandlerController.php, line 161

Class

WebformPluginHandlerController
Controller for all webform handlers.

Namespace

Drupal\webform\Controller

Code

public function listHandlers(Request $request, WebformInterface $webform) {
  $headers = [
    [
      'data' => $this
        ->t('Handler'),
      'width' => '20%',
    ],
    [
      'data' => $this
        ->t('Description'),
      'width' => '40%',
    ],
    [
      'data' => $this
        ->t('Category'),
      'width' => '20%',
    ],
    [
      'data' => $this
        ->t('Operations'),
      'width' => '20%',
    ],
  ];
  $definitions = $this->pluginManager
    ->getDefinitions();
  $definitions = $this->pluginManager
    ->getSortedDefinitions($definitions);
  $definitions = $this->pluginManager
    ->removeExcludeDefinitions($definitions);
  $rows = [];
  foreach ($definitions as $plugin_id => $definition) {

    // Skip email handler which has dedicated button.
    if ($plugin_id === 'email') {
      continue;
    }

    /** @var \Drupal\webform\Plugin\WebformHandlerInterface $handler_plugin */
    $handler_plugin = $this->pluginManager
      ->createInstance($plugin_id);

    // Check if applicable.
    if (!$handler_plugin
      ->isApplicable($webform)) {
      continue;
    }

    // Check cardinality.
    $cardinality = $definition['cardinality'];
    $is_cardinality_unlimited = $cardinality === WebformHandlerInterface::CARDINALITY_UNLIMITED;
    $is_cardinality_reached = $webform
      ->getHandlers($plugin_id)
      ->count() >= $cardinality;
    if (!$is_cardinality_unlimited && $is_cardinality_reached) {
      continue;
    }
    $is_submission_required = $definition['submission'] === WebformHandlerInterface::SUBMISSION_REQUIRED;
    $is_results_disabled = $webform
      ->getSetting('results_disabled');
    $row = [];
    if ($is_submission_required && $is_results_disabled) {
      $row['title']['data'] = [
        '#markup' => $definition['label'],
        '#prefix' => '<div class="webform-form-filter-text-source">',
        '#suffix' => '</div>',
      ];
    }
    else {
      $row['title']['data'] = [
        '#type' => 'link',
        '#title' => $definition['label'],
        '#url' => Url::fromRoute('entity.webform.handler.add_form', [
          'webform' => $webform
            ->id(),
          'webform_handler' => $plugin_id,
        ]),
        '#attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($handler_plugin
          ->getOffCanvasWidth()),
        '#prefix' => '<div class="webform-form-filter-text-source">',
        '#suffix' => '</div>',
      ];
    }
    $row['description'] = [
      'data' => [
        '#markup' => $definition['description'],
      ],
    ];
    $row['category'] = $definition['category'];

    // Check submission required.
    if ($is_submission_required && $is_results_disabled) {
      $row['operations']['data'] = [
        '#type' => 'html_tag',
        '#tag' => 'span',
        '#value' => $this
          ->t('Requires saving of submissions.'),
        '#attributes' => [
          'class' => [
            'color-warning',
          ],
        ],
      ];
    }
    else {
      $links['add'] = [
        'title' => $this
          ->t('Add handler'),
        'url' => Url::fromRoute('entity.webform.handler.add_form', [
          'webform' => $webform
            ->id(),
          'webform_handler' => $plugin_id,
        ]),
        'attributes' => WebformDialogHelper::getOffCanvasDialogAttributes($handler_plugin
          ->getOffCanvasWidth()),
      ];
      $row['operations']['data'] = [
        '#type' => 'operations',
        '#links' => $links,
        '#prefix' => '<div class="webform-dropbutton">',
        '#suffix' => '</div>',
      ];
    }
    $rows[] = $row;
  }
  $build['filter'] = [
    '#type' => 'search',
    '#title' => $this
      ->t('Filter'),
    '#title_display' => 'invisible',
    '#size' => 30,
    '#placeholder' => $this
      ->t('Filter by handler name'),
    '#attributes' => [
      'class' => [
        'webform-form-filter-text',
      ],
      'data-element' => '.webform-handler-add-table',
      'data-item-singlular' => $this
        ->t('handler'),
      'data-item-plural' => $this
        ->t('handlers'),
      'title' => $this
        ->t('Enter a part of the handler name to filter by.'),
      'autofocus' => 'autofocus',
    ],
  ];
  $build['handlers'] = [
    '#type' => 'table',
    '#header' => $headers,
    '#rows' => $rows,
    '#sticky' => TRUE,
    '#empty' => $this
      ->t('No handler available.'),
    '#attributes' => [
      'class' => [
        'webform-handler-add-table',
      ],
    ],
  ];
  $build['#attached']['library'][] = 'webform/webform.admin';
  return $build;
}