use Drupal\Core\Config\Entity\DraggableListBuilder;
use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Render\RendererInterface;
+use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Url;
+use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Defines a class to build a listing of taxonomy vocabulary entities.
*/
protected $entitiesKey = 'vocabularies';
+ /**
+ * The current user.
+ *
+ * @var \Drupal\Core\Session\AccountInterface
+ */
+ protected $currentUser;
+
+ /**
+ * The entity manager.
+ *
+ * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+ */
+ protected $entityTypeManager;
+
+ /**
+ * The renderer service.
+ *
+ * @var \Drupal\Core\Render\RendererInterface
+ */
+ protected $renderer;
+
+ /**
+ * Constructs a new VocabularyListBuilder object.
+ *
+ * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+ * The entity type definition.
+ * @param \Drupal\Core\Session\AccountInterface $current_user
+ * The current user.
+ * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+ * The entity manager service.
+ * @param \Drupal\Core\Render\RendererInterface $renderer
+ * The renderer service.
+ */
+ public function __construct(EntityTypeInterface $entity_type, AccountInterface $current_user, EntityTypeManagerInterface $entity_type_manager, RendererInterface $renderer = NULL) {
+ parent::__construct($entity_type, $entity_type_manager->getStorage($entity_type->id()));
+
+ $this->currentUser = $current_user;
+ $this->entityTypeManager = $entity_type_manager;
+ $this->renderer = $renderer;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+ return new static(
+ $entity_type,
+ $container->get('current_user'),
+ $container->get('entity_type.manager'),
+ $container->get('renderer')
+ );
+ }
+
/**
* {@inheritdoc}
*/
$operations['edit']['title'] = t('Edit vocabulary');
}
- $operations['list'] = [
- 'title' => t('List terms'),
- 'weight' => 0,
- 'url' => $entity->urlInfo('overview-form'),
- ];
- $operations['add'] = [
- 'title' => t('Add terms'),
- 'weight' => 10,
- 'url' => Url::fromRoute('entity.taxonomy_term.add_form', ['taxonomy_vocabulary' => $entity->id()]),
- ];
+ if ($entity->access('access taxonomy overview')) {
+ $operations['list'] = [
+ 'title' => t('List terms'),
+ 'weight' => 0,
+ 'url' => $entity->toUrl('overview-form'),
+ ];
+ }
+
+ $taxonomy_term_access_control_handler = $this->entityTypeManager->getAccessControlHandler('taxonomy_term');
+ if ($taxonomy_term_access_control_handler->createAccess($entity->id())) {
+ $operations['add'] = [
+ 'title' => t('Add terms'),
+ 'weight' => 10,
+ 'url' => Url::fromRoute('entity.taxonomy_term.add_form', ['taxonomy_vocabulary' => $entity->id()]),
+ ];
+ }
+
unset($operations['delete']);
return $operations;
public function buildHeader() {
$header['label'] = t('Vocabulary name');
$header['description'] = t('Description');
+
+ if ($this->currentUser->hasPermission('administer vocabularies')) {
+ $header['weight'] = t('Weight');
+ }
+
return $header + parent::buildHeader();
}
unset($this->weightKey);
}
$build = parent::render();
- $build['table']['#empty'] = t('No vocabularies available. <a href=":link">Add vocabulary</a>.', [':link' => \Drupal::url('entity.taxonomy_vocabulary.add_form')]);
+
+ // If the weight key was unset then the table is in the 'table' key,
+ // otherwise in vocabularies. The empty message is only needed if the table
+ // is possibly empty, so there is no need to support the vocabularies key
+ // here.
+ if (isset($build['table'])) {
+ $access_control_handler = $this->entityTypeManager->getAccessControlHandler('taxonomy_vocabulary');
+ $create_access = $access_control_handler->createAccess(NULL, NULL, [], TRUE);
+ $this->renderer->addCacheableDependency($build['table'], $create_access);
+ if ($create_access->isAllowed()) {
+ $build['table']['#empty'] = t('No vocabularies available. <a href=":link">Add vocabulary</a>.', [
+ ':link' => Url::fromRoute('entity.taxonomy_vocabulary.add_form')->toString()
+ ]);
+ }
+ else {
+ $build['table']['#empty'] = t('No vocabularies available.');
+ }
+ }
+
return $build;
}