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

等...

頂点ページブロックでインラインでこれを行う方法はありますか? それとも、部門ごとに固有のページブロックを作成する必要がありますか?

この問題を解決するために私が取ることができる別のアプローチを誰かが持っていますか?

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

「Division」 (カスタムフィールド?)が別のオブジェクトへのルックアップである場合は、はるかに簡単になります。これが、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>
于 2013-01-24T09:39:24.717 に答える