2013-01-23 55 views
0

因此,基於字段值聯繫表,說我有以下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 
...            ... 

等等

有沒有辦法做到這一點內嵌在心尖pageblock?或者我必須爲每個部門製作一個獨特的分頁區塊?

有沒有人有另一種方法可以解決這個問題?

回答

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