この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Apex コントローラへの action メソッドの追加

このレッスンでは、action メソッドをコントローラに追加して新しい [Add to Cart (カートに追加)] ボタンのクリックを処理で��るようにし、またショッピングカートの内容を出力する新しいメソッドも追加します。Visualforce が透過的にデータをコントローラに戻して処理できるようにする方法を確認します。Visualforce 側で、ボタンと、買い物客が入力するフォーム項目をページに追加します。

  1. [StoreFrontController] をクリックして、ページのコントローラコードを編集します。
  2. 次のショッピングカートコードを StoreFrontController の定義の products インスタンス変数の直後に追加し、[Quick Save (適用)] をクリックします。
    1List<DisplayMerchandise> shoppingCart = new List<DisplayMerchandise>();
    2
    3// Action method to handle purchasing process 
    4public PageReference addToCart() {
    5    for(DisplayMerchandise p : products) {
    6        if(0 < p.qtyToBuy) {
    7            shoppingCart.add(p);
    8        }
    9    }
    10    return null; // stay on the same page 
    11}
    12
    13public String getCartContents() {
    14    if(0 == shoppingCart.size()) {
    15        return '(empty)';
    16    }
    17    String msg = '<ul>\n';
    18    for(DisplayMerchandise p : shoppingCart) {
    19        msg += '<li>';
    20        msg += p.name + ' (' + p.qtyToBuy + ')';
    21        msg += '</li>\n';
    22    }
    23    msg += '</ul>';
    24    return msg;
    25}
    これで、商品カタログに購入用ユーザインターフェースを追加できる状態になりました。
  3. [Catalog (カタログ)] をクリックしてページの Visualforce コードを編集します。
  4. 商品カタログを form タグでラップします。ページ構造は次のコードのようになります。
    1<apex:page controller="StoreFrontController">
    2    <apex:form>
    3        <!-- rest of page code --> 
    4    </apex:form>
    5</apex:page>
    <apex:form> コンポーネントを使用すると、ユーザが送信したデータをページからコントローラに返送できます。
  5. 次のコードを使用して 4 つ目の列を商品リストテーブルに追加します。
    1<apex:column headerValue="Qty to Buy">
    2    <apex:inputText value="{!pitem.qtyToBuy}" rendered="{! pitem.inStock}"/>
    3    <apex:outputText value="Out of Stock" rendered="{! NOT(pitem.inStock)}"/>
    4</apex:column>
    この列は、購入数量入力用のフォーム項目、または各商品の DisplayMerchandise.inStock() メソッドの値に基づいた在庫切れ通知のためのフォーム項目になります。
  6. [保存] をクリックしてページを再読み込みします。
    購入客が各商品の購入数量を入力するための新しい列があります。
  7. 次のコードを </apex:pageBlock> タグの直前に入力して、ショッピングカートボタンを追加します。
    1<apex:pageBlockSection>
    2    <apex:commandButton action="{!addToCart}" value="Add to Cart"/>
    3</apex:pageBlockSection>
    この段階で [保存] をクリックしてフォームを試すと、すべてが機能しますが、ショッピングカートが表示されないため効果は確認できません。
  8. 次のコードをページの </apex:form> 終了タグのすぐ上に追加します。
    1<apex:pageBlock title="Your Cart" id="shopping_cart">
    2    <apex:outputText value="{!cartContents}" escape="false"/>
    3</apex:pageBlock>
  9. [保存] をクリックして、フォームを試します。ショッピングカートに品目を追加できるようになりました。この場合、単純なテキスト表示のみです。現実のシナリオでは、注文のメール送信、Web サービスの呼び出し、データベースの更新などが考えられます。
  10. 効果を追加するために、[Add to Cart (カートに追加)] commandButton のコードを変更します。
    1<apex:commandButton action="{!addToCart}" value="Add to Cart" reRender="shopping_cart"/>
    [保存] をクリックしてフォームを使用すると、ショッピングカートがページの再読み込みではなく Ajax 経由で更新されます。カスタムコントローラを使用した商品カタログページ (カート表示)

もうひとこと...

  • このレッスンで確認したように、Visualforce は自動的にフォームでのデータ変更を元の商品変数に複製します。この機能はきわめて強力で、フォームやその他の複雑な入力ページをすぐに作成できます。
  • [Add to Cart (カートに追加)] ボタンをクリックすると、画面全体は更新されずに、ショッピングカートパネルが更新されます。これを行う Ajax 効果には、通常複雑な JavaScript 操作が必要ですが、単純な reRender 属性で実現することができました。
  • [Qty to Buy (購入数量)] 項目の値を変えて [Add to Cart (カートに追加)] を複数回クリックすると、ショッピングカートで商品が重複するというバグがあります。これまでの Apex の知識でバグを発見して修復できるでしょうか。1 つの方法として考えられるのは、特定の List を Map に変更し、重複した ID を記録してチェックできるようにすることです。このドキュメントや紹介した参考資料から、必要な Map メソッドを探してみてください。