LoginSignup
7
8

More than 5 years have passed since last update.

SalesforceでWebサイト作成〜商品をrepeat表示〜

Last updated at Posted at 2018-06-02

はじめに

Salesforceの勉強を兼ねて練習用WEBサイトを作成しており、そこで学んだことをまとめました。
今回は、商品をrepeat表示してみたの巻☆です!

実装機能

⑴ 登録した商品を表示
スクリーンショット 2018-06-01 23.43.53.png

⑵ 会員登録、ログイン
スクリーンショット 2018-06-01 23.45.30.png

詳細はこちら
https://qiita.com/szaizen/items/ef66de174ec1d91d357d

⑶ ショッピングカート的なもの
スクリーンショット 2018-06-01 23.46.33.png

詳細はこちら
https://qiita.com/szaizen/items/e1689446ade8f824b018

ホーム画面

まず、ホーム画面はこのような感じ。Bootstrapを使っています。

スクリーンショット 2018-06-01 23.49.29.png

画像や文章は勉強用として適当なのでご了承下さい、、

  • ヘッダーを固定
  • 商品表示は、Bootstrapのカード型を使用
  • 商品オブジェクト(Product2)からRepeat処理で表示

Repeat処理はなかなか苦戦しましたので詳しく書いていきたいと思います。

VisualForceページ

まずはトップページを作成するにあたって、HTMLの記述から少し工夫する必要があります。

home.vfp
<apex:page standardStylesheets="false" showHeader="false"  docType="html-5.0" >
</apex:page>
  • standardStylesheets="false" Salesforce特有のスタイルを適用しない
  • showHeader="false" Salesforceタブのヘッダーを非表示
  • docType="html-5.0" HTML5の文書型宣言をする

属性はVisualforce開発者ガイドにまとめてあります。
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_page.htm

商品一覧

まず、商品オブジェクトに標準項目である「名前(Name)」「商品説明(Description)」と
自分で作成した項目「価格」「画像(テキスト型)」を用意しておきます。

項目名 API参照名 データ型  桁数
価格   price__c         数値     6       
画像   img__c             テキスト   50   

そして、右上のページレイアウトを編集するボタンから、下記のようにページレイアウトの設定をし、それぞれ入力します。

スクリーンショット 2018-06-02 11.02.12.png

いくつか商品を登録していき、その登録した商品を表示する方法を次で説明します。

repeatについて

repeatとは…指定する構造に基づいてコレクションのコンテンツを出力できる反復コンポーネントです。
今回はApexクラスで、商品オブジェクト型のリストに表示したい項目を格納し、
Visualforceページでリストの中身を繰り返し表示します。

参考サイト:https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_repeat.htm

Apexクラスで商品リスト作成

表示したいオブジェクト型のリストを作成するために、Apexクラスを作成し、そのクラスをpageの属性で指定します。
最新更新日が高いものが先に表示されるように「order by LastModifiedDate desc」と記述。

LoginController.apxc
public class LoginController  {

 public List<product2> nameList {
    get {
        List<product2> nameList = new List<product2>();
        nameList = [select Id,Name,price__c, Description,img__c,Resource__c from product2 order by LastModifiedDate desc];
        return nameList;
    }set;}
 //コンストラクタ
 public LoginController() {
 }

}

先ほど作成したホーム画面に、コントローラーを指定し、repeatを使ってnameListを繰り返し表示します。
repeatのvalueにリストの名前、varに別名を記述、rowsに表示する件数の上限を記述。
そして、{!pro.img__c}のように別名.項目名でリストの中の値を表示。

ちなみに、スタイルはBootstrapのカード型を利用しているため、Bootstrapを読み込む必要があります。

home.vfp
<apex:page controller="LoginController" standardStylesheets="false" showHeader="false"  docType="html-5.0">

<!-- 商品を繰り返し表示、bootstrapカード型を利用 -->
<section id="card">
        <apex:repeat value="{!nameList}" var="pro" rows="6">
            <apex:form >
            <div class="card">
                <img class="card-img-top" src="/resource/1525590750000/{!pro.img__c}" alt="{!pro.Name}" />
                <div class="card-body">
                    <p class="card-title">{!pro.Name}&nbsp;¥{!pro.price__c}</p>
                    <p class="card-text">{!pro.Description}</p>
                        <apex:outputLink styleclass="btn btn-primary" value="{!$Page.home}" >カートに入れる
                        <apex:param name="i" value="{!pro.Id}"/>
                        </apex:outputLink>
                </div>
            </div>

        </apex:form>
        </apex:repeat>

</section>

</apex:page>

画像の表示方法

画像をレコードごとに変えたかったため、
・レコード作成の際に、静的リソースに画像をアップロードして、静的リソースの名前を商品オブジェクトの画像の項目に書いておく
・Visualforceのリンクの指定で画像の項目をつかってパスを指定する
このような方法で実装しました。

▼静的リソース
スクリーンショット 2018-06-02 11.35.29.png

▼商品オブジェクト
スクリーンショット 2018-06-02 17.29.31.png

このように静的リソースに登録・商品オブジェクトの画像に記述します。
ちなみにですが、HTMLの指定の部分を修正する必要があります。(静的リソースのファイルを表示から画像のURLに飛ぶことができる)

<img class="card-img-top" src="/resource/1525590750000/{!pro.img__c}" alt="{!pro.Name}" />

ここのsrcの数字の部分です。

商品をカテゴリーごとに表示

次に、カテゴリーのリンクを踏んだらそのカテゴリーの商品だけが表示されるようにします。
スクリーンショット 2018-06-02 13.41.58.png

paramを使って、カテゴリーページに飛ぶ時のパラーメータにカテゴリー名を渡しています。
例えば、ギターのリンクをクリックしたら、 ↓のようにURLの語尾にguitarが渡されます。

https://c.ap5.visual.force.com/apex/category?p=guitar

参考サイト:https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_param.htm

その時のVisualforceページのソースはこのような感じ。

<apex:outputLink value="{!$Page.category}" styleclass="dropdown-item" >ギター
 <apex:param name="p" value="guitar"/>
</apex:outputLink>

これで、URLにguitarという値を渡すことができました。
このguitarという値を、Apexクラスで取得して、表示しているオブジェクト型のリストのSELECT文のWHERE句にカテゴリーがguitarと条件指定する必要があります。

まずパラーメータの値をApexクラスで取得する記述はこちらです。

System.currentPageReference().getParameters().get('p');

これを変数に代入し、WHERE句で指定します。

//変数定義
public String param{get;set;}

public List<product2> categoryList {
get {
    List<product2> categoryList = new List<product2>();
    param = System.currentPageReference().getParameters().get('p');
    categoryList = [select Id,Name,price__c, Description,img__c,Resource__c from product2 where Family = :param ];
    return categoryList;

}set;}

この方法でカテゴリーで絞って表示することができました。

ログイン機能、ショッピングカート機能、の記事も後ほど投稿します〜☆

参考サイト

Visualforce 開発者ガイド apex:repeat
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_repeat.htm
Visualforce 開発者ガイド apex:param
https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_param.htm

コードはこちら〜
https://github.com/szaizen/music

7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8