X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Ftaxonomy%2Fsrc%2FPlugin%2FEntityReferenceSelection%2FTermSelection.php;h=059225029d74b9e26e92f95764f30d73fae6f469;hb=1c1cb0980bfa6caf0c24cce671b6bb541dc87583;hp=b8f4d14fbe1d334b7fcbf8315998f37715b25ae8;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php b/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php index b8f4d14fb..059225029 100644 --- a/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php +++ b/web/core/modules/taxonomy/src/Plugin/EntityReferenceSelection/TermSelection.php @@ -3,7 +3,6 @@ namespace Drupal\taxonomy\Plugin\EntityReferenceSelection; use Drupal\Component\Utility\Html; -use Drupal\Core\Database\Query\SelectInterface; use Drupal\Core\Entity\Plugin\EntityReferenceSelection\DefaultSelection; use Drupal\Core\Form\FormStateInterface; use Drupal\taxonomy\Entity\Vocabulary; @@ -24,8 +23,13 @@ class TermSelection extends DefaultSelection { /** * {@inheritdoc} */ - public function entityQueryAlter(SelectInterface $query) { - // @todo: How to set access, as vocabulary is now config? + public function defaultConfiguration() { + return [ + 'sort' => [ + 'field' => 'name', + 'direction' => 'asc', + ], + ] + parent::defaultConfiguration(); } /** @@ -34,8 +38,6 @@ class TermSelection extends DefaultSelection { public function buildConfigurationForm(array $form, FormStateInterface $form_state) { $form = parent::buildConfigurationForm($form, $form_state); - $form['target_bundles']['#title'] = $this->t('Available Vocabularies'); - // Sorting is not possible for taxonomy terms because we use // \Drupal\taxonomy\TermStorageInterface::loadTree() to retrieve matches. $form['sort']['#access'] = FALSE; @@ -49,20 +51,25 @@ class TermSelection extends DefaultSelection { */ public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) { if ($match || $limit) { - $this->configuration['handler_settings']['sort'] = ['field' => 'name', 'direction' => 'asc']; return parent::getReferenceableEntities($match, $match_operator, $limit); } $options = []; $bundles = $this->entityManager->getBundleInfo('taxonomy_term'); - $handler_settings = $this->configuration['handler_settings']; - $bundle_names = !empty($handler_settings['target_bundles']) ? $handler_settings['target_bundles'] : array_keys($bundles); + $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; + } + }