在salesforce模板中,如何递归检查父属性?

时间:2012-07-20 13:14:47

标签: salesforce

我是开发人员,但我之前没有接触过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

1 个答案:

答案 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>