View source
<?php
namespace Drupal\field_encrypt;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\field_encrypt\Entity\EncryptedFieldValue;
use Drupal\field_encrypt\Entity\EncryptedFieldValueInterface;
class EncryptedFieldValueManager implements EncryptedFieldValueManagerInterface {
protected $entityManager;
public function __construct(EntityTypeManagerInterface $entity_manager) {
$this->entityManager = $entity_manager;
}
public function createEncryptedFieldValue(ContentEntityInterface $entity, $field_name, $delta, $property, $encrypted_value) {
$langcode = $entity
->language()
->getId();
if ($encrypted_field_value = $this
->getExistingEntity($entity, $field_name, $delta, $property)) {
$encrypted_field_value
->setEncryptedValue($encrypted_value);
$encrypted_field_value
->save();
}
else {
$encrypted_field_value = $this->entityManager
->getStorage('encrypted_field_value')
->create([
'entity_type' => $entity
->getEntityTypeId(),
'entity_id' => !$entity
->isNew() ? $entity
->id() : NULL,
'entity_revision_id' => $this
->getEntityRevisionId($entity),
'field_name' => $field_name,
'field_property' => $property,
'field_delta' => $delta,
'encrypted_value' => $encrypted_value,
'langcode' => $langcode,
]);
$entity->encrypted_field_values[] = $encrypted_field_value;
}
return $encrypted_field_value;
}
public function saveEncryptedFieldValues(ContentEntityInterface $entity) {
if (!empty($entity->encrypted_field_values)) {
foreach ($entity->encrypted_field_values as $encrypted_field_value) {
if ($encrypted_field_value instanceof EncryptedFieldValueInterface) {
$encrypted_field_value
->set('entity_id', $entity
->id());
$encrypted_field_value
->set('entity_revision_id', $this
->getEntityRevisionId($entity));
$encrypted_field_value
->save();
}
}
unset($entity->encrypted_field_values);
}
}
public function getEncryptedFieldValue(ContentEntityInterface $entity, $field_name, $delta, $property) {
$field_value_entity = $this
->getExistingEntity($entity, $field_name, $delta, $property, $entity
->getRevisionId());
if ($field_value_entity) {
$langcode = $entity
->language()
->getId();
if ($field_value_entity
->hasTranslation($langcode)) {
$field_value_entity = $field_value_entity
->getTranslation($langcode);
}
return $field_value_entity
->getEncryptedValue();
}
return FALSE;
}
public function getExistingEntity(ContentEntityInterface $entity, $field_name, $delta, $property) {
$query = $this->entityManager
->getStorage('encrypted_field_value')
->getQuery()
->condition('entity_type', $entity
->getEntityTypeId())
->condition('entity_id', $entity
->id())
->condition('entity_revision_id', $this
->getEntityRevisionId($entity))
->condition('langcode', $entity
->language()
->getId())
->condition('field_name', $field_name)
->condition('field_delta', $delta)
->condition('field_property', $property);
$values = $query
->execute();
if (!empty($values)) {
$id = array_shift($values);
return EncryptedFieldValue::load($id);
}
return FALSE;
}
public function deleteEntityEncryptedFieldValues(ContentEntityInterface $entity) {
$field_values = $this->entityManager
->getStorage('encrypted_field_value')
->loadByProperties([
'entity_type' => $entity
->getEntityTypeId(),
'entity_id' => $entity
->id(),
]);
if ($field_values) {
$this->entityManager
->getStorage('encrypted_field_value')
->delete($field_values);
}
}
public function deleteEntityEncryptedFieldValuesForField(ContentEntityInterface $entity, $field_name) {
$field_values = $this->entityManager
->getStorage('encrypted_field_value')
->loadByProperties([
'entity_type' => $entity
->getEntityTypeId(),
'field_name' => $field_name,
'entity_revision_id' => $this
->getEntityRevisionId($entity),
]);
if ($field_values) {
$this->entityManager
->getStorage('encrypted_field_value')
->delete($field_values);
}
}
public function deleteEncryptedFieldValuesForField($entity_type, $field_name) {
$field_values = $this->entityManager
->getStorage('encrypted_field_value')
->loadByProperties([
'entity_type' => $entity_type,
'field_name' => $field_name,
]);
if ($field_values) {
$this->entityManager
->getStorage('encrypted_field_value')
->delete($field_values);
}
}
protected function getEntityRevisionId(ContentEntityInterface $entity) {
if ($entity
->isNew()) {
return NULL;
}
return $entity
->getEntityType()
->hasKey('revision') ? $entity
->getRevisionId() : $entity
->id();
}
}