Commit ceafb171 authored by Nikolay Lobachev's avatar Nikolay Lobachev
Browse files

Issue #3325129: Replace custom pages to add and to relate media items, with...

Issue #3325129: Replace custom pages to add and to relate media items, with pages from group module.
parent 3fff8206
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
group_relationship.group_media_relate_page:
  route_name: 'entity.group_relationship.group_media_relate_page'
  route_name: 'entity.group_relationship.group_media_add_page'
  title: 'Relate media'
  appears_on:
    - 'view.group_media.page_1'

group_relationship.group_media_add_page:
  route_name: 'entity.group_relationship.group_media_add_page'
  route_name: 'entity.group_relationship.group_media_create_page'
  title: 'Create media'
  appears_on:
    - 'view.group_media.page_1'
+0 −3
Original line number Diff line number Diff line
@@ -5,6 +5,3 @@ groupmedia.settings:
    _form: 'Drupal\groupmedia\Form\GroupMediaSettingsForm'
  requirements:
    _permission: 'administer groupmedia'

route_callbacks:
  - '\Drupal\groupmedia\Routing\GroupMediaRouteProvider::getRoutes'
+4 −0
Original line number Diff line number Diff line
services:
  groupmedia.route_subscriber:
    class: 'Drupal\groupmedia\Routing\RouteSubscriber'
    tags:
      - { name: 'event_subscriber' }

  plugin.manager.groupmedia.finder:
    class: Drupal\groupmedia\MediaFinderManager
+0 −91
Original line number Diff line number Diff line
<?php

namespace Drupal\groupmedia\Controller;

use Drupal\group\Entity\Controller\GroupRelationshipController;
use Drupal\group\Entity\GroupInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Returns responses for 'group_media' GroupRelationship routes.
 */
class GroupMediaController extends GroupRelationshipController {

  /**
   * The group relationship type plugin manager.
   *
   * @var \Drupal\group\Plugin\Group\Relation\GroupRelationTypeManagerInterface
   */
  protected $pluginManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    $instance = parent::create($container);
    $instance->pluginManager = $container->get('group_relation_type.manager');
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public function addPage(GroupInterface $group, $create_mode = FALSE, $base_plugin_id = NULL) {
    $build = parent::addPage($group, $create_mode);

    // Do not interfere with redirects.
    if (!is_array($build)) {
      return $build;
    }

    // Overwrite the label and description for all displayed bundles.
    $media_type_storage = $this->entityTypeManager->getStorage('media_type');
    $group_type = $group->getGroupType();
    foreach ($this->addPageBundles($group, $create_mode, $base_plugin_id) as $bundle_id => $bundle) {
      if (!empty($build['#bundles'][$bundle_id])) {
        $plugin = $group_type->getPlugin($bundle->getPluginId());
        $media_type = $plugin->getRelationType()->getEntityBundle();
        $media_type_label = $media_type_storage->load($media_type)->label();
        $t_args = ['%media_type' => $media_type_label];
        $description = $create_mode
          ? $this->t('Create a media of type %media_type in the group.', $t_args)
          : $this->t('Add an existing media of type %media_type to the group.', $t_args);

        $build['#bundles'][$bundle_id]['label'] = $media_type_label;
        $build['#bundles'][$bundle_id]['description'] = $description;
      }
    }

    // Display the bundles in alpha order by label.
    if (is_array($build['#bundles'])) {
      uasort($build['#bundles'], function ($a, $b) {
        return strnatcmp($a['label'], $b['label']);
      });
    }

    return $build;
  }

  /**
   * {@inheritdoc}
   */
  protected function addPageBundles(GroupInterface $group, $create_mode, $base_plugin_id) {
    // Retrieve all group_media plugins for the group's type.
    $plugin_ids = $this->pluginManager->getInstalledIds($group->getGroupType());
    foreach ($plugin_ids as $key => $plugin_id) {
      if (strpos($plugin_id, 'group_media:') !== 0) {
        unset($plugin_ids[$key]);
      }
    }

    // Retrieve all responsible group content types, keyed by plugin ID.
    $storage = $this->entityTypeManager->getStorage('group_relationship_type');
    $properties = [
      'group_type' => $group->bundle(),
      'content_plugin' => $plugin_ids,
    ];

    return $storage->loadByProperties($properties);
  }

}
+0 −57
Original line number Diff line number Diff line
<?php

namespace Drupal\groupmedia\Routing;

use Drupal\media\Entity\MediaType;
use Symfony\Component\Routing\Route;

/**
 * Provides routes for group_media group content.
 */
class GroupMediaRouteProvider {

  /**
   * Provides the shared collection route for group media plugins.
   */
  public function getRoutes() {
    $routes = $plugin_ids = $permissions_add = $permissions_create = [];

    foreach (MediaType::loadMultiple() as $name => $media_bundle) {
      $plugin_id = "group_media:$name";

      $plugin_ids[] = $plugin_id;
      $permissions_add[] = "create $plugin_id content";
      $permissions_create[] = "create $plugin_id entity";
    }

    // If there are no media types yet, we cannot have any plugin IDs and should
    // therefore exit early because we cannot have any routes for them either.
    if (empty($plugin_ids)) {
      return $routes;
    }

    $routes['entity.group_relationship.group_media_relate_page'] = new Route('group/{group}/media/add');
    $routes['entity.group_relationship.group_media_relate_page']
      ->setDefaults([
        '_title' => 'Relate media',
        '_controller' => '\Drupal\groupmedia\Controller\GroupMediaController::addPage',
      ])
      ->setRequirement('_group_permission', implode('+', $permissions_add))
      ->setRequirement('_group_installed_content', implode('+', $plugin_ids))
      ->setOption('_group_operation_route', TRUE);

    $routes['entity.group_relationship.group_media_add_page'] = new Route('group/{group}/media/create');
    $routes['entity.group_relationship.group_media_add_page']
      ->setDefaults([
        '_title' => 'Create media',
        '_controller' => '\Drupal\groupmedia\Controller\GroupMediaController::addPage',
        'create_mode' => TRUE,
      ])
      ->setRequirement('_group_permission', implode('+', $permissions_create))
      ->setRequirement('_group_installed_content', implode('+', $plugin_ids))
      ->setOption('_group_operation_route', TRUE);

    return $routes;
  }

}
Loading