我是开发人员,但我之前没有接触过salesforce。
我得到了这个:
<td class="textAlignRight">
<apex:outputPanel rendered="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c<>''}"><img src="{!relatedTo.c2g__OwnerCompany__r.c2g__LogoURL__c}"/>
</apex:outputPanel>
</td>
并且告诉我不应该放入OwnerCompany的徽标,而应该放置Parent的徽标,但如果Parent的LogoURL属性为空,我应该放入它的父级LogoURL,依此类推,直到我找到了一个徽标或没有更多的父母,在这种情况下我应该将OwnerCompany LogoURL放入。
我在浏览salesforce使用的语言时遇到了麻烦。有没有人有任何想法我怎么能解决这个问题?某种函数调用带循环的方法?
编辑:
显然它需要这样做:
Invoice > Account > LogoURL
Invoice > Account > ParentAccount > LogoURL
Invoice > Account > ParentAccount > ParentAccount > LogoURL
等
其中Invoice是relatedToType。
所以我想我需要检查LogoURL,如果是空白检查ParentAccount,如果是空白,请检查ParentAccount.ParentAccount等,如果最后一个是空白,请使用
发票&gt;所有者公司&gt; LogoURL
答案 0 :(得分:1)
我会对此进行抨击......此代码假设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>