0

我有一个非常烦人的 symfony 1.2 和推进问题。
我有一个模型,我使用单表策略实现了继承。所以,这里是我的模型的摘录:
广告(id,posted_date,description)然后是从广告继承的RealEstateAd(位置,价格,交易类型)和JobAd(职位,要求,公司)。

我想显示所有广告,但我想以不同于 JobAd 的方式显示 RealEstateAd。为了实现这一点,我为 RealEstateAd 使用了部分,为 JobAd 使用了部分。
所以,在行动中,我这样做了:

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

在模板中,我检查每个对象的类:

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

问题是 $allAds 数组中的对象类是 sfOutputEscaperObjectDecorator。因此,根本没有显示任何内容。

我该如何处理这个问题?有没有办法获得一个包含实际属于 RealEstateAd 或 JobAd 类的对象的数组?这里的补水过程是如何进行的?

4

3 回答 3

1

sfOutputEscaperObjectDecorator 有一个原始方法来获取 undelying 对象。

无论如何,你能做的最好的事情就是拥有三个不同的班级(我假设房地产和招聘广告是模特)

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

所以你可以调用 print $myAd; 在您的视图中而不检查对象类型。(使用多态性卢克)

于 2009-11-30T13:46:35.673 回答
0

我可能会误解一些东西,但除非你重载了 AdPeer::doSelect(),否则它只会返回一个 Ad 实例数组。

如果您要发布您的架构,那么我或其他人会更容易提供帮助,因为目前还不清楚您是如何构建对象模型的。RealEstateAd 是 schema.yml 中定义的推进类吗?还是您添加到 lib 的自定义类?

不管怎样,AdPeer::doSelect* 只会返回 Ad,所以听起来您需要的是 AdPeer 中的自定义检索器。同样,有关您的架构的更多信息将有所帮助。

于 2009-11-29T20:10:15.987 回答
0

我对 symfony 或推进知之甚少,所以如果我在这里偏离基地,我道歉并忽略这篇文章......

如果您创建一个辅助函数getAdType(),该函数使用某种方法来区分不同类型的广告会怎样。

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
于 2009-11-28T18:49:48.290 回答