Smarty3とZendframework1系を使ってアマゾンAPIのSmartyプラグインを作くる

Smarty

まず、完成形の確認。

テンプレート内でSmartyタグを使って
アマゾンの特定カテゴリ商品を並べるといった機能です。

{amazon BrowseNode='****' Count=*}
assign・・

前置き
・アマゾンのAPIキーとシークレットキーが取得済みである。
・アソシエイトキーも取得済みである。
・Smarty3とZendFramework1.12系がincludeされている。

という前提で話を進めます。

なお、ZendFrameworkの1.11系を使ってみたら
Zend_Service_Amazon()が現在のアマゾンAPIに対応していないようです。
なので今回はZF1.12.3を使用しました。

1.とりあえず基本形

.php

template_dir = './templates';
$smarty->compile_dir = './templates_c';
$smarty->plugins_dir = array(SMARTY_PLUGINS_DIR,'./plugins');

$smarty->display('.tpl');

pluginsフォルダを適当に追加して下さい。

2.pluginsにamazonプラグインを追加します。

1で設定した追加プラグインフォルダに以下ファイルを足します。
ファイル名、funciton名はプラグインの法則にしたがって作成。

function.amazon.php

 'Books',
        'AssociateTag' => $AssociateTag,
        'ResponseGroup' => 'ItemAttributes,Images'
    );

    $params = array_merge($default,$params);

    include_once 'Zend/Service/Amazon.php';
    $amazon = new Zend_Service_Amazon($AMAZON_API_KEY, 'JP', $AMAZON_SECRET_KEY);
    $results = $amazon->itemSearch($params);
    $smarty->assign('amazon',$results);
    return;
}

APIにリクエストする前に$defautと$paramsでクエリー用パラメータをマージさせます。
いちいち呼び出し元でパラメーター設定が面倒なら$defaultでBrowseNodeやCountなど入れておくと良いでしょう。
ちなみにCountの最大値は10までです。

今回は、テンプレート側で見た目を制御したいので
returnでHTMLを返さずassignをさせる方法にしました。

Zend_Loader_Autoloaderがかかっていれば
「include_once ‘Zend/Service/Amazon.php’;」などはいらないかもね。

3、テンプレートから呼び出し

.tpl

本の紹介

{amazon BrowseNode='2361968051' Count=5} {foreach $amazon as $item}

{$item->Title}

著者:{$item->Author}
{/foreach}

これで特定カテゴリの商品を5件、簡単に呼び出せます。

{amazon}でSearchIndexやResponseGroupなどもパラメーター設定すれば
そのままクエリーされるので、使う場面に応じた調整が可能です。

しかし・・画像の拾い方が面倒ですね。
なぜメソッドなのだろう^^;

4、キャッシュ機能

本格的な運用に使うならキャッシュ機能を利用しましょう。
今回のサンプルはシンプルに書いているため省略しています。

アマゾンAPIリクエストは1クエリー/秒かつ、500クエリー/時間だったような気がします。
この制限は公式ガイドラインによると収益に対して変動のようなことが書かれているようですが、
通常は簡単なキャッシュをしておけば充分かと思います。

コメント

タイトルとURLをコピーしました