[英]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]
但是我怀疑这是一个文本/选择列表字段...然后-大致来说是这样的:
<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.