/** * Update ancestry field of any child that has this as its first parent. * * @var \Drupal\Core\Entity\EntityInterface $discussion * A discussion node that may have had its ancestry updating. */ public function updateChildrensAncestry(ContentEntityInterface $discussion) { if ($discussion->hasField('field_parents') && $discussion->hasField('field_ancestry') && $discussion->hasField('field_ancestry_plain')) { // If own ancestry has changed, update children's ancestry. $newAncestry = $discussion->field_ancestry->getValue(); $oldAncestry = empty($discussion->original) ? NULL : $discussion->original->field_ancestry->getValue(); if ($newAncestry !== $oldAncestry) { $children = $discussion->field_children->referencedEntities(); $childAncestry = $newAncestry; $childAncestry[] = ["target_id" => $discussion->id()]; foreach ($children as $child) { // Only update children's ancestry if they are a discussion. if ($child->bundle() == 'discussion') { // Only update children's ancestry if this is their first parent. if ($child->field_parents->entity->id() === $discussion->id()) { // Only update children's ancestry if child is not already included. if (!$this->withinAncestry($child, $childAncestry)) { $child->field_ancestry = $childAncestry; $child->field_ancestry_plain = $this->makePlain($child->field_ancestry); $child->save(); } } } } } } }
/** * {@inheritdoc} */ public function getEntityReferenceTargetIds(ContentEntityInterface $entity, $field_name, $sort = FALSE) { $target_ids = []; if ($entity->hasField($field_name)) { $field_values = $entity->get($field_name)->getValue(); foreach ($field_values as $field_value) { $target_ids[] = $field_value['target_id']; } } if ($sort) { asort($target_ids); } return $target_ids; }
/** * {@inheritdoc} */ public function create(ContentEntityInterface $entity, $fields) { $query = $this->database->insert('comment_entity_statistics')->fields(array('entity_id', 'entity_type', 'field_name', 'cid', 'last_comment_timestamp', 'last_comment_name', 'last_comment_uid', 'comment_count')); foreach ($fields as $field_name => $detail) { // Skip fields that entity does not have. if (!$entity->hasField($field_name)) { continue; } // Get the user ID from the entity if it's set, or default to the // currently logged in user. $last_comment_uid = 0; if ($entity instanceof EntityOwnerInterface) { $last_comment_uid = $entity->getOwnerId(); } if (!isset($last_comment_uid)) { // Default to current user when entity does not implement // EntityOwnerInterface or author is not set. $last_comment_uid = $this->currentUser->id(); } // Default to REQUEST_TIME when entity does not have a changed property. $last_comment_timestamp = REQUEST_TIME; if ($entity instanceof EntityChangedInterface) { $last_comment_timestamp = $entity->getChangedTime(); } $query->values(array('entity_id' => $entity->id(), 'entity_type' => $entity->getEntityTypeId(), 'field_name' => $field_name, 'cid' => 0, 'last_comment_timestamp' => $last_comment_timestamp, 'last_comment_name' => NULL, 'last_comment_uid' => $last_comment_uid, 'comment_count' => 0)); } $query->execute(); }
/** * Evaluate if the user has access to the field of an entity. * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity to check access on. * @param string $field * The name of the field to check access on. * @param string $operation * The operation access should be checked for. Usually one of "view" or * "edit". * @param \Drupal\Core\Session\AccountInterface $user * The user account to test access against. * * @return bool * TRUE if the user has access to the field on the entity, FALSE otherwise. */ protected function doEvaluate(ContentEntityInterface $entity, $field, $operation, AccountInterface $user) { if (!$entity->hasField($field)) { return FALSE; } $access = $this->entityTypeManager->getAccessControlHandler($entity->getEntityTypeId()); if (!$access->access($entity, $operation, $user)) { return FALSE; } $definition = $entity->getFieldDefinition($field); $items = $entity->get($field); return $access->fieldAccess($operation, $definition, $user, $items); }