0

所以,假设我有以下 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
 ...                                             ...

ETC...

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

有没有人可以采取另一种方法来解决这个问题?

4

2 回答 2

1
   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>
于 2013-01-24T07:11:11.297 回答
1

如果您的“部门” (自定义字段?)是对单独对象的查找,那将会容易得多。这就是 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 个用于存储桶内容(如果第二个循环将是<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>
于 2013-01-24T09:39:24.717 回答