ラベル 商品詳細ページ の投稿を表示しています。 すべての投稿を表示
ラベル 商品詳細ページ の投稿を表示しています。 すべての投稿を表示

2015年6月26日

カラーミーでウィッシュリストを作る - カラーミーショップAPI編

【仕事サイトにカラーミーショップAPI関連記事を書きました】
カラーミーショップAPIの使い方を丁寧に解説します

ウィッシュリスト(wishlist, wish list, ほしい物リスト etc.)。
呼び方はいろいろありますが、「購入したい商品につけるしおりのようなもの」。
カラーミーショップには昔からこのウィッシュリスト機能が付いていません。カラーミーショップ七不思議のひとつ。

2010年の記事「ほしい物リストを作る 1」で、基本設計を箇条書きしました。 
・「ほしい物リストに追加する」ボタンをクリックすると、Cookieに商品IDを書き込む
・ほしい物リスト一覧ページをフリーページで作成し、ページデザインをする
・商品ID以外にも表示に必要な情報を取得してくる
・「ほしい物リストから削除する」ボタンをつくる
これはカラーミーショップAPIがなかった頃なので、必要な情報を取得する部分にXMLHttpRequestを使いました。

今回は「カラーミーショップAPI」を使います。ずいぶんとシンプル&スマートに仕上がります。そのほかの多くの部分を2010年ver.から流用しています。
もうひとつ、以前に比べると、jQueryを使った箇所が増えました。
仕様がよくわからない、内容がよくわからない場合は復習をどうぞ。
・ほしい物リストを作る 4 ・カラーミーAPI実践編2 ポイント表示

ということで、「カラーミーでウィッシュリストを作る - カラーミーショップAPI編」スタート。

1. コード

1.1 商品ページなどに設置

<script type="text/javascript" src="http://hogehoge.heteml.jp/jquery.cookie.js"></script>
<script type="text/javascript" src="http://hogehoge.heteml.jp/wishSet.js"></script>

<!--ウィッシュリンク-->
<a href="#" onClick="JavaScript:wishCookie(<{$product.id}>);return false">ウィッシュリストに追加</a>

 

1.2 JavaScript - wishSet.js

//文字コードEUCで
//ウィッシュリストのセット&全削除
function wishCookie(id) {
  if(id > 0) {
    strCookie=$.cookie('wish');
    if(strCookie == null) {
      strCookie = "";
    }
    else{
      loop = strCookie.match(/!/g);
      if(loop != null && loop.length/2 >= 50) {
        window.alert("これ以上追加することはできません(最大50点まで)");
        return;
      }
    }

    strURL = "!" + id + "!";
    re = new RegExp(strURL);
    if(strCookie == null || strCookie == "")  {
      strCookie = strURL;
      $.cookie('wish', strCookie,{expires:365});
      window.alert("ウィッシュリストに追加しました");
    }
    else if(strCookie.search(re) == -1)  {
      strCookie = strURL+strCookie;
      $.cookie('wish', strCookie,{expires:365});
      window.alert("ウィッシュリストに追加しました");
    }
    else {
      window.alert("この商品はすでに追加されています");
    }
  }
  else if (id ==  0) {//全削除
    $.cookie('wish','',{expires:-1});
    //strCookie=$.cookie('wish');
  }
}

//Cookie部分削除
function delWishCookie(strNum,n) {
  strCookie=$.cookie('wish');
  strNum="!"+strNum+"!";

  re = new RegExp(strNum);
  if(strCookie.search(re)!=-1) {
    if(strCookie.indexOf(strNum)==0){
      strCookie=strCookie.slice(strNum.length);
    }
    else{
      strCookie=strCookie.slice(0,strCookie.indexOf(strNum)) + strCookie.slice(strCookie.indexOf(strNum)+strNum.length);
    }
    $.cookie('wish', strCookie ,{expires:365});
    prid="#prw"+n;
    $(prid).html("再読込み時に削除されます");
  }
}

1.3 フリーページなどの表示場所に設置

<script type="text/javascript" src="http://hogehoge.heteml.jp/jquery.cookie.js"></script>
<script type="text/javascript" src="http://hogehoge.heteml.jp/wishSet.js"></script>

//ウィッシュリストの表示場所を準備
<script type="text/javascript">
//Cookie読み込み
  strPid = new Array();

  strCookie=$.cookie('wish');
  if(strCookie==null){
    strCookie="";
  }
  loop=strCookie.match(/!/g);

  if(loop!=null){
    if(loop.length/2>50){//50itemsまで
      N=50;
    }else{
      N=loop.length/2;
    }
  }
  else {
    N=0;
  }
  for(i=1;i<=N;i++){
    strPid[i]=strCookie.substring(strCookie.indexOf("!")+1,
              strCookie.indexOf("!",strCookie.indexOf("!")+1));

    document.write('<div id="picw'+i+'"></div><div id="titw'+i+'"></div><div id="prw'+i+'"></div><div><a href="#" onClick="JavaScript:delWishCookie('+strPid[i]+','+i+');return false">ウィッシュリストから削除</a></div>');

    strCookie=strCookie.slice(strCookie.indexOf("!",
              strCookie.indexOf("!")+1)+1);
  }

  //表示失敗を回避するため、DOM読み込み後に実行する
  $(function(){
    for(i=1;i<=N;i++){
      wishwish(i,strPid[i]);
    }
  });

</script>

1.4 JavaScript - wishwish()

<script type="text/javascript">
function wishwish(num,id){
$.getJSONP = function(url,callback,param) {
        return $.ajax({
            url:    url,
            dataType:"jsonp",
            success:callback
        });
}
$.getJSONP("http://hogehoge.heteml.jp/getWishlist.php54?id=" + id + "&num=" + num, onDataHandler)
function onDataHandler(response) {
    nw   = response.numw;
    picid = "#picw" + nw;
    titid = "#titw" + nw;
    prid = "#prw" + nw;
    name=response.name;
    idw=response.idw;

    $(picid).html('<a href="http://www.hogehoge.com/?pid='+idw+'"><img src="'+response.img_u+'" /></a>');
    $(titid).html('<a href="http://www.hogehoge.com/?pid='+idw+'">'+nw+'\. '+name+'</a>');

    if(response.stock_managed==1 && response.stocks==0){  
      $(prid).html('<b>SOLD OUT</b>');
      delWishCookie(idw);
    }
    else {
      $(prid).html(response.sales_price+'円(税込)');
    }
}
}
</script>

 

1.5 getWishlist.php54

<?php
$request_options = array(
    'http' => array(
        'method'  => 'GET',
        'header'  => "Authorization: Bearer XXXXXXXXXXXXXXXXXX\r\n"
    )
);
$context = stream_context_create($request_options);

$url = 'https://api.shop-pro.jp/v1/products/' . $_GET['id'] . '.json';
$response_body = file_get_contents($url, false, $context);
$response_json = json_decode($response_body, true);

//出力用配列にセット
$output = array(
    'numw' => $_GET['num'],
    'idw' => $_GET['id'],
    'name' => htmlspecialchars($response_json['product']['name'], ENT_QUOTES, 'UTF-8'),
    'sales_price' => number_format($response_json['product']['sales_price']),
    'img_u' => $response_json['product']['image_url'],
    'stock_managed' => $response_json['product']['stock_managed'],
    'stocks' => $response_json['product']['stocks']
);
header( 'Content-Type: text/javascript; charset=utf-8' );
echo $_GET['callback'] . '(' . json_encode($output). ')';

2. 簡単な説明


1.1 「ウィッシュリストに追加」を押すと、wishCookie関数を呼ぶ。
1.2 商品IDがCookieに追加される。Cookieの読み書き削除にはjquery.cookie.jsを使う。
1.3 ウィッシュリストの表示場所を作る。終了後にwishwish関数を呼ぶ。
1.4 PHPに商品IDを渡して結果を受け取る。そして結果を表示する。
1.5 カラーミーショップAPIとの処理部分。商品IDから必要情報を取ってきて結果を渡す。

3. おわりに


今回の「カラーミーでウィッシュリストを作る - カラーミーショップAPI編」はいかがだったでしょうか。
「ほしい物リストを作る 4」「カラーミーAPI実践編2 ポイント表示」を混ぜると、今回の
が出来上がります。


説明が省略されている箇所は、上述のページ周辺にヒントが載ってるはず。
URL、トークン、商品IDは各自のを。CSS、ボタンなど、綺麗にデザインして。
商品IDを持っているので、どこでもカラーミーで「カートに入れる」ボタンも付けられる。
実際に使っているコードから機能を一部省略しただけなので動くと思いますが、動かなかったら直して!
センスのない関数名や冗長なコードについては、(私が)恥ずかしいので突っ込まない。

【追記】元々の仕様が古いので、Cookieにセットする文字列がスマートじゃありませんが、配列に入れてシリアライズしてセットするような風にすると、今風なのだろうと思います。



毎回画像が少ないので、今回は話にまったく関係の画像を付けてみました(先週の夜出てた)。


【追記】POSTのほうがよいかも。

2015年6月20日

カートに入れるを二ヶ所につける - オプション編

もう5年前になりますが、「カートに入れるを二ヶ所につける」という記事を書きました。
この記事、(今風のコーディングではないですが)地味に好評だったようです。
ということで、今回はときおり話題に挙がっていた、複数カートで「オプション項目も連動する」を作ってみました。
そういえば、カラーミーショップのオプションって、もともとはプルダウン形式のみでしたっけね。


1. コード

1.1 JavaScript

<script type="text/javascript">
<!--
function option_change(oid, p){
  if(p==1){
    var n = $("#s" + oid + "1")[0].selectedIndex;
    $("#s" + oid + "2")[0].selectedIndex=n;
  }
  else if(p==2) {
    var n = $("#s" + oid + "2")[0].selectedIndex;
    $("#s" + oid + "1")[0].selectedIndex=n;
  }
}
// -->
</script >

1.2 商品詳細ページ(ひとつめ)

<{section name=num loop=$option}>
  <div class="cell_mar">
    <select name="<{$option[num].select_name}>" onchange="option_change(<{$option[num].id}>, 1)" id="s<{$option[num].id}>1">
      <option value="">選択してください</option>
      <{html_options values=$option_value[num].id  output=$option_value[num].name selected=$key }>
    </select>
  </div>
<{/section}>

1.3 商品詳細ページ(ふたつめ)

<{section name=num loop=$option}>
  <div class="cell_mar">
    <select name="<{$option[num].select_name}>2" onchange="option_change(<{$option[num].id}>, 2)" id="s<{$option[num].id}>2">
      <option value="">選択してください</option>
      <{html_options values=$option_value[num].id  output=$option_value[num].name selected=$key }>
    </select>
  </div>
<{/section}>

2. 簡単な解説


商品詳細ページは古めのテンプレ・ウッドがベースのため、プルダウンメニューです。
オレンジマーカー部は追加箇所。select nameのあとにonchangeとidを追加。
onchageイベントは、オプションを変更したときに関数を呼び出します。
カートとオプションごとに固有のidを振っています。
記事幅の都合で勝手に改行が入っていますが不要です。

$("#id")[0].selectedIndex でプルダウンメニューの何番目を選んだかがわかりますので、変更したほうから変更していないほうへ代入しています。

【関連記事】
・カートに入れるを二ヶ所につける

2011年11月9日

「SOLDOUT表示」と、掲示板での最近の話題

「お願い!カラーミー」で要望のあった、「SOLDOUT表示」が付きました。
カラーミーショップは、売り切れ時には「カートに入れる」ボタンが非表示になるだけで、SOLDOUTの表示がされていませんでした。どういう状態なのか分からず、お客様も戸惑ってたことでしょう。
ということで、ようやく。
実装方法は下記記事を参照してください(シンプルなコードなので、色々とカスタマイズ可能です)。
【お願い実装】「SOLDOUT表示」を実装しました! 

最近の助け合い掲示板での話題では、 これらが勉強になりました。どれも興味深い記事でした。
私はSmartyがよく分かっていないので、サンプルをみながら何ができるのか学習しています。
・オプション選択プルダウン内でのSOLD OUT表示について
・NEW等のアイコンを自作の物に変更する方法はないのでしょうか?
・金額別の表示について(1000円~3000円・3001円~5000円とか)

次回は、jQueryのお話。勉強もかねて、初心者の私がまとめてみようかと思います。
カラーミーショップのカスタマイズにも使うことができますので、ご存じない方はぜひ。

2011年5月7日

ショップ独自のポイント制度について 2

【追記】 公式に実装されました。以下は古い記事になります。

前回からの引き続き。今回はカラーミーショップにポイントを表示させるSmartyのサンプルです。
下記は「カラーミーショップ - 助け合い掲示板」に掲載されていたものです。
<!--ポイント支給率 100円毎に5ポイントの場合-->
<{assign var="sData" value=$product.sales|regex_replace:"[[\(]+[\S]+[\)]]":""}>
<{assign var="sData" value=$sData|replace:",":""}>
<{assign var="sData" value=$sData|replace:"円":""}>
<{math equation="floor($sData/100)" assign="sData"}>
<{math equation="round(5*$sData)" assign="uData"}>
<{$uData}>ポイント
商品詳細ページの表示させたい場所に設置してください。

2011年4月29日

ショップ独自のポイント制度について 1

カラーミーショップでは「GMOとくとくポイント」(GMOとくとくショップ、カラメル出店ショップ間で共通のポイント)とは別に、ショップ独自のポイント制度を導入することができます。
ショップ独自のポイントは、付与率を自前で決められますので、ショップに応じた値引率を設定できます。
リピーター獲得のための方策として、ネット通販にかぎらず、多くのショップで利用されています。

まず、ショップ独自のポイント制度導入にあたっての概説。
カラーミーでのポイント導入はそれほど難しくありません(ポイント制度使用設定「使用する」にするだけ)。

写真1.ポイント設定箇所
お店をつくる>決済の設定をする>ポイント設定

・ポイント制度使用設定(使用する/しない)
・ポイント支給タイプ(一般的な3通りの方法)
・使用可能ポイント数(最大を設定しないと使用できない。32767がMAX)。


■いくつかの問題点
写真1のように、かんたんに設定できますが、問題点もあります。

1.ポイント数を表示するための独自タグがないので、かんたんに表示できない
2.商品ごとに付与率を設定したいが、無理
3.お客様がポイントを確認しづらい

1については、JavaScriptを使用して、販売価格から計算し、表示するようにします。この問題については、解決可能です。次回にサンプル掲載いたします。
2については、シンプルな解決策は現状ありません。「商品を売る>顧客を管理する」から、お客様のポイントを手動で増減させることも可能ですが、分かりにくさや手間を考えれば、現実的ではありません。
3については、商品購入直後に送信される自動送信メールには、付与ポイント数や保有ポイント数が表示されません。マイアカウントにログインしてもらって確認するしかありません。モバイル用では、マイアカウントにすら表示されません。

■ポイント承認について
商品購入直後は仮ポイントとして付与されます。
入金確認後や商品発送後など、各ショップのタイミングで仮ポイントの承認を行います(写真2一番右のリンクから)。承認すると、お客様は使用可能になります。より詳細は、カラーミーのマニュアル参照。
写真2
注文直後は(使用できない)仮ポイントとして加算され、マイアカウントで確認できます。



■ポイントの使用方法と確認方法
・ほしい商品をカートに入れたのち、「レジへ進む」をクリックすると、「お客様情報の入力」画面になります。その画面で現在の保有ポイント数が表示され、今回使用するポイント数が入力できます。
・モバイルのお客様の場合、保有ポイント数の確認は「お客様情報の入力」画面でしか行えません。
・PCのお客様の場合、「お客様情報の入力」画面とマイアカウントから確認できます。
・ショップ運営者は、顧客管理から確認できます。ポイントの増減もできます。

写真3
モバイルの「お客様情報の入力」画面(抜粋)です。
PCの場合もおおよそこのような感じです。


今回はポイント設定全般の必要知識と、カラーミー上の問題点についてを書きました。
次回は「ショップ独自のポイント制度について 2」 で、Smartyで作ったのサンプルについて。

2011年4月4日

最近チェックした商品リストを作る

【追記】2012年1月31日に公式に実装されました。以下は古い記事になります。

【マニュアル】「商品グループ機能 階層化」「最近チェックした商品リスト」
カラーミーショップには、「最近チェックした商品(または最近見た商品)」がありません。
アカウント情報のひとつとして、サーバー側で持たせることが一般的ですが、現状そのような機能は搭載されていません。

ということで、クライアント様からご依頼がありましたので作成してみました。
必要な機能がシンプルなため、わりとかんたんに作られています(サンプルとしては好都合)。

ではかんたんに仕様から。
・商品詳細ページ(URLが?pid=)の場合、Cookieに書き込み
・書き込みの内容は、商品名、商品ID、商品画像URL(すべて独自タグあり)
・Cookieの読み書きはjquery.cookie.js(プラグイン)を使用

今回の機能ですが、以前作成した「ほしい物リスト」と、おおまかにいうと同じ考え方です。
Cookieを使用して情報を読み書きし、表示させる。jQuery、JavaScriptの使い方も同じです。
もっとも異なる点はAjaxを使用しない点です。
そのおかげで、実にシンプルかつスマート。

それでは、今回のサンプルを。

0.jQueryと自作関数を読み込み
<script type="text/javascript" src="http://~/jquery.js"></script>
<script type="text/javascript" src="http://~/jquery.cookie.js"></script>
<script type="text/javascript" src="http://~/recent.js"></script>

1.商品詳細ページの任意の場所に設置
商品名には、先頭に画像タグがつく場合があるので、strip_tagsで除去。
商品名に含む「”」などはトラブルのもと。エスケープしておく。
<{assign var="proname" value=$product.name|strip_tags|escape}>

<script type="text/javascript">
<!--
  set_recent_cookie("<{$product.id}>","<{$proname}>","<{$product.img_url}>",1);
// -->
</script>

2.表示したい任意の場所に設置
<div id="recent_item"></div>

<script type="text/javascript">
<!--
  load_recentlist();
// -->
</script>

3.JavaScript-recent.js
//Cookieセット
function set_recent_cookie(pid,name,img_url,i) {
  // 1書き込み 0消去
  if(i==1) {
    strCookie=$.cookie('recent');
    if(strCookie==null) {
      strCookie="";
    }
    else{
      loop=strCookie.match(/`/g)
      if(loop!=null && loop.length/4 >= 6){//6個保存
        //古い方から消す
        loc=strCookie.indexOf("`", strCookie.indexOf("`", strCookie.indexOf("`", strCookie.indexOf("`")+1)+1)+1);
        strCookie=strCookie.slice(loc+1);
        $.cookie('recent', strCookie ,{expires:365});
      }
    }
    strURL="`"+pid+"`"+name+"`"+img_url+"`";
    if(strCookie==null || strCookie=="") {
      strCookie=strURL;
      $.cookie('recent', strCookie,{expires:365});
    }
    else {
      strCookie=strCookie+strURL;
      $.cookie('recent', strCookie,{expires:365});
    }
  }
  else {
    $.cookie('recent','',{expires:-1});
    document.getElementById("recent_item").style.display='none';
  }
}

//最近チェックした商品リスト表示
function load_recentlist() {
  loc = new Array();

  //Cookie読み込み
  strCookie=$.cookie('recent');
  if(strCookie==null) {
    strCookie="";
  }
  loop=strCookie.match(/`/g);

  if(loop!=null){
    if(loop.length/4>6){
      n=6;
    }else{
      n=loop.length/4;
    }
  }
  else {
    n=0;
  }

  if(n !=0 ){
    loc[0]=strCookie.indexOf("`");
    loc[1]=strCookie.indexOf("`",loc[0]+1);
    loc[2]=strCookie.indexOf("`",loc[1]+1);
    loc[3]=strCookie.indexOf("`",loc[2]+1);
    str1=strCookie.substring(loc[0]+1,loc[1]);//商品ID
    str2=strCookie.substring(loc[1]+1,loc[2]);//商品名
    str3=strCookie.substring(loc[2]+1,loc[3]);//商品画像URL
    //この下の行は表示部分なので各自
    strOut="<div style='height:43px;overflow:hidden;margin-bottom:8px;width:100%;'><div style='height:43px;width:47px;float:left;'><a href='./?pid="+str1+"'><img style='width:43px;' src='"+str3+"'></a></div><div style='height:43px;'><a href='./?pid="+str1+"'>"+str2+"</a></div></div><div style='clear:both;height:1px;'><img src='http://img.shop-pro.jp/tmpl_img/11/sp.gif'></div>";
  }
  for(i=1;i<n;i++){
    loc[i*4]=strCookie.indexOf("`",loc[i*4-1]+1);
    loc[i*4+1]=strCookie.indexOf("`",loc[i*4]+1);
    loc[i*4+2]=strCookie.indexOf("`",loc[i*4+1]+1);
    loc[i*4+3]=strCookie.indexOf("`",loc[i*4+2]+1);
    str1=strCookie.substring(loc[i*4]+1,loc[i*4+1]);//商品ID
    str2=strCookie.substring(loc[i*4+1]+1,loc[i*4+2]);//商品名
    str3=strCookie.substring(loc[i*4+2]+1,loc[i*4+3]);//商品画像URL
    //この下の行は表示部分なので各自
    strOut="<div style='height:43px;overflow:hidden;margin-bottom:8px;width:100%;'><div style='height:43px;width:47px;float:left;'><a href='./?pid="+str1+"'><img style='width:43px;' src='"+str3+"'></a></div><div style='height:43px;'><a href='./?pid="+str1+"'>"+str2+"</a></div></div><div style='clear:both;height:1px;'><img src='http://img.shop-pro.jp/tmpl_img/11/sp.gif'></div>"+strOut;
  }
  if(n !=0 ){
    document.getElementById("recent_item").innerHTML=strOut;
  }
}

補足
・Cookieに書き込む情報は、`で囲む形式にしています。`は区切り文字として使用(ex. `商品ID`商品名`商品画像URL``商品ID2`商品名2`商品画像URL2`……)。使わない文字ならなんでもOKです。
・表示数(サンプルでは6)、表示用のHTMLタグは各自でいじってください。
・区切り方は(個人的には)もうすこし分かりやすく作れるなぁと思います。問題なく動きますので、細かいことは目をつぶることにします。
・このサンプルをすこしいじれば、かんたんな「ほしい物リスト」が作れます。
・販売済みや在庫0の場合、表示をどうするか。Cookieに追加しない、画像を販売済みに差し替えるなど。ショップごとに検討して、改良してください。


【関連記事】
・ほしい物リストを作る 1

2011年3月31日

商品詳細の説明欄と、JavaScript

カラーミーショップの商品説明欄にJavaScriptを埋め込む方法について。

商品登録時の説明欄は、説明文以外にもHTMLやJavaScriptを埋め込むこともできます。
ただし、カラーミーの環境設定で「自動改行する」にしている場合は、改行時に自動的に<br />タグが埋め込まれます。
説明文を書く場合には便利ですが、HTMLやJavaScriptを埋め込む場合は注意が必要です。

通常、JavaScriptを使用する場合は、<script>タグ内に記述しますが、改行時に<br />タグが自動で挿入されて、下のような感じになります。
<script type="text/javascript"><br />
<!--<br />
sample_func();<br />
// --><br />
</script><br />
Firefox3.6では問題ありませんでしたが、IE7(ほかのバージョンも該当するかも)では、構文エラーになり、関数がうまく動作しないことがあります。
おまけに改行も入るために意図しない空白も生じます。

ということで。
オレンジ部分のように、文の最後をコメントにすると良いです。<br />を自動的に挿入されても、コメントにして無効化することができます。
<script type="text/javascript"><!--
sample_func();//
// --></script>

【関連記事】
・カラーミーのフリーエリア考察

2010年8月21日

カートに入れるボタンを商品詳細ページ以外に設置する

以前、「Color Me Shop! pro - 助け合い掲示板」 に興味深い記事がありましたので、ちょこっと修正してサンプルのご紹介を。橙色部分は各自修正。
内容は表題どおり、「カートに入れるボタンを商品詳細ページ以外に設置する」。
<form name="product_form" method="post" action="http://secure.shop-pro.jp/?mode=cart_inn">
  購入数:<input type="text" name="product_num" value="1" />
  <input type="submit" value="カートに入れる" />
  <input type="hidden" name="product_id" value="12345678" />
  <input type="hidden" name="user_hash" value="<{$smarty.request.PHPSESSID}>" />
  <input type="hidden" name="members_hash" value="<{$smarty.request.PHPSESSID}>" />
  <input type="hidden" name="shop_id" value="PA01234567" />
  <input type="hidden" name="members_id" value="<{$smarty.session.PA01234567.MembersInfo.customer_id}>" />
  <input type="hidden" name="back_url" value="/" />
</form>
・product_numは、購入数。valueは初期購入数。商品詳細ページ内では独自タグ<{$product.init_num}>が使用可能ですが、他のページでは使用できませんので、直接数字を入れます。
・product_idは、商品詳細ページURLに表示されているとおり、「pid=」以下の数字。
・user_hash、members_hashは、そのままでOK。サーバーがユーザーを認識するための一連のやりとり、というくらいのイメージで。
・shop_idは、カラーミーショップ!プロのメニュー「オーナー情報」内にある「アカウントID」。

実際に試してみると、たしかに機能してそうです。
商品一覧ページに「カートに入れる」ボタンがあると便利よさそうと、思っていたので、これはつかえるかもしれません。それにしても、こんなことができるとは……勉強になりました。


【追記】 input type="hidden"としてサーバに送っているパラメータは、formタグ内の <{$product.info}> を展開したもの。 それゆえに、この独自タグがないと、カートが動かないのです。
【追記】オプションがある場合について、匿名さんが下にコメントを残してくれています。商品詳細ページに飛ばすという方法がシンプルでよいと思います。
カラーミー以外では、モーダルウィンドウで入力させる画面を表示している、カートもあります。

【関連記事】
・カラーミーにできること、できないこと

2010年5月27日

購入数の↓ボタンの位置がずれる

普段、Firefoxを使用していると、 Internet Explorerのデザインのズレに気づかなかったりします。
どこを修正した際に生じたかわかっていれば、一旦元に戻したのち、チマチマと原因を探ることになります。
検討がつかないと、ひどい時間のロスになります。
テンプレートのバックアップはこまめにとりましょう(カラーミーショップ!プロでは、テンプレート5つまで保存できます)。

今日の本題。
最近手直ししたサイトの「商品詳細」の購入数の矢印ボタンがずれていました。
Firefoxでは問題なかったので気づきませんでしたが、IE7.0では 上矢印と下矢印の間に妙な隙間ができていました。
いつずれたのかさっぱりわからず、バックアップのテンプレートとの差分をみながら、チマチマ作業。
CSSが原因らしいと検討がついたのち、さらにチマチマ作業。

特定のフォントのときに隙間があくと判明しました。
そういえば、font-familyにメイリオを追加したんだったと、解決した後で思い出しました。

直近の<div>に、問題のでない「font-family:Courier」追加して修正完了。
<div style="width: 15px; margin: 0px;font-family:Courier;">
ためしに、別のテンプレートで再現するか確認しましたが、問題発生したフォントでも隙間はできませんでした。
テンプレートによるのでしょうか。今回の話は、こんなこともあるのかーくらいで。

2010年5月26日

カートに入れるを二ヶ所につける 3

「カートに入れるを二ヶ所につける 2」のつづき。

今回はJavaScriptのサンプルです。ベースになるソースは「カートに入れるを二ヶ所につける 1」です。
JavaScriptですが、外部ファイルを読み込む場合は、ロリポップ!のようなレンタルサーバーに置き、「共通」か「商品詳細」の先頭で読み込みます( 汎用性のある関数は「共通」で)。<body>部でOK。
<script src="http://~/sample.js" type="text/javascript"></script>
ポイントは前回説明済みですので、今回は補足事項のみ。
・カートの二つめはまるまるコピーで、橙色部分を修正。
・置換処理では関数名しか差し替えていない。

1.テンプレート「商品詳細」の購入数からカートに入れるまで抜粋。橙色部分が修正箇所。
<form name="product_form" method="post" action="<{$cart_url}>">
  (中略)
  <{if $product.soldout_flg == 0 && $shop_stop_flg == false && $product.login_sale_flg == false }>
    <tr>
      <th>購入数</th>
      <td style="padding: 0px 5px;">
        <table border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td style="padding: 0px;">
              <input type="text" name="product_num" value="<{$product.init_num}>" style="width: 50px;" onKeyUp="change_key_num()"/>
            </td>
            <td style="padding: 0px;">
              <div style="width: 15px; margin: 0px;">
                <a href="<{$num_up_url|regex_replace:'/f_change_num2/':'change_button_num'}>"><img src="<{$num_up_img_url}>"></a>
                <a href="<{$num_dw_url|regex_replace:'/f_change_num2/':'change_button_num'}>"><img src="<{$num_dw_img_url}>"></a>
              </div>
            </td>
            <td style="padding: 0px;"><{$product.unit}></td>
          </tr>
       </table>
     </td>
   </tr>
  <{/if}>
  (中略)
  <{if $product.soldout_flg == 0 && $shop_stop_flg == false && $product.login_sale_flg == false }>
    <tr>
      <th>購入数</th>
      <td style="padding: 0px 5px;">
        <table border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td style="padding: 0px;">
              <input type="text" name="product_num2" value="<{$product.init_num}>" style="width: 50px;" onKeyUp="change_key_num2()" />
            </td>
            <td style="padding: 0px;">
              <div style="width: 15px; margin: 0px;">
                <a href="<{$num_up_url|regex_replace:'/f_change_num2\(document.product_form.product_num/':'change_button_num(document.product_form.product_num2'}>"><img src="<{$num_up_img_url}>"></a>
                <a href="<{$num_dw_url|regex_replace:'/f_change_num2\(document.product_form.product_num/':'change_button_num(document.product_form.product_num2'}>"><img src="<{$num_dw_img_url}>"></a>
              </div>
            </td>
            <td style="padding: 0px;"><{$product.unit}></td>
          </tr>
       </table>
     </td>
   </tr>
  <{/if}>
  (中略)
</form>

2.JavaScript
function change_key_num(){
  document.product_form.product_num2.value = document.product_form.product_num.value;
}

function change_key_num2(){
  document.product_form.product_num.value = document.product_form.product_num2.value;
}

//***********************************
//個数UP・DOWNボタン処理(差し替え版)
//***********************************
function change_button_num(select, pType, pMinNum, pStockNum) {
  if( select.value.match(/[^0-9]/)){ select.value = pMinNum; return; }
  wNum = parseInt(select.value);
  if (pType == "0" && wNum > pMinNum) {
    document.product_form.product_num.value = String(wNum-1);
    document.product_form.product_num2.value = String(wNum-1);
  }
  if (pType == "1") {
    if (pStockNum) {
      if (wNum >= pStockNum) return;
    }
    document.product_form.product_num.value = String(wNum+1);
    document.product_form.product_num2.value = String(wNum+1);
  }
}

テストした感じだと問題なさそうですが、いかがでしょうか。
以前に仕事でつくったソースより、ずいぶんシンプルになりました。


「カートに入れるを二ヶ所につける - オプション編」に続く。

【追記】
間違い部分を訂正しました。ご指摘ありがとうございました。

2010年5月25日

カートに入れるを二ヶ所につける 2

前回のつづきです。
カラーミーショップ!プロに「カートに入れる」をふたつ設置できるか。

修正する点
・テキスト入力フィールドと「カートに入れる」ボタンを設置
<form>~</form>のなかの設置したい場所に、2箇所目の<input>(とその周辺)を記述します。

・増減ボタンをクリックした場合
cart.js内の関数「f_change_num2」を直接修正してアップロードすることができませんので、正規表現と置換を使って、呼び出す関数を差し替えます。
呼び出す関数は「f_change_num2」 をベースに、複数あるテキスト入力フィールドの整合がとれるように数行付け加えます。作成したJavaScriptはレンタルサーバーに置きます。

・テキスト入力フィールドに直接文字を入力した場合
JavaScriptのイベントハンドラ、onKeyUp(キーアップ時に発生するイベント) を使用し、テキスト入力フィールドの整合をとるための関数を呼び出します。
自前で作成します(わずか数行です)。

次回はサンプルを作ってみます。


「カートに入れるを二ヶ所につける 3」につづく。

2010年5月24日

カートに入れるを二ヶ所につける 1

商品説明文がスクロールするくらい長いショップの方から、「カートに入れる」をページ上下に二つほしいと要望がありました。
なかをみると、カラーミーショップ!プロは通常ひとつを想定しているようでした。

複数設置すると当然のように、「購入数」を表示するテキスト入力フィールドが複数必要になります(なくても問題ありませんが、お客様の利便性を考えると普通はつけます)。
複数になると各々のテキストフィールド内で表示している数字の整合が取れなくなり、正しい数字をサーバーに渡すことができなくなります。
そこさえクリアすれば複数設置することは可能です。ポイントをみていきましょう。

1. 「商品詳細」の「カートに入れる」部分(使用テンプレートによって若干の違いあり)。
<form name="product_form" method="post" action="<{$cart_url}>">
  (中略)
  <{if $product.soldout_flg == 0 && $shop_stop_flg == false && $product.login_sale_flg == false }>
    <tr>
      <th>購入数</th>
      <td style="padding: 0px 5px;">
        <table border="0" cellpadding="0" cellspacing="0">
          <tr>
            <td style="padding: 0px;">
              <input type="text" name="product_num" value="<{$product.init_num}>" style="width: 50px;" />
            </td>
            <td style="padding: 0px;">
              <div style="width: 15px; margin: 0px;">
                <a href="<{$num_up_url}>"><img src="<{$num_up_img_url}>"></a>
                <a href="<{$num_dw_url}>"><img src="<{$num_dw_img_url}>"></a>
              </div>
            </td>
            <td style="padding: 0px;"><{$product.unit}></td>
          </tr>
       </table>
     </td>
   </tr>
  <{/if}>

  (中略)
</form>
以下の独自タグで、JavaScriptを呼び出します。
<{$num_up_url}>の内容
javascript:f_change_num2(document.product_form.product_num,'1',1,1);
<{$num_dw_url}>の内容
javascript:f_change_num2(document.product_form.product_num,'0',1,1);

2.http://~/js/cart.js 内の関数
//***********************************
//個数UP・DOWNボタン処理
//***********************************
function f_change_num2(select, pType, pMinNum, pStockNum) {
  if( select.value.match(/[^0-9]/)){ select.value = pMinNum; return; }
    wNum = parseInt(select.value);
    if (pType == "0" && wNum > pMinNum) {
      select.value = String(wNum-1);
    }
    if (pType == "1") {
      if (pStockNum) {
        if (wNum >= pStockNum) return;
      }
      select.value = String(wNum+1);
    }
}
数量を増減させるボタンを押すと、cart.js(最初からあるJavaScript)の関数「f_change_num2」が呼び出されます。pTypeで増か減かの条件分岐。
ここでのselect.valueとは、「document.product_form.product_num.value」のことです。

どのように整合をとるか、イメージできましたか。橙色部分が修正時のポイントです。
cart.jsは、はじめからあるJavaScriptで、ファイルの置き場所に手が出せません。そういうことで、なかを手直しすることはできません。

 「カートに入れるを二ヶ所につける 2」につづく。


【参照リンク】
・とほほのWWW入門

2010年5月19日

カラーミーのフリーエリア考察

メニュー「商品を売る」>「商品を管理する」>「商品登録」

カラーミーショップ!プロにおける、商品登録の入力項目はかっちりと決まっていることがほとんどです。
「商品画像の表示数をふやしたい 3」で書いたように、唯一「説明」項目は、 HTMLタグの使用が可能で、文字数を気にする必要もありません(文字数制限はあるかもしれませんが、かなりの文字数が使用可能)。惜しむらくは、唯一無二であるという点。

「商品詳細」ページから呼び出せるフリーの入力エリアがもっとあればなぁと、つねづね思います。
そいういう場所があれば、商品登録時に入力しておいて、商品ページに表示させるという使い方が可能です。
「商品画像の表示数をふやしたい 3」のような要望があったときは、フリーエリアに画像ファイル名を入力しておく、とか。
商品ごとに記載したい「なにか」を入力するエリアなど。こういう状況はよくあります。

そういうこともあって、別の項目で代用できないか、検討したことがあります。

・「簡易説明」は文字数制限全角127文字とHTMLタグは使用禁止で、おまけに「商品詳細」ページからは参照できません(「商品一覧」ページから参照可能)。(【追記】2015年6月現在、文字数制限については緩くなっています)

・「型番」は文字数制限半角50文字とHTMLタグは使用禁止で、制限がきびしいです。ただし「商品詳細」「商品一覧」「商品検索結果」の各ページから参照できます。

参照の仕方は、独自タグ(型番の場合は<{$product.model}>、<{$productlist.model}>)をテンプレートのHTMLソース内に埋め込んで、内容を表示させます。

注意すべき点は、独自タグはどのページからでも参照可能というわけではありません。
どのページにどのタグが使用できるかは、「独自タグ」をご覧ください。

商品ごとに入力しておきたい「なにか」がある場合は、選択の余地がほとんどありません。
「普段使っていない項目がある」ことが大前提です(型番を使っているなら、どこも空いていないかもしれません)。

もし「型番」を選んだ場合は、大欠点がひとつあります。
「型番」は注文時の自動配信メール内に「商品番号」として表示されます。
お客様の目にとまりますので、その点注意が必要です。


【関連記事】
・商品画像の表示数をふやしたい 3
・商品詳細の説明欄と、JavaScript

【追記】
「カラーミーで行こう」に、「モバイルショップ商品詳細でも<a><img>などのタグを使う!も<a><img>などのタグを使う!」という記事があります。アイデアに感心しきりです。
「あなたのショップ独自の規則でタグを作る」 →「置換で商品詳細テキストを書き換える」という手順。
この記事との関連もあり、リンクと追記をしました。

2010年5月18日

商品画像の表示数をふやしたい 3

「商品画像の表示数をふやしたい 2」からのつづき。

画像データは「商品画像の表示数をふやしたい 1」で書いたように、ロリポップ!やヘテムルのようなレンタルサーバーを借りて、ファイル置き場にします。
問題は、どのようにして商品画像を表示させるのでしょうか?

メニュー「商品を売る」>「商品を管理する」>「商品登録」

写真は商品登録ページの一部です。

「説明」という項目があります。
ここは通常、商品説明文を書く欄です。
前回は、「$product.ot4_url」の行を追加すれば、画像表示できるではないか? という仮定をしてみました(でも独自タグを勝手に作り出すことは無理なんです)。

画像の表示は「説明」という項目内で、HTMLのimgタグを使用します。
HTMLタグが使えるの? と思われたかもしれませんが、商品登録ページの項目で唯一、HTMLタグが使用可能な欄です(ちなみに独自タグは使えない)。
柔軟に使用できる唯一のエリアですので、表示するためにHTMLタグが必要な場合は、ここを利用してみてください。
ページデザインとの兼ね合いで、「説明」を利用できない場合などは、それ以外にも画像を表示する手立てはあります。
以下の関連記事を参考にどうぞ。


【関連記事】
・カラーミーのフリーエリア考察

2010年5月17日

商品画像の表示数をふやしたい 2

「商品画像の表示数をふやしたい 1」からのつづき。
似ているように感じるかもしれませんが、前回とはまったく別の話になります。

テンプレート内の種類「商品詳細」(カラーミーのデザイン設定 2の写真参照)にあるHTMLソースの画像表示部分を抜粋。
<{if $product.ot1_url != ""}>
  <div class="sub">
    <a target="_blank" href="<{$product.ot1_url}>"><img src="<{$product.ot1_url}>" /></a>
  </div>
<{/if}>
<{if $product.ot2_url != ""}>
  <div class="sub">
    <a target="_blank" href="<{$product.ot2_url}>"><img src="<{$product.ot2_url}>" /></a>
  </div>
<{/if}>
<{if $product.ot3_url != ""}>
  <div class="sub">
    <a target="_blank" href="<{$product.ot3_url}>"><img src="<{$product.ot3_url}>" /></a>
  </div>
<{/if}>
その他画像1のURLが空白でなければ、画像+画像のURLリンクを作成します、という意味です(以下2~3も同様です)。URLは「参照」ボタンをクリックしたあとで、一定の基準にのっとり、自動的に生成されます。

さて、さきほどのHTMLソースに一定の法則性があることに気づきましたか。
もしかしたら、その法則にのっとり、「$product.ot4_url」の行を追加すれば、4枚目の画像が表示できたりして。

なるほど……ですが、そんなことはできません。
$~は独自タグと呼ばれる部分で、われわれで勝手に作ることができないからです。


「商品画像の表示数をふやしたい 3」へつづく。

2010年5月16日

商品画像の表示数をふやしたい 1

「Color Me Shop! pro - 助け合い掲示板」に「商品詳細」ページの商品画像の表示数をふやしたいという質問がありました。

メニュー「商品を売る」>「商品を管理する」>「商品登録」
写真は商品登録ページの一部です。

カラーミーの商品登録ページ上では「商品画像」(商品一覧のサムネイルとして使ったりする商品の顔ともいうべき画像)1枚と、「その他画像1~3」(細部や付属品、角度を写真などに利用します)3枚の画像をアップロードすることができます。

ショップによっては、枚数が足りないこともあります。


カラーミーには商品登録ページ以外で、画像をアップロードできる場所がひとつあります。
メニュー「お店をつくる」>「画像ファイルを管理する」

ただし、拡張子による制限と、ファイルサイズの制限あり。


・拡張子 jpg、jpeg、gif、png、swf
・ファイルサイズ200KBまで
あまり使いやすい画面ではありませんので、ファイルを頻繁にアップしたり、消したり、ファイルを管理する場所としては適していません。
Webサイトのデザインパーツなど、長期間にわたって入れ替えることのない画像を置く場所としては有効です。

頻繁に、画像ファイルの管理をする必要があるなら、画像置き場として別にサーバー(ロリポップ!が安くていいかも)を借りることを検討した方がいいでしょう。

意外なことに、JavaScript(拡張子js)がカラーミー上に置けない。
そのような場合も、レンタルサーバーに置くしかないです。


「商品画像の表示数をふやしたい 2」へつづく。