我将对此进行尝试...此代码假定该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 对您在单个调用的上下文中可以访问数据库的次数施加了严格的限制,因此您需要找到一种方法来限制其查询的数量。如果您可以保证您只有几个级别的父帐户并且没有循环引用,我可能只会使用它:
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>