l'héritage de la doctrine. Est-il un moyen facile d'obtenir toutes les classes enfants / tables pour les utiliser dans un champ de sélection dans les formulaires de symfony?

StackOverflow https://stackoverflow.com/questions/2346742

Question

Je viens de commencer à utiliser symfony 1.4 et Doctrine. (Utilisé 1,0 - 1,2 + Propel beaucoup avant).

Je pensais que donner Doctrine essayer, à cause de la rapide et énorme Le processus de développement dans le passé.

Merci à jwage ;-)

Im en utilisant le tableau héritage. Ceci est une petite partie de mon schema.yml:

Articles:
  columns:
id: 
  type: integer(4) 
  primary: true 
  notnull: true 
  autoincrement: true 
marken_id: 
  type: integer(4) 
  notnull: false 
user_id: 
  type: integer(4) 
  notnull: false 
address_id: 
  type: integer(4) 
  notnull: false 

...

Vehicles: 

 inheritance: 
   extends: Articles 
   type: concrete 

Rennfahrzeuge: 
 columns: 
  stvo: 
    type: boolean 
    notnull: false 
    default: false 
 inheritance: 
  extends: Vehicles 
  type: concrete 


Tourenwagen: 
  inheritance: 
   extends: Rennfahrzeuge 
   type: column_aggregation 
   keyField: type 
   keyValue: 1 

...

 Sonstige:
   inheritance: 
   extends: Rennfahrzeuge 
   type: column_aggregation 
   keyField: type 
   keyValue: 6 

 Karts: 
   inheritance: 
   extends: Vehicles 
   type: concrete 
 TonyKart: 
   inheritance: 
   extends: Karts 
   type: column_aggregation 
   keyField: type 
   keyValue: 1 

...

   Sonstige:
   inheritance: 
    extends: Karts 
    type: column_aggregation 
    keyField: type 
    keyValue: 9 

Im pense maintenant à l'aide d'un moyen simple de créer une forme droite.

L'utilisateur devrait avoir à sélectionner des champs en haut de la forme (comme vous peut voir ici: http://msm-esv.dyndns.org/frontend_dev. php / Fahrzeuge / insert )

Vous devez choisir la « classe parente » comme Rennfahrzeuge ou Karts et bientôt.

Après que l'utilisateur doit choisir la classe enfant comme Tourenwagen ou Sonstige.

Ensuite, la page doit recharger et afficher la bonne forme.

Y at-il fonction Doctrine pour obtenir les classes inheritated / enfant pour les afficher dans le second champ de sélection?

(par exemple. Rennfahrzeuge a Tourenwagen, .., ..., a Sonstige et Karts TonyKart, ..., ..., Sonstige)

Après que je pouvais créer dynamiquement la classe sous forme assignée comme:

$chooseMode      = $request->getParameter('chooseMode').'Form'; 
$modeFormClass   = new $chooseMode(); 

ou j'ai pensé à mettre juste le bon modèle dans le parent classe de formulaire.

Que pensez-vous? Je voudrais vraiment apprécier toutes les suggestions et aider :-)

Merci beaucoup,

Marco

Était-ce utile?

La solution

Y at-il des fonctions directes telles qu'une getSubclasses Doctrine ou get_children_of PHP? Non pas que je suis venu à travers, dans la doctrine ou PHP. Le plus proche que je connais est la fonction PHP is_subclass que vous pouvez utiliser en itérer toutes vos classes possibles.

Vos sous-classes varient considérablement de votre modèle principal? Je ne vois dans vos exemples ci-dessus variation d'une colonne, mais je suppose que c'était juste par souci de concision.

Je me rends compte de l'appel de la structure que vous essayez, mais il semble aussi que ça pourrait être la douleur incroyable dans une long terme. Serait-il possible de mettre en place à la place un modèle de VehicleCategory distinct qui se fait référence à fournir une structure imbriquée et votre Vehicles pourrait appartenir à ces catégories? Cela aurait Rennfahrzeuge en tant que catégorie de haut niveau et Tourenwagen et Sonstige serait catégories avec un parent de Rennfahrzeuge avec Vehicles appartenant à tous les trois. Si vous n'avez pas trop de variations de champ dans vos modèles enfants, vous pouvez inclure tous les champs personnalisés dans le modèle Vehicles et afficher uniquement / mettre les au moment opportun.

Juste quelques pensées, espoir qui aide.

Autres conseils

Si vous avez besoin de trouver les sous-classes d'un enregistrement Doctrine vous pouvez utiliser
$yourSuperObject->getTable()->getOption('subclasses') ou
Doctrine::getTable('SuperClass')->getOption('subclasses');

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top