2009-11-28 7 views
0

J'ai un problème qui est assez ennuyeux avec symfony 1.2 et propel.
J'ai un modèle où j'ai implémenté l'héritage en utilisant la stratégie de table unique. Donc, voici un extrait de mon modèle:
Annonce (id, posted_date, description) puis RealEstateAd (emplacement, prix, transaction_type) et JobAd (position, exigences, société) qui héritent tous les deux de Ad.problème de sélection d'objets dans un contexte d'héritage dans propel-symfony

Je voudrais afficher toutes les annonces, mais je voudrais afficher un RealEstateAd différemment d'un JobAd. Pour ce faire, j'ai utilisé un partiel pour un RealEstateAd et un partiel pour un JobAd.
Ainsi, dans l'action, je l'ai fait:

$c = new Criteria(); 
$this->allAds = AdPeer::doSelect($c); 

Dans le modèle, je vérifie la classe de chaque objet:

$add = $allAds[$i]; 
if ($add instanceof RealEstateAdd) 
    //Use the RealEstatePartial 

Le problème est que la classe d'un objet dans les allAds $ array est sfOutputEscaperObjectDecorator. Donc, rien n'est affiché du tout.

Comment puis-je résoudre ce problème? est-il un moyen d'obtenir un tableau avec des objets qui sont en réalité de la classe RealEstateAd ou JobAd? Comment s'effectue le processus d'hydratation ici?

+0

J'ai un problème lié à l'héritage Propel à table unique. Les pairs ne retournent pas le bon type d'objets. Toute aide grandement appréciée: http://stackoverflow.com/questions/2067354/propel-single-table-inheritance-issue –

Répondre

0

Je ne sais pas beaucoup sur symfony ou Propel donc si je suis loin de base ici, je présente mes excuses et simplement ignorer ce post ...

si vous créez une fonction d'aide getAdType() qui utilise une méthodologie faire la distinction entre les différents types d'annonces.

function getAdType($ad) { 

    if (isset($ad->position)) { 
     return 'job'; 
    } 
    elseif (isset($ad->transaction_type)) { 
     return 'realestate'; 
    } 

} 

$add = $allAds[$i]; 
if (getAdType($add) == 'realestate') 
    //Use the RealEstatePartial 
+0

C'est une option intéressante Galen. J'ai finalement obtenu que nous pouvons obtenir la classe d'objet en accédant à l'objet décorateur décorateur avec la méthode getRawValue(). – Pattchen

0

je pourrais être mal compris quelque chose, mais à moins que vous avez surchargé AdPeer :: doSelect(), il ne retourne un tableau d'instance de Ad.

Si vous publiiez votre schéma, il serait plus facile pour moi ou pour les autres de vous aider car il n'est pas vraiment clair comment vous avez construit votre modèle d'objet. RealEstateAd est-il une classe propel définie dans schema.yml? ou est-ce une classe personnalisée que vous avez ajoutée à la bibliothèque? Dans les deux cas, AdPeer :: doSelect * ne renverra que l'annonce, ce qui vous donne l'impression que vous avez besoin d'un extracteur personnalisé dans AdPeer. Encore une fois, plus d'informations sur votre schéma vous aidera.

+0

Salut Juan et merci pour votre temps. En fait, AdPeer :: doSelect() ne renvoie pas les objets d'annonce, mais les décorateurs d'objets d'annonce. Comme le fait remarquer gpilotino, il est possible d'obtenir l'objet sous-jacent avec la méthode getRawValue(). Donc, dans mon exemple, je peux faire: $ add-> getRawValue(); et ensuite faire le test: if ($ rawValue instanceof RealEstateAdd) { // ... } – Pattchen

1

sfOutputEscaperObjectDecorator possède un raw method pour obtenir l'objet non utilisé.

Quoi qu'il en soit, la meilleure chose que vous pouvez faire est d'avoir trois classes différentes (je suppose que des biens immobiliers et des annonces d'emploi sont des modèles)

class Ad { public function __toString() { print 'ad'; } } 

class RealEstates extends Ad { public function __toString() { print 'realad'; } } 

class JobAd extends Ad { public function __toString() { print 'jobad'; } } 

de sorte que vous pouvez simplement appeler l'impression Myad de $; dans votre vue sans vérifier les types d'objets. (utiliser le polymorphisme luke)

+0

Merci beaucoup gpilotino. $ add-> getRawValue() fonctionne bien. En fait, j'ai 3 classes dans mon modèle propel: Ad, RealEstateAd et JobAd. – Pattchen