我有一个问题,非常讨厌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类的对象的数组?如何在这里进行保湿过程?
答案 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中的自定义检索器。同样,有关您的架构的更多信息将有所帮助。