farm-2.x-dev/modules/asset/material/src/EventSubscriber/QuantityEventSubscriber.php
modules/asset/material/src/EventSubscriber/QuantityEventSubscriber.php
<?php
namespace Drupal\farm_material\EventSubscriber;
use Drupal\quantity\Event\QuantityEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Perform actions when quantity entities are saved/deleted.
*/
class QuantityEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*
* @return array
* The event names to listen for, and the methods that should be executed.
*/
public static function getSubscribedEvents() {
return [
QuantityEvent::PRESAVE => 'quantityPresave',
];
}
/**
* Copy material_type from a material inventory asset to material quantity.
*
* @param \Drupal\quantity\Event\QuantityEvent $event
* Quantity event.
*/
public function quantityPresave(QuantityEvent $event) {
$quantity = $event->quantity;
// Bail if not a material quantity.
if ($quantity->bundle() !== 'material') {
return;
}
// Bail if there is no inventory field or if it is empty.
if (!$quantity->hasField('inventory_asset') || $quantity->get('inventory_asset')->isEmpty()) {
return;
}
// Get the referenced inventory asset.
/** @var \Drupal\asset\Entity\AssetInterface[] $assets */
$assets = $event->quantity->get('inventory_asset')->referencedEntities();
$asset = reset($assets);
// Bail if not a material asset.
if (empty($asset) || $asset->bundle() !== 'material') {
return;
}
// Copy the material asset material_type field to the material quantity.
if (!$asset->get('material_type')->isEmpty()) {
$material_type = $asset->get('material_type')->getValue();
$quantity->set('material_type', $material_type);
}
}
}
