Created
February 9, 2024 02:55
-
-
Save colemanw/86fac8d5c4c920e2e95a1cffaafefd2e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Civi\Mixin\EntityTypesXmlV1; | |
class Loader { | |
private \CRM_Extension_MixInfo $mixInfo; | |
public function __construct(\CRM_Extension_MixInfo $mixInfo) { | |
$this->mixInfo = $mixInfo; | |
} | |
/** | |
* @return \SimpleXMLElement[] | |
*/ | |
public function getEntityDefinitions(): array { | |
$definitions = []; | |
$files = (array) glob($this->mixInfo->getPath("xml/schema/CRM/*/*.xml")); | |
foreach ($files as $file) { | |
$dom = new \DomDocument(); | |
$xmlString = file_get_contents($file); | |
$dom->loadXML($xmlString); | |
$definition = simplexml_import_dom($dom); | |
if (!$definition) { | |
throw new \CRM_Core_Exception("Unable to load entity file $file"); | |
} | |
$definitions[] = $definition; | |
} | |
return $definitions; | |
} | |
} | |
/** | |
* Auto-register entity declarations from `xml/schema/...*.xml`. | |
* | |
* @mixinName entity-types-xml | |
* @mixinVersion 1.0.0 | |
* @since 5.71 | |
* | |
* @param CRM_Extension_MixInfo $mixInfo | |
* On newer deployments, this will be an instance of MixInfo. On older deployments, Civix may polyfill with a work-a-like. | |
* @param \CRM_Extension_BootCache $bootCache | |
* On newer deployments, this will be an instance of MixInfo. On older deployments, Civix may polyfill with a work-a-like. | |
*/ | |
return function ($mixInfo, $bootCache) { | |
/** | |
* @param \Civi\Core\Event\GenericHookEvent $e | |
* @implements CRM_Utils_Hook::entityTypes | |
*/ | |
Civi::dispatcher()->addListener('hook_civicrm_entityTypes', function ($e) use ($mixInfo) { | |
// When deactivating on a polyfill/pre-mixin system, listeners may not cleanup automatically. | |
if (!$mixInfo->isActive()) { | |
return; | |
} | |
$loader = new Loader($mixInfo); | |
foreach ($loader->getEntityDefinitions() as $definition) { | |
$shortName = trim((string) $definition->class); | |
$base = str_replace('/', '_', trim((string) $definition->base)); | |
$e->entityTypes[$shortName] = [ | |
'name' => $shortName, | |
'class' => $base . '_DAO_' . $shortName, | |
'table' => trim((string) $definition->name), | |
]; | |
} | |
}); | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment