Salesforce 根据VisualForce中的字段值对联系人表进行分区

Salesforce 根据VisualForce中的字段值对联系人表进行分区,salesforce,apex-code,visualforce,Salesforce,Apex Code,Visualforce,假设我有下面的visualforce页面: <table width="100%" border="0"> <tr> <td valign="top"> <apex:pageBlock mode="edit" id="results"> <apex:pageBlockTable value="{!contacts}" var="contact">

假设我有下面的visualforce页面:

<table width="100%" border="0">
    <tr>  
      <td valign="top">
        <apex:pageBlock mode="edit" id="results">
           <apex:pageBlockTable value="{!contacts}" var="contact">
               <apex:column >
                   <apex:facet name="header">
                         email
                   </apex:facet>
                   <apex:outputField value="{!contact.email}"/>
                 </apex:column>
                  <apex:column >
                   <apex:facet name="header">
                            Name
                       </apex:facet>
                           <apex:commandLink reRender="detail">{!contact.name}
                     <apex:param name="id" value="{!contact.id}"/>
                       </apex:commandLink>
                    </apex:column>
                </td>
           </tr>
      </table>
等等

有没有办法在apex页面块中内联执行此操作?或者我需要为每个部门制作一个唯一的页面块吗

是否有人可以采用其他方法来解决此问题?

公开列表联系人=[按部门选择姓名、部门、联系人的电子邮件顺序];
   public List<Contact> contacts = [SELECT name, division, email FROM Contact order by division];



     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js" ></script>
 <apex:form >
 <apex:pageBlock mode="edit" id="results">
           <apex:pageBlockTable value="{!contacts}" var="contact">
               <apex:column headerValue="email" >
                    <apex:outputField value="{!contact.email}"/>
                    <span Class="divisionName" division="{!contact.division}"/>
                  </apex:column>
                  <apex:column headerValue="Name" >
                      <apex:commandLink reRender="detail">{!contact.name}
                        <apex:param name="id" value="{!contact.id}"/>
                      </apex:commandLink>
                   </apex:column>
           </apex:pageBlockTable>
    </apex:pageBlock>

  <script>    
 var previous= $('<tr class="myHeaderRow"><td colspan="2">'+''+'</td></tr>') ;
$('.divisionName').each(
   function(index, value){
        if( $(value).attr('division')!=previous.text()){
            $(this).closest('tr').before('<tr style="height: 10px !important;" class="myHeaderRow"><td colspan="2" style="text-align: -webkit-center;">'+$(value).attr('division')+'</td></tr>');
            previous = $(this);
         }
    }
);
</script>   
</apex:form>
{!contact.name} var previous=$(''+''+''); $('.divisionName')。每个( 函数(索引、值){ if($(value).attr('division')!=previous.text()){ $(this).closest('tr')。在('+$(value).attr('division')+'')之前; 上一次=$(本次); } } );
如果您的“划分”(自定义字段?将是对一个单独对象的查找,那将非常非常容易。这就是Salesforce中的关系以及SOQL中的这种奇怪语法的用意所在。您只需使用一个子查询和两个循环:

[SELECT Name, (SELECT Id, Name, Email FROM Contacts__r) FROM Division__c]
类似于

[SELECT Name, (SELECT Id, Name, Email FROM Contacts) FROM Account]

但我怀疑这是一个文本/选择列表字段。。。然后——大致来说是这样的:

  • 将您的选择结果放入桶中,每个分区一个桶
  • 可选地对bucket名称进行排序(按字母顺序?)
  • 在VF中-使用2个循环,1个在桶上,2个在桶内容上(如果第2个循环是
    而不是严格意义上的
    等,则可以)
  • 样本(未经测试!)

    //1
    Map contactsByDiv=新映射();
    对于(联系人c:[从联系人中选择Id、姓名、电子邮件、部门c]){
    列出联系人ThisDiv=contactsByDiv.get(c.Division\uu c);
    如果(联系ThisDiv.isEmpty()){
    contactsInThisDiv=新列表{c};
    }否则{
    本分部新增联系人(c);
    }
    联系人ByDiv.put(c.部门,联系人在此部门);
    }
    // 2
    List allDivisions=新列表();
    allDivisions.addAll(contactsByDiv.keyset());
    //我选择了一个列表来存储Div名称,因为集合是不可预测的。如果您愿意,列表更容易排序
    //allDivisions.sort();
    

    
    {!我}
    
    [SELECT Name, (SELECT Id, Name, Email FROM Contacts__r) FROM Division__c]
    
    [SELECT Name, (SELECT Id, Name, Email FROM Contacts) FROM Account]