itmek-Symfony'de bir miras bağlamında nesneleri seçme konusunda sorun

3 Cevap php


I have an issue that is quite annoying with symfony 1.2 and propel.
I have a model where I have implemented inheritance using the single-table strategy. So, here is an excerpt of my model:
Ad (id, posted_date, description) then RealEstateAd(location, price, transaction_type) and JobAd(position, requirements, company) which inherit both from Ad.

I would like to display all ads, but I would like to display a RealEstateAd differently from a JobAd. To achieve this, I've used a partial for a RealEstateAd and a partial for a JobAd.
So, in the action, I did this:

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

Şablonda, ben her nesnenin sınıfını kontrol edin:

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

The problem is that class of an object in the $allAds array is sfOutputEscaperObjectDecorator. So, nothing is displayed at all.

Bu sorunu nasıl başa olabilir? sınıf RealEstateAd veya JobAd aslında nesnelerin bir dizisini almak için bir yolu var mı? Nasıl nemlendirici işlemi burada yapılır?

3 Cevap

sfOutputEscaperObjectDecorator undelying nesneyi almak için raw method vardır.

Her neyse, yapabileceğiniz en iyi şey, üç farklı sınıfları (i gayrimenkul ve iş ilanları Modelleri olduğunu varsayıyorum) sahip olmaktır

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'; } }

so you can just call print $myAd; in your view without checking the object types. (use polymorphism luke)

Ben Symfony hakkında çok şey biliyor ya da itmek, bu yüzden burada yoldasın isem özür diliyorum ve sadece bu mesajı göz ardı etmeyin ...

Ne reklamların türleri arasındaki farkı ayırt etmek bazı metodolojisini kullanan bir yardımcı işlevi getAdType() oluşturursanız.

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

Bir şey yanlış anlama olabilir, ama AdPeer :: doSelect () aşırı sürece, o zaman sadece Ad örneğinin bir dizi döndürür.

Eğer şema sonrası olsaydı bu nesne modeli inşa ettik gerçekten nasıl belli değil gibi bana ya da başkalarına yardım etmek için, daha kolay olurdu. RealEstateAd schema.yml tanımlanan bir propel sınıf mı? veya size lib eklediğiniz özel bir sınıf mıdır?

Her halükarda, AdPeer :: doSelect * Sadece Ad dönecektir, bu yüzden ne gerek AdPeer özel bir retriever gibi geliyor. Yine, şeması hakkında daha fazla bilgi yardımcı olacaktır.