web-dev-qa-db-fra.com

Comment obtenir la propriété d'un objet de contenu dans Drupal 8

J'essaie d'obtenir la propriété moderation_state à partir d'un objet nœud dans Drupal8 (voir l'image jointe); cependant, je ne peux pas trouver comment procéder. Dans Drupal7, c'était assez simple $node->moderation_state.

Comment puis-je obtenir cette valeur dans Drupal8 où $ node est une instance de Drupal\node\Entity\Node?

J'ai essayé: $ node-> moderation_state $ node-> moderation_state-> value

attached image

7
Benjen

Tout d'abord, quelques informations.

Lorsque vous tapez $node->something, Vous obtenez un FieldItemListInterface . Comment savez-vous quelles valeurs vous pouvez utiliser pour something? Eh bien, vous pouvez demander à l'entité. $node->getFieldDefinitions()

Vous avez maintenant un FieldItemListInterface que vous pouvez parcourir ses valeurs, ou dans le cas d'un champ à valeur unique, juste son premier. Ainsi, même si vous utilisez $node->title, Le titre est un FieldItemListInterface même si vous ne vous attendez qu'à un élément dans la liste.

Permet donc d'obtenir la première valeur de la liste. $node->something->get(0). Cela vous donne un FieldItemInterface . De là, vous pouvez accéder aux propriétés de l'élément de champ. Par exemple. $node->title->get(0)->get('value'). Chacun d'eux est une instance de TypedDataInterface . Mais comment savez-vous ce que vous pouvez utiliser pour value. Par exemple. Pour un champ de référence d'entité $node->some_er_field->target_id Est valide mais $node->some_er_field->value Ne l'est pas. Eh bien, vous pouvez demander à FieldItemInterface comme si $node->title->get(0)->getProperties(). Ou bien, vous pouvez connaître le type de données du champ et inspecter sa méthode propertyDefinitions. Par exemple. dans le cas du champ moderation_state, il utilise un champ Entity Reference pour suivre la référence à l'entité de configuration de l'état de modération. Cela signifie donc que chaque FieldItemInterface est en fait un EntityReferenceItem et vous pouvez vérifier sa méthode :: propertyDefinitions () pour voir quelles propriétés il définit.

Alors maintenant, vous avez un objet TypedDataInterface, comment obtenez-vous sa valeur? Eh bien, vous utilisez sa méthode ::getValue().

Mais attendez pourquoi $node->title->value Fonctionne - je n'ai pas à écrire $node->title->get(0)->get('value')->getValue() - c'est parce que nous utilisons méthodes magiques PHP sur FieldItemListInterface et FieldItemInterface tels que $node->title->value appelle $node->title->get(0)->get('value')->getValue() pour vous.

Donc en résumé:

  • $node->moderation_state->get(0)->get('target_id')->getValue() vous donnera l'ID de l'entité de configuration de l'état de modération.
  • $node->moderation_state->get(0)->get('entity')->getValue() vous donnera l'entité de configuration ModerationState, vous pouvez donc utiliser ses méthodes directement comme ::isPublished() et ::label().
  • $node->moderation_state->target_id Et $node->moderation_state->entity Obtiendraient la même chose respectivement.

J'ai fait un discours éclair sur mes collègues à ce sujet, si vous êtes intéressé, les diapositives sont ici malheureusement, l'enregistrement n'a pas fonctionné.

13
larowlan

Il s'agit d'une valeur protégée. Vous ne pourrez pas y accéder avec kint () ou toArray (). L'objet nœud protège cela, car il souhaite que vous utilisiez l'interface de nœud pour lire l'état:

$node->isPublished()

Cette gestion stricte des valeurs protégées dans drupal 8 permettra à votre code de survivre plus longtemps, espérons-le dans drupal 9 et au-delà. Parce qu'il y a maintenant des changements à l'intérieur de l'objet nœud) possible, sans refléter l'interface vers l'extérieur.

Edit: recherché dans le noyau pour moderation_state, Il n'est pas là, probablement contrib. Vous devez rechercher dans les méthodes disponibles, quelle fonction publique vous donnera les informations similaires à $node->isPublished(), qui est pour status.

1
4k4