X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ftaxonomy%2Fsrc%2FPlugin%2FEntityReferenceSelection%2FTermSelection.php;fp=web%2Fcore%2Fmodules%2Ftaxonomy%2Fsrc%2FPlugin%2FEntityReferenceSelection%2FTermSelection.php;h=059225029d74b9e26e92f95764f30d73fae6f469;hp=9d97a55f11f02022eec4a799d5bee7164727a491;hb=0bf8d09d2542548982e81a441b1f16e75873a04f;hpb=74df008bdbb3a11eeea356744f39b802369bda3c diff --git a/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php b/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php index 9d97a55f1..059225029 100644 --- a/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php +++ b/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php @@ -28,7 +28,7 @@ class TermSelection extends DefaultSelection { 'sort' => [ 'field' => 'name', 'direction' => 'asc', - ] + ], ] + parent::defaultConfiguration(); } @@ -59,10 +59,17 @@ class TermSelection extends DefaultSelection { $bundles = $this->entityManager->getBundleInfo('taxonomy_term'); $bundle_names = $this->getConfiguration()['target_bundles'] ?: array_keys($bundles); + $has_admin_access = $this->currentUser->hasPermission('administer taxonomy'); + $unpublished_terms = []; foreach ($bundle_names as $bundle) { if ($vocabulary = Vocabulary::load($bundle)) { + /** @var \Drupal\taxonomy\TermInterface[] $terms */ if ($terms = $this->entityManager->getStorage('taxonomy_term')->loadTree($vocabulary->id(), 0, NULL, TRUE)) { foreach ($terms as $term) { + if (!$has_admin_access && (!$term->isPublished() || in_array($term->parent->target_id, $unpublished_terms))) { + $unpublished_terms[] = $term->id(); + continue; + } $options[$vocabulary->id()][$term->id()] = str_repeat('-', $term->depth) . Html::escape($this->entityManager->getTranslationFromContext($term)->label()); } } @@ -72,4 +79,63 @@ class TermSelection extends DefaultSelection { return $options; } + /** + * {@inheritdoc} + */ + public function countReferenceableEntities($match = NULL, $match_operator = 'CONTAINS') { + if ($match) { + return parent::countReferenceableEntities($match, $match_operator); + } + + $total = 0; + $referenceable_entities = $this->getReferenceableEntities($match, $match_operator, 0); + foreach ($referenceable_entities as $bundle => $entities) { + $total += count($entities); + } + return $total; + } + + /** + * {@inheritdoc} + */ + protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') { + $query = parent::buildEntityQuery($match, $match_operator); + + // Adding the 'taxonomy_term_access' tag is sadly insufficient for terms: + // core requires us to also know about the concept of 'published' and + // 'unpublished'. + if (!$this->currentUser->hasPermission('administer taxonomy')) { + $query->condition('status', 1); + } + return $query; + } + + /** + * {@inheritdoc} + */ + public function createNewEntity($entity_type_id, $bundle, $label, $uid) { + $term = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); + + // In order to create a referenceable term, it needs to published. + /** @var \Drupal\taxonomy\TermInterface $term */ + $term->setPublished(); + + return $term; + } + + /** + * {@inheritdoc} + */ + public function validateReferenceableNewEntities(array $entities) { + $entities = parent::validateReferenceableNewEntities($entities); + // Mirror the conditions checked in buildEntityQuery(). + if (!$this->currentUser->hasPermission('administer taxonomy')) { + $entities = array_filter($entities, function ($term) { + /** @var \Drupal\taxonomy\TermInterface $term */ + return $term->isPublished(); + }); + } + return $entities; + } + }