关于在propel-symfony中继承上下文中选择对象的问题

时间:2009-11-28 18:34:43

标签: php inheritance symfony1 propel

我有一个问题,非常讨厌symfony 1.2和推进。
我有一个模型,我使用单表策略实现了继承。所以,这是我的模型的摘录:
广告(id,posted_date,说明) 然后是继承广告的RealEstateAd(location,price,transaction_type)和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类的对象的数组?如何在这里进行保湿过程?

3 个答案:

答案 0 :(得分:1)

sfOutputEscaperObjectDecorator有raw method来获取未定对象。

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

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;在您的视图中,不检查对象类型。 (使用多态luke)

答案 1 :(得分: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

答案 2 :(得分:0)

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

如果您要发布架构,我或其他人可以更轻松地提供帮助,因为您不太清楚如何构建对象模型。 RealEstateAd是schema.yml中定义的推进类吗?或者它是你添加到lib的自定义类?

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