1

現在、連絡先レコードに Visualforce ページが埋め込まれています。このページには、連絡先がキャンペーンのメンバーであるかどうかを示すチェックボックスを含むすべてのアクティブなキャンペーンが表示されます (チェックされている場合、連絡先はメンバーです)。変更を保存するためのコマンド ボタンもあります。Visualforce コードは、次のようにapex:repeatを使用して生成されます。

<apex:repeat value="{!campaignWrappers}" var="cm">
  <div class="MailingRow">
     <apex:outputText styleClass="CampaignLabel" value="{!cm.c.Name}" ></apex:outputText>
     <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.selected}" />
  </div>
</apex:繰り返し>

私の質問は、チェックボックスの値をコントローラーに渡すための最良の方法は何ですか? 理想的には、変更されたチェックボックスのみを渡し、チェックされたものからチェックされていないものへのリストと、チェックされていないものからチェックされたものを含む2番目のリストを渡したいと思います。次に、これらのリストを挿入および削除できます。

これは、チェックボックスで actionSupport タグを使用する必要がある場合ですか?

<apex:actionSupport event="onChange" action="{!updateChangeList}" />
4

2 に答える 2

1

コレクション全体がサーバーに送り返されます (したがって、すべてのチェックボックスの状態)。これは、Salesforce と他の Web 関連言語との間でそれほど違いはありません (たとえば、「複数のチェックボックスから $_POST を取得[]する」を参照してください。主な違いは、通常、名前が で終わる変数を使用し、SF はどこかで番号が増分する一意の名前を使用することです。名前)。

本当に 2 つのリストを作成したい場合は、2 つの隠しテキスト フィールドのコンテンツを追加/削除する JavaScript マジックが必要かもしれませんが、少し面倒です。

フォームが送信されてupdateChangeList()呼び出されると、CampaignWrappers のコレクションを反復処理して、以前の値と比較できます。以前の値をラッパーのもう 1 つの変数に保存し、それをユーザーに公開しないか、キャンペーンの内容に基づいて引き続き知ることができます。

Set<Id> campaignsToBeAddedTo = new Set<Id>();
Set<Id> campaignsToBeRemovedFrom = new Set<Id>();

for(CampaignMember cm : campaignWrappers){
   if(cm.selected && cm.c.CampaignMembers.isEmpty(){
      // is ticket but wasn't a member before
      campaignsToBeAddedTo.add(cm.c.Id);
   } else if (!cm.selected && !cm.c.CampaignMembers.isEmpty()){
      // not ticked but used to be a member
      campaignsToBeRemovedFrom.add(cm.c.Id);
   }
}

少し最適化することもできます(ヘルパー変数に isEmpty() チェックを入れるなど)。または、「副作用」を持つ可能性のあるセッターメソッドについて読んでください。結局のところ、フォームデータが逆シリアル化されるときに、とにかくそのようなループが実行されます。http://blogs.developerforce.com/developer-relations/2008/06/property-access.htmlは良い出発点です (古いことは知っています。基本的に、このブログ投稿の前に、必要な変数ごとに記述Boolean getSelected()しなければなりませんでした。 void setSelected(Boolan b)VFで使用する)。

最後になりましたが、ページの実行順序へのリンクです。

于 2013-04-15T11:15:23.143 に答える