. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\FieldProcessing; use Espo\Core\ORM\Entity; use Espo\Core\FieldProcessing\Saver\Params; use Espo\Core\InjectableFactory; use Espo\Core\Utils\Metadata; /** * Processes saving special fields. */ class SaveProcessor { /** @var array[]> */ private $saverListMapCache = []; public function __construct( private InjectableFactory $injectableFactory, private Metadata $metadata ) {} /** * @param array $options */ public function process(Entity $entity, array $options): void { $params = Params::create()->withRawOptions($options); foreach ($this->getSaverList($entity->getEntityType()) as $processor) { $processor->process($entity, $params); } } /** * @return Saver[] */ private function getSaverList(string $entityType): array { if (array_key_exists($entityType, $this->saverListMapCache)) { return $this->saverListMapCache[$entityType]; } $list = []; foreach ($this->getSaverClassNameList($entityType) as $className) { $list[] = $this->createSaver($className); } $this->saverListMapCache[$entityType] = $list; return $list; } /** * @return class-string>[] */ private function getSaverClassNameList(string $entityType): array { $list = $this->metadata ->get(['app', 'fieldProcessing', 'saverClassNameList']) ?? []; $additionalList = $this->metadata ->get(['recordDefs', $entityType, 'saverClassNameList']) ?? []; /** @var class-string>[] */ return array_merge($list, $additionalList); } /** * @param class-string> $className * @return Saver */ private function createSaver(string $className): Saver { return $this->injectableFactory->create($className); } }