farmOS/modules/core/quick/src/Traits/QuickPrepopulateTrait.php

108 lines
3.5 KiB
PHP

<?php
namespace Drupal\farm_quick\Traits;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Form\FormStateInterface;
/**
* Provides methods for loading prepopulated entity references.
*/
trait QuickPrepopulateTrait {
/**
* Returns the quick form ID.
*
* This must be implemented by the quick form class that uses this trait.
*
* @see \Drupal\farm_quick\Plugin\QuickForm\QuickFormInterface
*
* @return string
* The quick form ID.
*/
abstract public function getQuickId();
/**
* Get prepopulated entities.
*
* @param string $entity_type
* The entity type to prepopulate.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*
* @return \Drupal\Core\Entity\EntityInterface[]
* An array of entities.
*/
protected function getPrepopulatedEntities(string $entity_type, FormStateInterface $form_state) {
// Initialize a temporary value in the form state.
if (!$form_state->hasTemporaryValue("quick_prepopulate_$entity_type")) {
$this->initPrepoluatedEntities($entity_type, $form_state);
}
// Return the prepopulated entities saved in the form state.
$entity_ids = $form_state->getTemporaryValue("quick_prepopulate_$entity_type") ?? [];
return \Drupal::entityTypeManager()->getStorage($entity_type)->loadMultiple($entity_ids);
}
/**
* Helper function to initialize prepopulated entities in the form state.
*
* @param string $entity_type
* The entity type to prepopulate.
* @param \Drupal\Core\Form\FormStateInterface $form_state
* The form state.
*/
protected function initPrepoluatedEntities(string $entity_type, FormStateInterface $form_state) {
// Save the current user.
$user = \Drupal::currentUser();
// Load the temp store for the quick form.
/** @var \Drupal\Core\TempStore\PrivateTempStoreFactory $temp_store_factory */
$temp_store_factory = \Drupal::service('tempstore.private');
$temp_store = $temp_store_factory->get('farm_quick.' . $this->getQuickId());
// Load entities from the temp store.
$temp_store_key = $user->id() . ':' . $entity_type;
$temp_store_entities = $temp_store->get($temp_store_key) ?? [];
// Convert entities to entity ids.
$temp_store_entity_ids = array_map(function (EntityInterface $entity) {
return $entity->id();
}, $temp_store_entities);
// Load entities from the query params.
$query = \Drupal::request()->query;
$query_entity_ids = $query->get('asset') ?? [];
// Wrap in an array, if necessary.
if (!is_array($query_entity_ids)) {
$query_entity_ids = [$query_entity_ids];
}
// Only include the unique ids.
$entity_ids = array_unique(array_merge($temp_store_entity_ids, $query_entity_ids));
// Filter to entities the user has access to.
$accessible_entities = [];
if (!empty($entity_ids)) {
// Return entities the user has access to.
$entities = \Drupal::entityTypeManager()->getStorage($entity_type)->loadMultiple($entity_ids);
$accessible_entities = array_filter($entities, function (EntityInterface $asset) use ($user) {
return $asset->access('view', $user);
});
}
// Save the accessible entity ids as a temporary value in the form state.
$accessible_entity_ids = array_map(function (EntityInterface $entity) {
return $entity->id();
}, $accessible_entities);
$form_state->setTemporaryValue("quick_prepopulate_$entity_type", $accessible_entity_ids);
// Finally, remove the entities from the temp store.
$temp_store->delete($temp_store_key);
}
}