Herança da doutrina.Existe uma maneira fácil de obter todas as classes/tabelas filhas para usá-las em um campo de seleção nos formulários do symfony?

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

Pergunta

Acabei de começar a usar o symfony 1.4 e o Doctrine.(Usei 1.0 - 1.2 + Propel muito antes).

Pensei em experimentar a doutrina, por causa do rápido e enorme processo de desenvolvimento no passado.

Obrigado ao jwage ;-)

Estou usando herança de tabela.Esta é uma pequena parte do meu 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 

Agora estou pensando em usar uma maneira simples de criar o formulário certo.

O usuário deve ter que selecionar campos no topo do formulário (como você pode ver aqui: http://msm-esv.dyndns.org/frontend_dev.php/fahrzeuge/insert )

Você deve escolher a "classe dos pais" como Rennfahrzeuge ou Karts e assim por diante.

Depois disso, o usuário deve escolher a classe infantil como Tourenwagen ou Sonstige.

Então a página deve recarregar e exibir o formato correto.

Existe alguma função na doutrina para obter as classes herdadas/filho para exibi -las no segundo campo selecionado?

(por exemplo.Rennfahrzeuge tem Tourenwagen, .., ..., Sonstige e Karts tem Tonykart, ..., ..., Sonstige)

Depois disso, eu poderia criar dinamicamente a classe de formulário atribuída como:

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

Ou pensei em definir o modelo certo na classe de formulário pai.

Quais são seus pensamentos?Eu realmente apreciaria qualquer sugestão e ajuda :-)

Muito obrigado,

Marco

Foi útil?

Solução

Existem funções diretas, como uma Doutrina getSubclasses ou um PHP get_children_of?Não que eu tenha encontrado, em Doctrine ou PHP.O mais próximo que conheço é a função PHP is_subclass que você pode usar enquanto itera por todas as classes possíveis.

Suas subclasses variam significativamente em relação ao seu modelo principal?Vejo apenas uma variação de coluna nos exemplos acima, mas acho que foi apenas por uma questão de brevidade.

Entendo o apelo da estrutura que você está tentando, mas também parece que pode ser uma dor incrível no longo prazo.Seria possível, em vez disso, criar um VehicleCategory modelo que se referenciou para fornecer uma estrutura aninhada e então seu Vehicles poderia pertencer a essas categorias?Isso teria Rennfahrzeuge como uma categoria de nível superior e Tourenwagen e Sonstige seriam categorias com um pai de Rennfahrzeuge com Vehicles pertencente aos três.Se você não tivesse muita variação de campos em seus modelos filhos, você poderia incluir todos os campos personalizados no Vehicles modelo e apenas exibi-los/defini-los nos momentos apropriados.

Apenas algumas reflexões, espero que ajude.

Outras dicas

Se você precisar encontrar as subclasses de um registro de doutrina, você pode usar
$yourSuperObject->getTable()->getOption('subclasses') ou
Doctrine::getTable('SuperClass')->getOption('subclasses');

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top