Chris@0: [ Chris@0: 'field' => 'name', Chris@0: 'direction' => 'asc', Chris@17: ], Chris@0: ] + parent::defaultConfiguration(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function buildConfigurationForm(array $form, FormStateInterface $form_state) { Chris@0: $form = parent::buildConfigurationForm($form, $form_state); Chris@0: Chris@0: // Sorting is not possible for taxonomy terms because we use Chris@0: // \Drupal\taxonomy\TermStorageInterface::loadTree() to retrieve matches. Chris@0: $form['sort']['#access'] = FALSE; Chris@0: Chris@0: return $form; Chris@0: Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getReferenceableEntities($match = NULL, $match_operator = 'CONTAINS', $limit = 0) { Chris@0: if ($match || $limit) { Chris@0: return parent::getReferenceableEntities($match, $match_operator, $limit); Chris@0: } Chris@0: Chris@0: $options = []; Chris@0: Chris@18: $bundles = $this->entityTypeBundleInfo->getBundleInfo('taxonomy_term'); Chris@0: $bundle_names = $this->getConfiguration()['target_bundles'] ?: array_keys($bundles); Chris@0: Chris@17: $has_admin_access = $this->currentUser->hasPermission('administer taxonomy'); Chris@17: $unpublished_terms = []; Chris@0: foreach ($bundle_names as $bundle) { Chris@0: if ($vocabulary = Vocabulary::load($bundle)) { Chris@17: /** @var \Drupal\taxonomy\TermInterface[] $terms */ Chris@18: if ($terms = $this->entityTypeManager->getStorage('taxonomy_term')->loadTree($vocabulary->id(), 0, NULL, TRUE)) { Chris@0: foreach ($terms as $term) { Chris@17: if (!$has_admin_access && (!$term->isPublished() || in_array($term->parent->target_id, $unpublished_terms))) { Chris@17: $unpublished_terms[] = $term->id(); Chris@17: continue; Chris@17: } Chris@18: $options[$vocabulary->id()][$term->id()] = str_repeat('-', $term->depth) . Html::escape($this->entityRepository->getTranslationFromContext($term)->label()); Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $options; Chris@0: } Chris@0: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function countReferenceableEntities($match = NULL, $match_operator = 'CONTAINS') { Chris@17: if ($match) { Chris@17: return parent::countReferenceableEntities($match, $match_operator); Chris@17: } Chris@17: Chris@17: $total = 0; Chris@17: $referenceable_entities = $this->getReferenceableEntities($match, $match_operator, 0); Chris@17: foreach ($referenceable_entities as $bundle => $entities) { Chris@17: $total += count($entities); Chris@17: } Chris@17: return $total; Chris@17: } Chris@17: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS') { Chris@17: $query = parent::buildEntityQuery($match, $match_operator); Chris@17: Chris@17: // Adding the 'taxonomy_term_access' tag is sadly insufficient for terms: Chris@17: // core requires us to also know about the concept of 'published' and Chris@17: // 'unpublished'. Chris@17: if (!$this->currentUser->hasPermission('administer taxonomy')) { Chris@17: $query->condition('status', 1); Chris@17: } Chris@17: return $query; Chris@17: } Chris@17: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function createNewEntity($entity_type_id, $bundle, $label, $uid) { Chris@17: $term = parent::createNewEntity($entity_type_id, $bundle, $label, $uid); Chris@17: Chris@17: // In order to create a referenceable term, it needs to published. Chris@17: /** @var \Drupal\taxonomy\TermInterface $term */ Chris@17: $term->setPublished(); Chris@17: Chris@17: return $term; Chris@17: } Chris@17: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function validateReferenceableNewEntities(array $entities) { Chris@17: $entities = parent::validateReferenceableNewEntities($entities); Chris@17: // Mirror the conditions checked in buildEntityQuery(). Chris@17: if (!$this->currentUser->hasPermission('administer taxonomy')) { Chris@17: $entities = array_filter($entities, function ($term) { Chris@17: /** @var \Drupal\taxonomy\TermInterface $term */ Chris@17: return $term->isPublished(); Chris@17: }); Chris@17: } Chris@17: return $entities; Chris@17: } Chris@17: Chris@0: }