0

symfony 1.2 と propel で非常に厄介な問題があります。
単一テーブル戦略を使用して継承を実装したモデルがあります。したがって、ここに私のモデルの抜粋があります:
Ad (id, posted_date, description) 次に、RealEstateAd(location, price, transaction_type) と JobAd(position, requirements, company) で、Ad から両方を継承します。

すべての広告を表示したいのですが、RealEstateAd は JobAd とは異なる方法で表示したいと考えています。これを実現するために、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 には、基になるオブジェクトを取得するraw メソッドがあります。

とにかく、あなたができる最善のことは、3つの異なるクラスを持つことです(不動産と求人広告はモデルだと思います)

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 や propel についてあまり知らないので、ここでベースから外れている場合は、謝罪し、この投稿を無視してください...

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 に答える