1

Ok, so I'm trying to populate a field based on the selection of a taxonomy term. I've mainly got it working thanks to this stack exchange article

use Drupal\taxonomy\Entity;

function module_entity_presave(EntityInterface $entity) {

  if($entity->bundle() == "node_type"){
    $bread_slice = $entity->get("field_taxonomy_term")->getString();
    $bread_butter = "- Additional Text for Reasons";
    $bread_title = $bread_slice." ".$bread_butter;
    $entity->field_title->value = $bread_title;
    //save is done automatically
  }  

}

The issue is that, the resulting code doesn't print the name/label of the term, but instead the tid. So, it ends up showing as "757 - Additional Text for Reasons" I barely know any php, but I know enough to get around. I suppose my issue is the fact I'm not getting the correct value from the taxonomy array, yet I'm unsure how. I've tried finding the correct value using some twig debugging, {{dd(data.taxonomy_term)}} but all the values for it show null. Please point me in the direction of how to solve this?

0

2 Answers 2

3

The field only stores term IDs. So either get the term ID and load the term from it or load the referenced entities directly.

/**
 * Implements hook_entity_presave().
 */
function MYMODULE_entity_presave(\Drupal\Core\Entity\EntityInterface $entity) {

  if ($entity instanceof \Drupal\node\NodeInterface && $entity->bundle() === 'MYBUNDLE') {

    if ($field = $entity->get('field_MYFIELD')) {
    
      if (!$field->isEmpty()) {

        $label = $field->referencedEntities()[0]->label();
        // dpm($label);
        // Code on...
      }
    }
  }
}

Consider installing Devel. It gives you some handy debugging helpers like dpm($some_var) to dump variables into core's status messages block so you can inspect them easily.

0
1

You can get the entity from entity reference fields like:

$entity->field_name->entity // or `$entity->get('field_name')->entity` whichever you prefer

if single value, or loop with referencedEntities() method on the field like:

foreach ($entity->field_name->referencedEntities() as $term)
// Or foreach ($entity->get("field_name")->referencedEntities() as $term)

if multi-value (or if you want to keep your code more "general purpose" as this also works for single value fields). Also check if there's anything to work with or exit early, so all together something like:


function module_entity_presave(EntityInterface $entity) {
  if ($entity->getEntityTypeId() !== 'node' || $entity->bundle() !== 'node_type') {
    // Not an entity or bundle we're concerned with.
    return;
  }

  if ($entity->get("field_taxonomy_term")->isEmpty()) {
    // No term to work with.
    return;
  }
  /** @var \Drupal\taxonomy\TermInterface $term */
  $term = $entity->get("field_taxonomy_term")->entity;
  // Translate the text. Term label should be already translated value so pass it
  // as a param.
  $entity->field_title->value = t('@label - Additional Text for Reasons', [
    '@label' => $term->label(),
  ];
}
1
  • 1
    Despite not using this specific solution, I believe this will come in very useful for another part of the project. Especially with the multi-value bit you added. Thank you so much for taking the time to write out this solution. Hopefully, others find it useful as well!
    – Delta2437
    Sep 21, 2020 at 3:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.