商品を検索する(モジュール作成用)

商品検索APIを利用し、キーワードやカテゴリIDによる商品検索を行うモジュールを作成するためのサンプル。

使用API

ショッピング 商品検索

構成環境 Apache-2.2.10 + PHP-5.2.5

ダウンロード

サンプルご利用の際は、利用規約をご覧ください。利用規約は、ダウンロードパッケージ内のLICENSE.txtファイルに記載されています。

コード解説

ダウンロードしたアーカイブファイルを展開すると下記のようになります。

`-- sample5
    |-- ItemSearchFormModule
    |   |-- ItemSearchFormModule.php
    |   `-- ItemSearchFormModulePage.php
    |-- LICENSE.txt
    |-- README.txt
    |-- common
    |   `-- common.php
    `-- css
        |-- default.css
        `-- prototype.css

common.php

<?php

/** @mainpage
 * Yahoo!ショッピングWeb APISDK共通関数
 */

/**
 * @file
 * @brief Yahoo!ショッピングWeb APISDK共通関数
 *
 * Yahoo!ショッピングWeb APISDKで、共通で使用する関数を集めたファイルです。
 *
 * PHP version 5
 *
 */


/**
 * @brief 特殊文字を HTML エンティティに変換する
 *
 * これは、htmlspecialchars()を使いやすくするための関数です。
 * htmlspecialchars() http://jp.php.net/htmlspecialcharsより
 *   文字の中には HTML において特殊な意味を持つものがあり、
 *   それらの本来の値を表示したければ HTML の表現形式に変換してやらなければなりません。
 *   この関数は、これらの変換を行った結果の文字列を返します。
 *
 *   '&' (アンパサンド) は '&amp;' になります。
 *   ENT_QUOTES が設定されている場合のみ、 ''' (シングルクオート) は '&#039;'になります。
 *   '<' (小なり) は '&lt;' になります。
 *   '>' (大なり) は '&gt;' になります。
 *   ''' (シングルクオート) は '&#039;'になります。
 *
 * echo h("<>&'\""); //&lt;&gt;&amp;&#039;&quotと出力します。
 *
 * @param string $str 変換したい文字列
 *
 * @return string html用に変換した文字列
 *
 */
function h($str)
{
    return htmlspecialchars($str, ENT_QUOTES);
}

/**
 * 引数$paramからurlパラメータを生成します。
 *
 * 引数$paramからurlパラメータを生成します。
 * キーを引数$param値をurlエンコードします。
 * 値が""である場合はクエリに含めず、処理を飛ばします。
 *
 * @param array $param urlパラメータに含める文字列 キーにリクエストパラメータを、値にパラメータの値を入れます。
 * $param = array(
 *   リクエストパラメータ=>パラメータの値
 * );
 *
 * $urlparameter = buildQuery(array(
 *                           "appid" => "<あなたのClient ID(アプリケーションID)>",
 *                           "query" => "スニーカー",
 *                           "category_id" => "",
 *                           "hit" => 5
 *                            ));
 *
 * echo $urlparameter; //appid=<あなたのClient ID(アプリケーションID)>&query=%A5%B9%A5%CB%A1%BC%A5%AB%A1%BC&category_id=&hit=5
 *
 * 上記の例では、category_idは値が「""」のためurlパラメータに含まれません。
 *
 * @return string  URLエンコードされた文字列を返します。
 */
function buildQuery($param)
{
    $tmp = array();
    foreach($param as $key => $value){
        $tmp [] = $key . "=" . rawurlencode($value);
    }
    return join("&", $tmp);
}
?>

ItemSearchFormModule.php

<?php

/** @mainpage
 * 商品検索フォームモジュール
 */

/**
 * @file
 * @brief 商品検索フォームモジュール
 *
 * フォームから入力された値を条件して商品検索APIを、検索した結果を表示するクラス
 * 検索結果に対して、カテゴリーによる絞り込みと、並び順の変更ができます。
 *
 * PHP version 5
 */

require_once("../common/common.php");

/**
 * @class
 * @brief 商品検索フォームモジュール
 *
 * 検索APIを利用して、フォームから入力された値を利用して検索した結果を表示するクラス
 * 検索結果に対して、カテゴリーによる絞り込みと、並び順の変更ができます。
 * phpのページに、数行のphpコードを書くことでブログパーツのように
 * 商品の検索フォームを表示させることができます。
 *
 *
 */
class ItemSearchFormModule
{
    /**
     * @brief カテゴリーID一覧
     *
     * 商品カテゴリの一覧です。
     * キーにカテゴリID、値にカテゴリ名が入っています。
     * @access private
     * @var array
     */
    private $_categories = array(
                                 "1" => "すべてのカテゴリから",
                                 "13457" => "ファッション",
                                 "2498" => "食品",
                                 "2500" => "ダイエット、健康",
                                 "2501" => "コスメ、香水",
                                 "2502" => "パソコン、周辺機器",
                                 "2504" => "AV機器、カメラ",
                                 "2505" => "家電",
                                 "2506" => "家具、インテリア",
                                 "2507" => "花、ガーデニング",
                                 "2508" => "キッチン、生活雑貨、日用品",
                                 "2503" => "DIY、工具、文具",
                                 "2509" => "ペット用品、生き物",
                                 "2510" => "楽器、趣味、学習",
                                 "2511" => "ゲーム、おもちゃ",
                                 "2497" => "ベビー、キッズ、マタニティ",
                                 "2512" => "スポーツ",
                                 "2513" => "レジャー、アウトドア",
                                 "2514" => "自転車、車、バイク用品",
                                 "2516" => "CD、音楽ソフト",
                                 "2517" => "DVD、映像ソフト",
                                 "10002" => "本、雑誌、コミック"
                                 );
    /**
     * @brief ソート方法一覧
     *
     * 検索結果のソート方法の一覧です。
     * キーに検索用パラメータ、値にソート方法が入っています。
     * @access private
     * @var array
     *
     */
    private $_sortOrder = array(
                                "-score" => "おすすめ順",
                                "+price" => "商品価格が安い順",
                                "-price" => "商品価格が高い順",
                                "+name" => "ストア名昇順",
                                "-name" => "ストア名降順",
                                "-sold" => "売れ筋順"
                                );
    /**
     * @brief 引数を元に商品検索APIにアクセスし、結果を表示
     *
     * 引数を元に商品検索APIにアクセスし、その結果をhtmlに整形して表示します。
     * 引数$paramにリクエストパラメータ名=>値と書くことで検索条件を追加することができます。
     * 指定できるパラメータの一覧は
     * http://developer.yahoo.co.jp/webapi/shopping/shopping/v1/itemsearch.html
     * を参照してください。
     *
     * @param array $param apiにアクセスする際の検索条件を指定します。
     *
     * $param = array(
     *     "appid"         => string Client ID(アプリケーションID) //必須,
     *     "query"         => string 検索キーワード     //必須,
     *     "category_id"   => int カテゴリID //カテゴリIDによる商品の絞り込み検索,
     *     "affiliate_type"=> string アフィリエイトタイプ yid or vc,
     *     "affiliate_id"  => string アリフィリエイトIDを指定します,
     *     "sort"          => string ソート順を指定します
     * );
     *
     * Yahoo! JAPANアフィリエイトサンプル
     * new ItemSearchListModule(array(
     *                    "appid"          => "<あなたのClient ID(アプリケーションID)>",
     *                    "query"          => "スニーカー",
     *                    "affiliate_type" => "yid",
     *                    "affiliate_id"   => "EOipIudsX6dXJlfi8JXmsCA-",
     *                    "hits"           => 3
     * ));
     * バリューコマースアフィリエイトサンプル
     * new ItemSearchListModule(array(
     *                    "appid"          => "<あなたのClient ID(アプリケーションID)>",
     *                    "query"          => "スニーカー",
     *                    "affiliate_type" => "vc",
     *                    "affiliate_id"   => "http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2219441&pid=874350257&vc_url=",
     *                    "hits"           => 3
     * ));
     */
    function __construct($param = array())
    {
        $results = array();

        $param["query"] = !empty($_GET["query"]) ? $_GET["query"]: $param["query"];
        $param["query"] = !empty($param["query"]) ? $param["query"] : "";

        $param["sort"] = !empty($_GET["sort"]) ? $_GET["sort"] : $param["sort"];
        $param["sort"] = !empty($param["sort"]) && array_key_exists($param["sort"], $this->_sortOrder)? $param["sort"] : "-score";

        $param["category_id"] = ctype_digit($_GET["category_id"]) ? $_GET["category_id"]:$param["category_id"];
        $param["category_id"] =  !empty($param["category_id"]) && array_key_exists($param["category_id"], $this->_categories) ? $param["category_id"] : 1;

        if ($param["query"] != "") {
            $url = "http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?". buildQuery($param);
            try {
                $xml = simplexml_load_file($url);
                if ($xml["totalResultsReturned"] != 0) {
                    $results = $xml->Result->Hit;
                }
            } catch (Exception $e) {
            }
        }

        $result = array();

        $result["sort"] = $param["sort"];
        $result["query"] = $param["query"];
        $result["category_id"] = $param['category_id'];
        $result["results"] = $results;

        ItemSearchFormModule::display($result);
    }

    /**
     * @brief htmlを組み立てて表示
     *
     * 引数に指定された値からhtmlに整形して出力します。
     *
     * @param array $param  html内で表示する値
     *
     * $param = array(
     *     "sort" => string //ソート方法,
     *     "query" => string //検索キーワード,
     *     "category_id" => int //カテゴリーID,
     *     "results" => object //検索結果
     * );
     */
    function display($param=array())
    {
        $html = array();
        $html []= "<div class=\"YahooShoppingAPISDK\">";
        $html []= "<div class=\"ItemSearchFormModule\">";
        $html []= "<h1>商品検索</h1>";
        $html []= "<form action=\"". h($_SERVER['REQUEST_URI']). "\" class=\"Search\">";

        $html []= "<input type=\"text\" name=\"query\" value=\"". h($param["query"]) . "\" />";
        $html []= "<br />";
        $html []=  "<select name=\"category_id\">";
        foreach ($this->_categories as $id => $name) {
            $select = "";
            $select = ($param["category_id"] == $id)?"selected=\"selected\"":"";
            $html [] = "<option value=\"". h($id) . "\" ". $select .">". h($name) ."</option>";
        }
        $html []= "</select>";

        $html []= "<select name=\"sort\">";
        foreach ($this->_sortOrder as $key => $value) {
            $select = "";
            $select = ($param["sort"] == $key)?"selected=\"selected\"":"";
            $html [] = "<option value=\"" . h($key) . "\" ". $select .">". h($value) ."</option>";
        }
        $html []= "</select>";
        $html []= "<br />";

        $html []= "<input type=\"submit\" value=\"Yahooショッピングで検索\"/>";
        $html []= "</form>";

        foreach ($param["results"] as $result) {
            $html []= "<div class=\"Item\">";
            $html []= "<p><a href=\"". h($result->Image->Small) . "\"><img src=\"" . h($result->Image->Small) . "\" /></a></p>";
            $html []= "<h2><a href=\"" . h($result->Url) . "\">". h($result->Name) ."</a></h2>";
            if (!is_null($result->PriceLabel->SalePrice)) {
                $html []= "<p class=\"Price\">". h($result->Price). "円</p>";
            }
            $html []= "</div>";
        }

        $html [] = "</div>";
        $html [] = "</div>";
        echo join("\n", $html);
    }
}
?>

ItemSearchFormModulePage.php

<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=UTF-8">
        <title>ショッピングデモサイト - 商品を検索する(モジュール作成用)</title>
        <link rel="stylesheet" type="text/css" href="../css/prototype.css"/>
    </head>
    <body>
        <h1><a href="./ItemSearchFormModulePage.php">ショッピングデモサイト - 商品を検索する(モジュール作成用)</a></h1>
<?php
/** @mainpage
 *  商品検索フォームモジュールを表示
 */

/**
 * @file
 * @brief 商品検索フォームモジュールを表示
 *
 * ItemSearchFormModule.phpを利用して、
 * 商品検索フォームモジュールを表示し、
 * フォームから入力された値を条件に、
 * 検索APIを利用して、検索した結果を表示します。
 * また、検索結果に対して、カテゴリーによる絞り込みと、並び順の変更ができます。
 * phpのページに、数行のphpコードを書くことでブログパーツのように
 * 商品検索フォームを表示させることができます。
 */

//ItemSearchFormModule.phpを読み込み
include_once("./ItemSearchFormModule.php");

/**
 * ItemSearchFormModule呼び出し
 *
 * 設定例
 * $obj = new ItemSearchFormModule(array(
 *     "appid"         => Client ID(アプリケーションID) //必須,
 *     "query"         => 検索キーワード     //必須,
 *     "category_id"   => カテゴリIDによる商品の絞り込み検索, //任意
 *     "affiliate_type"=>"アフィリエイトタイプ yid or vc",
 *     "affiliate_id"  =>"アリフィリエイトIDを指定します",
 *     "sort"          => "ソート順を指定します"
 * ));
 *
 * 指定できるパラメータの一覧は
 * http://developer.yahoo.co.jp/webapi/shopping/shopping/v1/itemsearch.html
 * を参照してください。
 *
 * パラメータを追加する場合は
 * "リクエストパラメータ名" => "値"
 * としてください。
 *
 * Yahoo! JAPANアフィリエイトサンプル
 * new ItemSearchFormModule(array(
 *                    "appid"         => "<あなたのClient ID(アプリケーションID)>",
 *                    "query"         => "スニーカー",
 *                    "affiliate_type"=>"yid",
 *                    "affiliate_id"  =>"EOipIudsX6dXJlfi8JXmsCA-",
 *                    "hits"          => 3
 * ));
 * バリューコマースアフィリエイトサンプル
 * new ItemSearchFormModule(array(
 *                    "appid"         => "<あなたのClient ID(アプリケーションID)>",
 *                    "query"         => "スニーカー",
 *                    "affiliate_type"=>"vc",
 *                    "affiliate_id"  =>"http://ck.jp.ap.valuecommerce.com/servlet/referral?sid=2219441&pid=874350257&vc_url=",
 *                    "hits"          => 3
 * ));
 */
new ItemSearchFormModule(array(
                     "appid" => "<あなたのClient ID(アプリケーションID)>",
                     "hits" => 5
                 ));
?>
    </body>
<!-- Begin Yahoo! JAPAN Web Services Attribution Snippet -->
<a href="http://developer.yahoo.co.jp/about">
<img src="http://i.yimg.jp/images/yjdn/yjdn_attbtn2_105_17.gif" width="105" height="17" title="Webサービス by Yahoo! JAPAN" alt="Webサービス by Yahoo! JAPAN" border="0" style="margin:15px 15px 15px 15px"></a>
<!-- End Yahoo! JAPAN Web Services Attribution Snippet -->

</html>

アプリケーションの管理

利用のルール

開発のヒント