Drupal modules for browsing and managing Fedora-based digital repositories.
 
 
 
 

165 lines
4.7 KiB

<?php
namespace Drupal\islandora\Controller;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Entity\Controller\EntityController;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Link;
use Drupal\islandora\IslandoraUtils;
use Drupal\node\NodeInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Page to select new type to add as member.
*/
class ManageMembersController extends EntityController {
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The entity field manager.
*
* @var \Drupal\Core\Entity\EntityFieldManagerInterface
*/
protected $entityFieldManger;
/**
* The renderer.
*
* @var \Drupal\Core\Render\RendererInterface
*/
protected $renderer;
/**
* Islandora Utils.
*
* @var \Drupal\islandora\IslandoraUtils
*/
protected $utils;
/**
* Constructor.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
* The entity field manager.
* @param \Drupal\Core\Render\RendererInterface $renderer
* The renderer.
* @param \Drupal\islandora\IslandoraUtils $utils
* Islandora utils.
*/
public function __construct(
EntityTypeManagerInterface $entity_type_manager,
EntityFieldManagerInterface $entity_field_manager,
RendererInterface $renderer,
IslandoraUtils $utils
) {
$this->entityTypeManager = $entity_type_manager;
$this->entityFieldManager = $entity_field_manager;
$this->renderer = $renderer;
$this->utils = $utils;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity_type.manager'),
$container->get('entity_field.manager'),
$container->get('renderer'),
$container->get('islandora.utils')
);
}
/**
* Renders a list of types to add as members.
*
* @param \Drupal\node\NodeInterface $node
* Node you want to add a member to.
*/
public function addToNodePage(NodeInterface $node) {
$field = IslandoraUtils::MEMBER_OF_FIELD;
$add_node_list = $this->generateTypeList(
'node',
'node_type',
'node.add',
'node.type_add',
$field,
['query' => ["edit[$field][widget][0][target_id]" => $node->id()]]
);
return [
'#type' => 'markup',
'#markup' => $this->t("These available content types below have <em>@field</em> and it is configured to allow this content type.",
['@field' => $field]),
'add_node' => $add_node_list,
];
}
/**
* Renders a list of content types to add as members.
*/
protected function generateTypeList($entity_type, $bundle_type, $entity_add_form, $bundle_add_form, $field, array $url_options) {
$type_definition = $this->entityTypeManager->getDefinition($bundle_type);
$build = [
'#theme' => 'entity_add_list',
'#bundles' => [],
'#cache' => ['tags' => $type_definition->getListCacheTags()],
];
$bundles = $this->entityTypeManager->getStorage($bundle_type)->loadMultiple();
$access_control_handler = $this->entityTypeManager->getAccessControlHandler($entity_type);
foreach (array_keys($bundles) as $bundle_id) {
$bundle = $bundles[$bundle_id];
// Skip bundles that don't have the specified field.
$fields = $this->entityFieldManager->getFieldDefinitions($entity_type, $bundle_id);
if (!isset($fields[$field])) {
continue;
}
$build['#bundles'][$bundle_id] = [
'label' => $bundle->label(),
'description' => $bundle->getDescription(),
'add_link' => Link::createFromRoute(
$bundle->label(),
$entity_add_form,
[$bundle_type => $bundle->id()],
$url_options
),
];
}
// Filter out bundles the user can't create.
foreach (array_keys($bundles) as $bundle_id) {
$access = $access_control_handler->createAccess($bundle_id, NULL, [], TRUE);
if (!$access->isAllowed()) {
unset($build['#bundles'][$bundle_id]);
}
$this->renderer->addCacheableDependency($build, $access);
}
// Build the message shown when there are no bundles.
$type_label = $type_definition->getSingularLabel();
$link_text = $this->t('Add a new @entity_type.', ['@entity_type' => $type_label]);
$build['#add_bundle_message'] = $this->t('There is no @entity_type yet. @add_link', [
'@entity_type' => $type_label,
'@add_link' => Link::createFromRoute($link_text, $bundle_add_form)->toString(),
]);
return $build;
}
}