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

レッスン 5: Apex コントローラでの内部クラスの使用

前のレッスンでは、Visualforce カタログページ用のカスタムコントローラを作成しました。ただし、コントローラはカスタムオブジェクトをデータベースから直接ビューに渡します。これは最適な方法とはいえません。このレッスンでは、MVC デザインパターンをより正確に使用するようにコントローラをリファクタリングし、さらにページにいくつか機能を追加します。

  1. [StoreFrontController] をクリックして、ページのコントローラコードを編集します。
  2. クラスの定義を次のように修正し、[Quick Save (適用)] をクリックします。
    1swfobject.registerObject("clippy.codeblock-0", "9");public class StoreFrontController {
    2
    3    List<DisplayMerchandise> products;
    4    
    5    public List<DisplayMerchandise> getProducts() {
    6        if(products == null) {
    7            products = new List<DisplayMerchandise>();
    8            for(Merchandise__c item : [
    9                    SELECT Id, Name, Description__c, Price__c, Total_Inventory__c 
    10                    FROM Merchandise__c]) {
    11                products.add(new DisplayMerchandise(item));
    12            }
    13        }
    14        return products;
    15    }
    16    
    17    // Inner class to hold online store details for item
    18    public class DisplayMerchandise {
    19
    20        private Merchandise__c merchandise;
    21        public DisplayMerchandise(Merchandise__c item) {
    22            this.merchandise = item;
    23        }
    24
    25        // Properties for use in the Visualforce view
    26        public String name {
    27            get { return merchandise.Name; }
    28        }
    29        public String description {
    30            get { return merchandise.Description__c; }
    31        }
    32        public Decimal price {
    33            get { return merchandise.Price__c; }
    34        }
    35        public Boolean inStock {
    36            get { return (0 < merchandise.Total_Inventory__c); }
    37        }
    38        public Integer qtyToBuy { get; set; }
    39    }
    40}
  3. [Catalog (カタログ)] をクリックしてページの Visualforce コードを編集します。
  4. 列定義を、新しい内部クラスのプロパティ名を処理するように変更します。既存の列定義を次のコードで置き換えます。
    1swfobject.registerObject("clippy.codeblock-1", "9");<apex:column headerValue="Product">
    2    <apex:outputText value="{!pitem.Name}"/>
    3</apex:column>
    4<apex:column headerValue="Description">
    5    <apex:outputText value="{!pitem.Description}"/>
    6</apex:column>
    7<apex:column headerValue="Price">
    8    <apex:outputText value="{!pitem.Price}"/>
    9</apex:column>
    10
    outputField コンポーネントは自動的に sObject 項目を処理しますが、カスタムクラスはまったく処理しません。outputText はどの値も処理します。
  5. [保存] をクリックして変更を保存し、ページを再読み込みします。
    価格列が currency として書式設定されなくなりました。
  6. 価格の outputText タグを次のコードに変更します。
    1<apex:outputText value="{0,number,currency}">
    2    <apex:param value="{!pitem.Price}"/>
    3</apex:outputText>
    outputText コンポーネントを使用して、異なるデータ型を自動的に書式設定できます。
  7. コードが、次のようになっていることを確認して、[保存] をクリックします。
    1swfobject.registerObject("clippy.codeblock-3", "9");<apex:page controller="StoreFrontController" tabStyle="Merchandise__c">
    2
    3    <apex:pageBlock title="Our Products">
    4
    5        <apex:pageBlockSection columns="1">
    6
    7            <apex:pageBlockTable value="{!products}" var="pitem">
    8                <apex:column headerValue="Product">
    9                    <apex:outputText value="{!pitem.Name}"/>
    10                </apex:column>
    11                <apex:column headerValue="Description">
    12                    <apex:outputText value="{!pitem.Description}"/>
    13                </apex:column>
    14                <apex:column headerValue="Price" style="text-align: right;">
    15                    <apex:outputText value="{0,number,currency}">
    16                        <apex:param value="{!pitem.Price}"/>
    17                    </apex:outputText>
    18                </apex:column>
    19            </apex:pageBlockTable>
    20
    21        </apex:pageBlockSection>
    22
    23    </apex:pageBlock>
    24
    25</apex:page>
    カタログページは次のようになります。カスタムコントローラを使用した商品カタログページ (カート追加前)

もうひとこと...

  • DisplayMerchandise クラスは、すでにデータベースに存在する Merchandise__c 型をラップし、新しいプロパティとメソッドを追加します。コンストラクタを使用すると、既存の Merchandise__c レコードを渡すことで新しい DisplayMerchandise インスタンスを作成できます。これで、インスタンス変数 productsDisplayMerchandise インスタンスのリストとして定義されます。
  • getProducts() メソッドは、Merchandise__c レコードを返すクエリ (SOQL クエリをコールする角括弧内のテキスト) を実行します。その後、クエリから返されたレコードを反復処理し、DisplayMerchandise 商品のリストに追加して、そのリストを返します。