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
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é.
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
.