繁体   English   中英

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

[英]partition a table of Contacts based on a field value in VisualForce

因此,假设我有以下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>

和以下相应的控制器:

public List<Contact> contacts = [SELECT name, division, email FROM Contact];

假设我想按部门拆分此表(即,当有一个新部门时,我希望在表中放置一个标题,以读取部门名称,然后将该部门内所有联系人的姓名和电子邮件发送给出现在标题下...类似于以下内容:

[                    Division 1                    ]
 Email                                           Name
    ....                                         ...
    ...                                          ...
    ...                                          ...
 [                   Division 2                    ]
  Email                                         Name
  ...                                           ...
 [                   Division 3                    ]
  Email                                        Name
 ...                                             ...

等等...

有没有办法在顶点分页中内联? 还是我必须为每个部门制作一个唯一的分页?

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

   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>

如果您的“部门” (自定义字段?) 将是对单独对象的查找,则将 容易得多 这就是Salesforce中的关系,以及SOQL中这种奇怪的语法。 您可以简单地使用子查询和2个循环:

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

这类似于

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

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

  1. 将您选择的结果放入存储桶,每个分区1个存储桶
  2. (可选)对存储桶名称进行排序(按字母顺序排列?)
  3. 在VF中-使用2个循环,在存储桶上使用1个循环,在存储桶内容上使用第2个循环(如果第2个循环将是<apex:pageBlockTable>而不严格是<apex:repeat>等,就可以了)

样品(未经测试!)

// 1
Map<String, List<Contact>> contactsByDiv = new Map<String, List<Contact>>();
for(Contact c: [SELECT Id, Name, Email, Division__c FROM Contact]){
    List<Contact> contactsInThisDiv = contactsByDiv.get(c.Division__c);
    if(contactsInThisDiv.isEmpty()){
        contactsInThisDiv = new List<Contact>{c};
    } else {
        contactsInThisDiv.add(c);
    }
    contactsByDiv.put(c.Division__c, contactsInThisDiv);
}

// 2
List<String> allDivisions = new List<String>();
allDivisions.addAll(contactsByDiv.keyset());
// I've selected a List to store the Div names because sets are unpredictable. List is easier to sort if you'd want it to
// allDivisions.sort();

<!-- 3 - in VF page -->
<apex:repeat value="{!allDivisions}" var="i">
    <h1>{!i}</h1>
    <apex:pageBlockTable value="{!contactsByDiv[i]}" var="c">
        <apex:column value="{!c.Email}" />
    </apex:pageBlockTable>
</apex:repeat>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM