Comment puis-je trouver une liste des sous-classes pour un modèle de Propel avec l'héritage concret
-
26-09-2019 - |
Question
Je construis un mini-cm pour mon organisme de bienfaisance local (oui, je sais que je pourrais utiliser un projet fil, mais ils veulent codé sur mesure)
Mon schéma de Propel semble actuellement en tant que tel: -
<?xml version="1.0" encoding="UTF-8"?>
<database name="sja" defaultIdMethod="native">
<table name="section">
<column name="id" type="INTEGER" primaryKey="true" required="true" autoIncrement="true" />
<column name="title" type="VARCHAR" required="true" />
<column name="slug" type="VARCHAR" required="true" />
</table>
<table name="page">
<column name="id" type="INTEGER" primaryKey="true" required="true" autoIncrement="true" />
<column name="title" type="VARCHAR" required="true" />
<column name="section_id" type="INTEGER" required="true" />
<foreign-key foreignTable="section">
<reference local="section_id" foreign="id" />
</foreign-key>
</table>
<table name="static_page">
<behavior name="concrete_inheritance">
<parameter name="extends" value="page" />
</behavior>
<column name="content" type="LONGVARCHAR" required="true" />
</table>
<table name="home_page">
<behavior name="concrete_inheritance">
<parameter name="extends" value="page" />
</behavior>
<column name="standfirst_title" type="VARCHAR" />
<column name="standfirst_image" type="VARCHAR" />
<column name="standfirst_content" type="VARCHAR" />
</table>
</database>
Je veux être en mesure d'obtenir une liste qui comprendrait « home_page » et « static_page. » - sans avoir à créer manuellement chaque fois que j'ajouter un nouveau type de page
Y at-il un moyen facile d'obtenir une liste comme ça, ou dois-je écrire des trucs de magie avec des classes de réflexion, etc?
La solution
Après un coup de coude dans la bonne direction de #propel sur freenode - Je suis venu avec cela pour un concept de base - ne l'ont pas encore testé si
function getSubClasses()
{
$map = $this->getDatabaseMap();
$children = array();
foreach ($map->getRelations() AS $relation)
{
$behaviours = $relation->getRightTable()->getBehaviours();
if (issset($behaviours['concrete_inheritance']['extends']) AND $behaviours['concrete_inheritance']['extends'] == $this->getDatabaseMap()->getClassName())
{
$children[] = $relation->getRightTable()->getClassName();
}
}
return $children;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow