私はこれを突き刺します...このコードは、フィールドが取引先レコードを指していると想定しています。これには、親取引先 (存在する場合) を指すc2g__OwnerCompany__r
独自のフィールドがあります。c2g_OwnerCompany__r
VisualForce は、このタイプの再帰のために構築されたものではありません。その理由は次のとおりです。
<apex:variable var="parentLogo" value="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c}" />
<apex:variable var="parentLogo2" value="{!relatedTo.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__LogoURL__c}" />
<apex:variable var="parentLogo3" value="{!relatedTo.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__OwnerCompany__r.c2g__LogoURL__c}" />
<td class="textAlignRight">
<apex:outputPanel rendered="{!parentLogo<>''}">
<img src="{!parentLogo}"/>
</apex:outputPanel>
<apex:outputPanel rendered="{!AND(NOT(parentLogo<>''), parentLogo2<>'')}">
<img src="{!parentLogo2}"/>
</apex:outputPanel>
<apex:outputPanel rendered="{!AND(NOT(parentLogo<>''), NOT(parentLogo2<>'') parentLogo3<>'')}">
<img src="{!parentLogo3}"/>
</apex:outputPanel>
</td>
このアプローチはあまりお勧めしません。VF ページがすぐに台無しになり、開始できるレベル数に制限があるためです。
別の解決策は、再帰をより詳細に制御できるコントローラークラスでこれを処理することです。Salesforce では、1 回の呼び出しでデータベースにアクセスできる回数に厳密な制限が課されていることに注意してください。そのため、これが行うクエリの数を制限する方法を見つけたいと思うでしょう。数レベルの親アカウントしかなく、循環参照がないことを保証できる場合にのみ、おそらくこれを使用します。
public String getLogoUrl() {
String logo;
Account acc= [select Id, c2g__OwnerCompany__c, c2g__LogoURL__c from Account where Id = :relatedTo.c2g__OwnerCompany__c];
// running SOQL queries inside of loops is most certainly NOT a Salesforce best practice
while ( true ) {
logo = acc.c2g__LogoURL__c;
if ( acc.c2g__OwnerCompany__c != null )
acc = [select Id, c2g__OwnerCompany__c, c2g__LogoURL__c from Account where Id = :acc.c2g__OwnerCompany__c];
else
break;
}
return logo;
}
これにより、VF ページが単純化され、最初に作成したものと同様になります。変数は、コントローラーでの呼び出しによってページが読み込まれると、logoUrl
自動的に入力されます。getLogoUrl
<td class="textAlignRight">
<apex:outputPanel rendered="{!AND(NOT(ISNULL(logoUrl)), logoUrl<>'')}">
<img src="{!logoUrl}"/>
</apex:outputPanel>
</td>