2010年8月29日

ほしい物リストを作る 4

前回からのつづき。今回は具体的なサンプルを作ってみました。関数名、id名は任意でどうぞ。
XMLHttpRequestで送受信する部分は、いろいろなページで解説がされています。中身は、それらとほとんど変わりません。ただ、配列を使うバージョンはなかったように思いますので、その分だけ若干複雑になっています。

1.商品詳細ページの任意の場所に設置
<a href="#" onClick="JavaScript:set_wish_cookie(1);return false">ほしい物リストに追加する</a>

2.JavaScript-wish.js
//XMLHttpRequestオブジェクト生成
function createHttpRequest(num) {
  if(window.XMLHttpRequest) {
    //IE7 IE8 Firefox Opera Safari
    httpObj[num] = new XMLHttpRequest();
  }
  else if(window.ActiveXObject) {
    try {
        //MSXML2以降所
        httpObj[num] = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
          //旧MSXML
          httpObj[num] = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e2) {
          httpObj[num] = null;
      }
    }
  }
  else {
    httpObj[num] = null;
  }
}
//タイムアウト処理
function timeout(n) {
  httpObj[n].abort();
  document.getElementById("wish"+n).innerHTML = strPid[n] + " (Timeout)";
}
//ファイルにアクセスし受信内容を確認
function wish_requestFile(num,method,async,pid) {
  createHttpRequest(num);
  if(httpObj[num]) {
    timerID[num] = setTimeout('timeout("' + num + '")',30000);//タイムアウト30秒
    fileName[num] = "http://www.hogehoge.com/?pid="+pid;
    httpObj[num].open(method,fileName[num],async); 
    httpObj[num].onreadystatechange = function() {
      if(httpObj[num].readyState==4) {//受信完了後の処理
        clearTimeout(timerID[num]);//タイムアウト解除
        if(httpObj[num].status == 200) {//正常
          strRes[num] = httpObj[num].responseText;         
          //ほしい物リスト表示
          if(strRes[num].match(/現在、この商品は扱っておりません。/igm) == null) {
            //在庫ありの場合の処理
           document.getElementById("wish"+num).innerHTML ='' + '<a href="#" onClick="JavaScript:del_wish_cookie(' + pid + ');location.reload();return false">リストから削除</a>';
          }
          else {
            //在庫なしの場合の処理
            document.getElementById("wish"+num).innerHTML ="現在、商品ID "+ pid +" は扱っておりません。次回表示時にリストから自動的に削除されます。";
            del_wish_cookie(pid);
          }
        }
        else if(httpObj[num].status == 404) {//404エラー処理
          document.getElementById("wish"+num).style.display = "none";
        }
        else {//それ以外
          document.getElementById("wish"+num).innerHTML = "server status " + httpObj[num].status;
        }
      }
    }
    httpObj[num].send(null);
  }
}


//Cookie部分削除
function del_wish_cookie(strNum) {
  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});
  }
}

//Cookieセット
function set_wish_cookie(i) {
  if(i==1) {//追加
    strURL=location.href;
    strCookie=$.cookie('wish');
    if(strCookie==null) {
      strCookie="";
    }
    else {
      loop=strCookie.match(/!/g)
      if(loop!=null && loop.length/2 >= 20) {
        window.alert("これ以上追加することはできません(最大20点まで)");
        return;
      }
    }
    if(strURL.indexOf("?pid=")!=-1) {
      strURL=strURL.slice(strURL.indexOf("?pid=")+5);
      strURL="!"+strURL+"!";
      re = new RegExp(strURL);
      if(strCookie==null || strCookie=="") {
        strCookie=strURL;
        $.cookie('wish', strCookie,{expires:365});
        window.alert("ほしい物リストに追加しました");
      }
      else if(strCookie.search(re)==-1) {
        strCookie=strCookie+strURL;
        $.cookie('wish', strCookie,{expires:365});
        window.alert("ほしい物リストに追加しました");
      }
      else {
        window.alert("この商品はすでに追加されています");
      }
    }
  }
  else {//削除
    $.cookie('wish','',{expires:-1});
  }
}


//ほしい物リスト表示
function load_wishlist() {
  //Cookie読み込み
  httpObj = new Array();
  strRes = new Array();
  timerID = new Array();
  fileName = new Array();
  strPid = new Array();

  strCookie=$.cookie('wish');
  if(strCookie==null)  {
    strCookie="";
  }
  loop=strCookie.match(/!/g);
  if(loop!=null) {
    if(loop.length/2>20) {//最大20点まで
      N=20;
    }
   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));
    wish_requestFile(N+1-i,'GET',true,strPid[i]);
    strCookie=strCookie.slice(strCookie.indexOf("!",strCookie.indexOf("!")+1)+1);
  }
}

3.フリーページ
<div id="wish1"></div>
<div id="wish2"></div>
<div id="wish3"></div>
<div id="wish4"></div>
<div id="wish5"></div>
<div id="wish6"></div>
<div id="wish7"></div>
<div id="wish8"></div>
<div id="wish9"></div>
<div id="wish10"></div>
<div id="wish11"></div>
<div id="wish12"></div>
<div id="wish13"></div>
<div id="wish14"></div>
<div id="wish15"></div>
<div id="wish16"></div>
<div id="wish17"></div>
<div id="wish18"></div>
<div id="wish19"></div>
<div id="wish20"></div>
<script type="text/javascript">
<!--
  load_wishlist();
//-->
</script>
補足
・strRes[]に商品詳細ページまるまる格納されています。
・切り出す部分と表示は各自で作成してください(根気のいる作業です)。
・「現在、この商品は扱っておりません。」はテンプレートによっては異なるかもしれません。在庫の有無によって、処理・表示を分岐させます。在庫表示管理の設定や商材の種類によって、内容を見直す必要があります。
・~部分に表示させる情報を。その上の行に、切り出す処理を追加してください。
・最大登録数を20点にしています。サーバーへの負荷がかかりますので、無茶しない数で。
・Cookieに書き込む商品IDは、!で囲む形式にしています。!は区切り文字として使用。ex. !12345678!

XMLHttpRequestを使用せずに、もっと楽にシンプルに作れるとよいのですが。
使用時はサーバーに過度の負担をかけない程度に。

これに追加して、「カートに入れるボタンを商品詳細ページ以外に設置する」 を使えば、ほしい物リストページにカートに入れるボタンを設置することも可能(多分)。試したあとで、ご紹介したいと思います。


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

2010年8月28日

ほしい物リストを作る 3

前回からの引き続きで、「ほしい物リストを作る」。

XMLHttpRequestを説明するまえに、今後よく見かけるであろうAjaxという用語について。
All About-Ajaxの基本」にわかりやすい説明がありましたので、まずはご一読を。
XMLHttpRequestによる送受信の流れもわかりやすく書いてあります。

Ajaxとは、Asynchronous JavaScript + XML(非同期なJavaScriptとXML)の略。
XMLHttpRequestはAjaxの中心となる技術で、ページ遷移なしで、非同期にサーバーとデータのやりとりをすることができます。ひどく目新しい技術、ということではなく、従来のJavaScriptの延長線上にあるものと考えて差し支えありません。ただ、はじめてこれを目にすると、かなり衝撃をうけます。
(jQueryのライブラリを使用する方法もありますが、このサイトでは使用していません)

Ajaxの特徴
情報を取ってくるのにページ遷移不要ですので、現在表示中のページに影響をおよぼしません。
非同期なので、ブラウザがロックしません(読み込み完了しなくても、別の操作ができます)。
上記のような理由もあり気づきにくいですが、gmailやGoogleマップなどでも使用されています。

ほしい物リストを作るための、もうすこし具体的な話
1.フリーページ
・ほしい物リスト表示ページの枠を作成→HTML、CSS
・Cookieを読んで、商品IDを取得→jQuery、JavaScript
・Ajaxで商品詳細ページのデータ取得→XMLHttpRequest
・取得後、必要情報を切り出し→JavaScript(indexOf、substring)
・ほしい物リスト表示ページをの枠に入れていく→JavaScript(document.getElementById(id).innerHTML)
2.商品詳細ページ
・ほしい物リストに追加するボタンを設置。クリック時にCookieに商品IDを書き込み→jQuery

XMLHttpRequestは、おいおい解説記事を書く予定ではありますが、まずは各自自習でよろしくお願いします。
簡単なサンプルを使用して(コピペするだけでも良いので)、動くところを実際にみて確認しておくと、このあとの作業でイメージがしやすいと思います。

次回「ほしい物リストを作る 4」 では、サンプルを作ってみます。

2010年8月24日

ほしい物リストを作る 2

前回のつづき。
どうやって必要な情報を取得するかより先に、ほしい物リストに必要な情報はなにか、という点について考えなければいけません。
商品名、販売価格、画像URL、説明文、+α。こんなところでしょうか。

前回も書きましたが、ほしい物リストを実現するためには二通りの方法が考えられます。
・Cookieに必要な情報すべてを書き込む方法
・商品IDだけ書き込んで随時商品ページから必要な情報を読み出す方法

作成するにあたり、Cookieの知識は重要ですので、まず先にその点について。

[引用] OPEN SPACE-Cookieファイルについて
■Cookieファイルの制限
cookieファイルは1行単位で処理され、ファイルの最大サイズは4KB (4096文字)、エントリーの合計は300、サーバーまたはドメインで最大20となっています。この制限を越えた場合使用されていないものから削除されていきます。
まず文字数制限があること。
ほしい物リストの必要情報すべてをCookieに書き込むとしたら、一商品あたりどれくらいの文字数が必要でしょうか。登録する商品点数は? ファイルサイズは足りますか? Cookieが二個以上必要になりますか?
いくつか制限はあるものの、なんとか切り抜けられそうなことが想像できます。

それでもここでは、もう一方の商品IDだけを書き込む方法を採用しています。かんたんな仕様は前回書いたとおりですが、あらためて以下に示します。
・「ほしい物リストに追加する」ボタンをクリックすると、Cookieに商品IDを書き込む
・ほしい物リスト一覧ページをフリーページで作成し、ページデザインをする
・商品ID以外にも表示に必要な情報を取得
・「ほしい物リストから削除する」ボタンをつくる

なぜ手間のかかる方を採用したか。
私がほしい物リスト機能を設置したショップの取り扱い商品は、基本的に一点もの(売れると表示されない)、という事情がありました。ほしい物リストに追加したはいいが、見たさいに在庫がないという状況は容易に想像できます。
ということで、「ほしい物リストページを表示したさいに、在庫のないものは消す」と設計をしました(お客様に手動で消してもらうのは手間で、申し訳なかったから)。
在庫の有無をCookieに書き込むことは無理ですし(情報が反映されない)、soldout_flgのような在庫の独自タグを参照できればよいのですが、フリーページからではそれもままなりません。
ほしい物リストの表示のたびに商品詳細ページに在庫の有無を確認しに行く必要があった訳です。
ということで、結局このような手間のかかる方法を採用することになりました。

そのほかにも細かい点で気になることがあります。
必要な情報内容が変更されたら? たとえば、価格改定が行われたら?
一度Cookieに書き込んでしまうと、修正するタイミングがありません。
ほしい物リストページに必要な情報を追加したくなったら?
Cookieに必要情報をすべて書き込む方法は柔軟性の面で、少し弱点がありました。

次回「ほしい物リストを作る 3」は、どうやって必要情報を取ってくるのか(XMLHttpRequestという機能を使用します)についてと、そのほか機能実現のための手段について。


【参照リンク】
OPEN SPACE-Ajaxを勉強しよう

2010年8月22日

ほしい物リストを作る 1

【追記】2013年10月以降は、カラーミーAPIでデータを引っ張ってくるのが素直。

カラーミーショップ!プロのカートシステムは機能面で少々物足りなく感じることがあります。
大手通販サイトでは、「ほしい物リスト(お気に入り、ウィッシュリストと呼ばれたりもします)」がついていることがよくあります。サーバー側で機能を持たせることが普通ですが、これは私たちからはいじることができません。私たち側からやれることで、実現できないのでしょうか。

方法としては。
・Cookieに必要な情報すべてを書き込む方法→「最近チェックした商品リストを作る」を参照
・商品IDだけ書き込んで随時商品ページから必要な情報を読み出す→ここではこちらを採用

仕様は以下のとおり。
・「ほしい物リストに追加する」ボタンをクリックすると、Cookieに商品IDを書き込む
・ほしい物リスト一覧ページをフリーページで作成し、ページデザインをする
・商品ID以外にも表示に必要な情報を取得してくる
・「ほしい物リストから削除する」ボタンをつくる

問題は、必要な情報をどうやって取得するかです。

ほしい物リストを作る 2」につづく。


【関連記事】
最近チェックした商品リストを作る

【追記】
各ページの内容を見直しました。

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年8月14日

Twitterでつぶやく

ありとあらゆる方面で流行中のTwitterですが、カラーミーショップ!プロを使っているクライアント様から、つぶやきボタンをつけてほしいと依頼がありました。
Twitter機能自体をそれほど詳しくない(そもそもほとんど使ったことがなかった)ので、どんな使われ方がされて、どんなことができるか要調査が必要かもしれません。もうしばらくはオンラインショップでも重要なツールとして使われるかもしれませんので。
ではさっそく、サンプルから。
<a href="http://twitter.com/home?status=http://www.hogehoge.com/?pid=<{$product.id}>" target="_blank"><img src="http://twitter-badges.s3.amazonaws.com/t_mini-b.png" alt="Twitterでつぶやく"></a>
Twitterボタンは、サンプルとして公式から参照しています。

現在閲覧中の商品ページのURLを貼ればOKという依頼でしたので、これで終了。さほど大層なものではありません。product.idの部分は、JavaScriptのlocation.hrefを使用しても良いかもしれません。
ただ、 これにプラスして、商品名もつけてほしいといわれると状況は変わるようです。

Color Me Shop! pro - 助け合い掲示板」をみると、全角文字が文字化けするそうです。
 Escape Codec Library:ecl.jp のライブラリで、EUC-JP→UTF-8変換が必要とのこと。

変換なしで試してみると、「Invalid Unicode value in one or more parameters」とエラーメッセージ。Webページのソースをのぞいてみると、たしかに、TwitterがUTF-8で、カラーミーショップ!プロがEUC-JPでした。
設置方法の詳細は上記リンクにありますので、そちらをご参照下さい。


【参照リンク】
「かぐや東京」さまのWebサイト(Twitterボタンが搭載されている家具屋さん)

【追記】
古い記事になりましたので、「ツイートする 2」 で情報更新しました。

2010年6月19日

英語ページをつくる 2

前回の「英語ページをつくる 1」からの続き。

まずは今回の仕様から。
・日本語・英語ボタンを設置して、クリックしたら表示(メニュー画像やページ丸ごと)を切り替える
・クリックの情報はCookieで記憶させて、次回以降はそれをもとにメニューを表示させる
・クリック時には、現在表示しているページによってはページ遷移する(たとえば、日本語の送料ページをみているときに、英語ボタンを押したら、英語の送料ページに飛ぶ)

1.テンプレート「共通」。jsファイルの呼び出しは先頭行。ボタン(クリックするとJavaScript関数を呼びます)とメニューは任意の位置に書きます。
<script src="http://~/jquery.js" type="text/javascript"></script>
<script src="http://~/jquery.cookie.js" type="text/javascript"></script>
(略)

//言語切り替えボタン
<a href="javascript:void(0)" onclick="set_lang_cookie(0);return false;"><img src="~/button_jp.jpg" /></a>
<a href="javascript:void(0)" onclick="set_lang_cookie(1);return false;"><img src="~/button_en.jpg" /></a>
//表示メニュー
<div id="menu">jp_menu</div>

(略)
<!-- idより下でないとNULL(エラー)になる -->
<script type="text/javascript">
<!--
  change_en_menu();
//-->
</script>

2.JavaScriptとjQuery。Cookieの操作はjQueryで行います。
f1、f2が日本語、f11、f12が英語ページ、と仮定すると、以下のようにしてページ遷移させます。
もうすこし詳しく例を書くと、
f1…日本語の商品発送について(フリーページ1)
f11…英語の商品発送について(フリーページ11)
ページの対応に法則性をつけると、JavaScriptでうまいぐあいに作りこめます(今回のサンプルではそこまでやっていません)。
//クリック時に実行される関数
function set_lang_cookie(i) {
  if(i==1) {
    $.cookie('lang','en',{expires:365});//クッキー書き込み{days}
    strURL = location.href;
    if(strURL.indexOf("mode=f1")!=-1) {
      location.href="http://www.hogehoge.com/?mode=f11";//ページ遷移
    }
    else if(strURL.indexOf("mode=f2")!=-1) {
      location.href="http://www.hogehoge.com/?mode=f12";//ページ遷移
    }
    else {
      location.reload();
    }
  }
  else {
    $.cookie('lang','',{expires:-1});//クッキー削除
    strURL = location.href;
    if(strURL.indexOf("mode=f11")!=-1) {
      location.href="http://www.hogehoge.com/?mode=f1";//ページ遷移
    }
    else if(strURL.indexOf("mode=f12")!=-1) {
      location.href="http://www.hogehoge.com/?mode=f2";//ページ遷移
    }
    else {
      location.reload();
    }
  }
}

//ページ読み込み時に実行される関数
function change_en_menu() {
  if($.cookie('lang')=="en"){
    document.getElementById("menu").innerHTML="en_menu";
  }
}
jp_menu、en_menuはHTMLタグを使って、各自作りこんでください。
次回以降の訪問時には、保存されているCookieをみて、日本語/英語メニューを適宜表示してくれます。
jQueryについては機会をみて、紹介記事を書こうと思います。

2010年6月6日

英語ページをつくる 1

海外から注文がありそうな商品を取り扱っていると、やはり英語ページも必要になってきます。
カラーミーショップ!プロでは、決済ページはSSLを使用しているので、ショッピングカート周りはほとんどいじる手立てがありません(せいぜい配色を変えられるくらい)。

海外のお客様向けに、現時点で何ができるかを検討してみました。

・フリーページを使用して、海外のお客様専用説明ページを作成
取り扱い商品の概説、オーダー方法(e-mailオーダー)、配送方法とシッピング・コストについて(small packetやEMS)、支払方法(PayPalなど)の記載が必要です。国内向けとは内容が異なりますので、新ページで作成するのが一般的です。
目立つところに”For Customers Abroad” として新ページ(フリーページ)へのリンクを張っておけばよいでしょう。

google翻訳を設置
ページ遷移時も翻訳モード状態でついてきてくれますし、翻訳性能も良好。設置もコピペと非常に簡単です。手間をかけず、すぐにできます。

以上のようなことでしたら難しいこともなく、サイトデザインの問題として手軽に実現可能です。
当ブログとしては、もうひと手間をかけたところについて説明していきます。

・メニュー画像などを英語版にする
プレーンテキストはgoogle翻訳などにまかせられても、日本語を使用した画像はそうもいきません(特にメニューが読めないと、お客様は不便です)。
別個に英語版画像を作成し、document.getElementbyId(id).innerHTMLで、動的に内容を差し替えます。 

・日本語/英語の切り替え方法
切り替えボタンを設置し、クリックするとJavaScriptの関数を呼び出す形にします(上で「動的に内容を差し替える」と書いたのはこのことです)。JavaScriptになにを書くかはのちほどサンプルで説明します。

・Cookieに状態を記憶させる
日本語ページか英語ページか、いずれを表示するのかCookieに記憶させておくと、毎回切り替えボタンをクリックせずにすみます。
CookieはjQuery(JavaScript汎用ライブラリ)を利用すると、簡単にあつかえます。jQueryはなにかと便利ですから、このブログでもこれから何度も登場する予定です。


次回「英語ページをつくる 2」は、サンプルを作成します。

2010年6月4日

Smartyサンプル 2

【仕事サイトにSmartyの関連記事を書きました】
カラーミーショップのカスタマイズに便利なSmartyを学ぶ (1/2) 
カラーミーショップのカスタマイズに便利なSmartyを学ぶ (2/2)


Smartyで、こんなことができます。
あらかじめオンライン・マニュアルで内容を確認しておくと、アイデア実現のさいに役立ちます。

<{cycle}>で、背景色を交互に変える。色コード指定しています。2色交互ですが、追加して3色以上でも可能。
「bgcolor」を「class」にしてクラス名を指定することもできます。
<{section name=num loop=$productlist}>
  <tr bgcolor="<{cycle values="#999,#ccc"}>">
    <td>{$productlist[num]}.price</td>
  </tr>
<{/section}>

<{section}>ループ内でなくても動きます。
作成したリンクページの背景色を交互にするサンプル。
<tr class="<{cycle values="bg1,bg2"}>">
  <td><a href="~">XXXX</a></td>
</tr>
<tr class="<{cycle values="bg1,bg2"}>">
  <td><a href="~">YYYY</a></td>
</tr>
使い道はいろいろとありそうな気がします。


【参照リンク】
Smarty

【関連記事】
Smartyサンプル 1

2010年6月2日

Smartyサンプル 1

【仕事サイトにSmartyの関連記事を書きました】
カラーミーショップのカスタマイズに便利なSmartyを学ぶ (1/2) 
カラーミーショップのカスタマイズに便利なSmartyを学ぶ (2/2)

 
カラーミーショップでは、Smartyと呼ばれるテンプレートエンジンが使用されています。

Smartyでやれること
・独自タグでデータ出力しページ上に表示させる (商品名や価格など。基本中の基本)
・デザインにより近いところでの、条件分岐やループ(JavaScriptでも条件分岐やループはできるがデザインが大変)
・正規表現と置換(regex_replace)が強力
たとえば、商品名を表示させる独自タグ(<{$product.name}>)には、「商品名への付加画像設定」で画像(New画像など)を指定した場合には、HTMLのimgタグがもれなくついてきます。
商品名のみが必要な場合は、
<{$product.name|regex_replace:'/\\<\\/?[^\\>]*\\>/':''}>
とすると、不要なタグ部分をのぞいて取り出せます(商品名によっては必要な部分までとりのぞいてしまいますが)。
そのほか、特定の文字列以降をごっそり消してしまうこともできます(例の場合は■以降を空の文字列に置換している)。
カラーミーには大・小2カテゴリーしかありませんので、商品名にカテゴリー要素を組み込んでおき、正規表現で上手に取り出すという使い方もできます。
<{$product.name|regex_replace:'/■.+/':''}>


Smartyの、あくまでサンプル
・$smarty リクエスト変数(たとえば、URLの”cid=”のあとの文字)などを参照する。例の場合は、商品検索時のカテゴリidを表示します。
<{$smarty.get.cid}>
・assign テンプレート変数を割り当てる。
<{assign var="name" value=$product.name|regex_replace:'/\\<\\/?[^\\>]*\\>/':''}>
<{$name|regex_replace:'/■/':'☆'}>
これでも同じこと(参考)
<{assign var="name" value=$product.name|regex_replace:'/\\<\\/?[^\\>]*\\>/':''|regex_replace:'/■/':'☆'}>
<{$name}>
・fetch コンテンツを読む。ページを読んで、必要な情報を切り出すことも可能です。
<{fetch file="http://~/?mode=srh&cid=&keyword=hoge" assign="res"}>
<{$res|regex_replace:'/\\<\\/?[^\\>]*\\>/':''}>
・strip_tags 変数の修飾子。あとから気づいたんですが、HTMLタグを取り除く機能は、わざわざ正規表現を使用して置換せずとも、はじめからついています(どう考えてもこっちのほうが簡単)。
例の場合は、商品名からHTMLタグを取り除いています。商品登録時に、「商品名への付加画像設定」をしていると、imgタグがつきます(たとえば、New画像など)。
<{$product.name|strip_tags}>
上記の場合はHTMLタグをひとつの空白に置き換えています。
さらに、別の文字列や空白なしにすることもできます(:以降で設定、下例では空白なし)。
<{$product.name|strip_tags:''}>

【参照リンク】
Smarty

【関連記事】
Smartyサンプル 2
ツィートする 2

2010年5月28日

独自タグをJavaScriptの関数に渡す

カラーミーショップ!プロには、いくつも独自タグがあります。
写真は独自タグのページから一部抜粋したものです。

独自タグ、Smarty、JavaScriptを組み合わせることにより、パワフルなカスタマイズが可能です。

JavaScriptの関数の引数として独自タグを渡すさいの注意はひとつ
文字として渡す場合は””で括ること
<script type="text/javascript">
<!--
  sample_function("<{$product.name}>");
//-->
</script>
独自タグを参照ののち、JavaScriptの処理がなされます。

document.write("<{$product.name}>"); 
としたら商品名が表示されます(意味のない使い方ですが)。

Smarty初心者(私がそうなんですが)には気がつきにくい点だと思いました。


【関連記事】
カラーミーのカテゴリー表示2

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月22日

カラーミーの検索機能+案

【追記】2011年7月7日にAND検索になりました。この記事の一部は古い情報です。

カラーミーショップ!プロには、ショップ内検索窓をつけることができます。
しかし、非常に不便なことに、AND検索ができません(当然のように、ORもなにもかもダメ)。
空白(スペース)もキーワードの一部と認識されます。
完全一致した場合のみヒットします。

そういう理由から、「Google」や「Yahoo」の検索エンジンを借りてつけているお店もあります。


話は変わりまして。検索機能のアイデア。
お部屋探しサイトのような条件絞込み用のチェックボタン(1DK、オートロック、ペット可などあんなやつ)のついた検索ページは作れないの?と訊かれたので、ちょっと考えてみました。
カラーミーはAND検索ができないので、複数の条件で検索することは、容易ではありません。

そこで。
UNIXのパーミッションのように、1、2、4、8、~というような数字(2のべき乗)に検索条件としての意味を持たせて、「商品詳細」の型番あたりに仕込んでおくと、お客様が選択したいくつかの条件で商品を絞り込める、なんて。
商品登録が面倒ではありますが、非常に面白い機能が付けられると思います。

0・1の二進数を使って、フラグの立っている場所に意味を持たせるというやり方は、UNIXのパーミッションにかぎらず、しばしば見かけるプログラミング・テクニックです。


【関連記事】
カラーミーにできること、できないこと
カラーミー のフリーエリア考察

2010年5月21日

カラーミーのカテゴリー表示 2

【追記】 公式に実装されました。以下は古い記事になります。
当サイトの記事「2011年夏以降の新機能まとめ


カラーミーのカテゴリー表示 1」のつづき。
サンプルを作ってみました。例として、テンプレート「ウッド」を使用しています。id名は任意でどうぞ。

1.テンプレート「商品検索結果」上部の該当箇所に、橙色部分を追加。
<div id="result" style="color:#666;padding:0px 5px;margin-bottom:15px;">
検索条件
[カテゴリー]:<{if $search_category!=""}><strong><{$search_category}></strong><{/if}>
[検索文字]:<{if $search_keyword!=""}><strong><{$search_keyword}></strong><{/if}>
<br />
HIT件数:<strong><{$productlist_num}></strong>件
</div>


<table class="main_title" cellpadding="0" cellspacing="0" border="0" style="margin-bottom:1px;">
<tr><td id="title"><img src="http://img.shop-pro.jp/tmpl_img/11/sp.gif" width="15px" height="5px">▼ 検索結果</td></tr>
</table>

2.テンプレート「商品検索結果」の一番下に新規追加(id="title"、id="result"より下であればOK)。
//条件分岐。見出し変更と関数呼び出し
<{if $search_keyword=="指定なし"}>
  <script type="text/javascript">
  <!--
    document.getElementById("title").innerHTML = "▼ カテゴリー別商品";
    SetCategory("<{$smarty.get.cid}>","<{$search_category}>","<{$shop_name}>");
  //-->
  </script>
<{else}>
  <script type="text/javascript">
  <!--
    document.getElementById("title").innerHTML = "▼ 検索結果";

  //-->
  </script>
<{/if}>

3.JavaScript(外部ファイルの場合は、テンプレート「共通」または「商品検索結果」 の先頭で読み込む。<body>部でOK
//ウィンドウのタイトル変更、パンくずリスト作成
function SetCategory(cid,cname,sname) {
  strTag1=' <a href="./">ホーム</a> > <a href="./?mode=srh&sort=n&cid=';
  strTag2='">';
  strTag3='</a>';
  if(cid != "") {
    document.getElementById("result").innerHTML=strTag1+cid+"%2C0&keyword="+strTag2+cname+strTag3;
    window.document.title = cname + " - " + sname;
  }
  else {
    document.getElementById("result").innerHTML=strTag1+"& keyword="+strTag2+"全ての商品"+strTag3;
    window.document.title = "全ての商品 - " + sname;
  }
}

【参照リンク】
とほほのJavaScriptリファレンス

【関連記事】
独自タグをJavaScriptの関数に渡す

【追記】
以前、Smarty使用しない版を掲載していましたが、差し替えました。こちらのほうが断然良い出来です。
【追記2】
質問コメントがありましたので、手直ししました。
【追記3】
助け合い掲示板にも同様の話題がありました。
【追記4】
JavaScriptを置くレンタルサーバーがない場合は、テンプレート編集の「共通」の先頭が都合よいです。上のをコピペしただけでは動きませんので、下の書き方を参考して下さい。
<script type="text/javascript">
  function SetCategory(cid,cname,sname) {
    ~
  }
</script>

2010年5月20日

カラーミーのカテゴリー表示 1

【追記】 2012/01/31に公式に実装されました。以下は古い記事になります。
当サイトの記事「2011年夏以降の新機能まとめ


「商品を売る」>「商品を管理する」>「カテゴリー管理」

カラーミーショップ!プロは、カテゴリーを作成し商品を分類することができます。
大カテゴリーと、その下に小カテゴリーが作成できます。

まずは、ABCマート(大手の靴屋さん)のHAWKINS(大カテゴリー)をクリックしたときに表示されたページ。

写真1
大カテゴリーをクリックすると、その下にある小カテゴリーのリンク付き画像一覧が表示されます。
カラーミーもこのような表示の仕方をします。お客様によっては、手間と感じることもあるでしょう。
現状カラーミーの仕様では、 
大カテゴリー直下の商品は表示されますが、 大カテゴリー直下の小カテゴリーに入っている商品は表示されません

そこでカラーミーで「大カテゴリーをクリックすると、その下の小カテゴリー内の全商品も表示する」ためにどうしましょうか?
 大カテゴリーを”キーワードなし”で検索し、その結果を表示させる
この方法だと、大カテゴリー下の小カテゴリーの商品を含め全商品が表示可能です。

”キーワードなし”の場合は、あたかも「商品一覧」ページを表示しているかのように
”キーワードあり”の場合は、従来どおり「商品検索結果」ページを表示しているようにします。

具体的には、「商品検索結果」ページの一番下にif文を置きます。検索キーワードで条件分岐します。
<{if $search_keyword == "指定なし"}>
  (大カテゴリーの商品一覧用処理)
<{/if}>
(大カテゴリーの商品一覧用処理)は「document.getElementById(id名).innerHTML」を使用します。
元ページが「商品検索結果」であると見破られないように、ページタイトルを変更、パンくずリストを追加、検索結果を表示している行を削除、などなど見た目を調整します。

「商品一覧」と「商品検索結果」のデザインが比較的似ている場合は、手間少なく作れると思います。
次回はサンプルソースを用意します。


カラーミーのカテゴリー表示 2」につづく。

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

【追記】
・コメントいただいた動的URLとSEOについては、「そんな話がある」程度の認識です。SEOについてなにか書けることは残念ながらございません。
カラーミーショップ - 助け合い掲示板」でときどき話題にあがっていますので、当ブログの読者の方で気になる方は投稿をチェックしてみてください。
Google公式のSEO対策「Google 検索エンジン最適化スターターガイド」。目新しくはありませんが、この程度くらいでいいんじゃないかなと、個人的には思います。

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」へつづく。

2010年5月15日

サイト制作にかかせないツール類

カラーミーショップ!プロのテンプレートをいじるときもそうですが、「これだけは」というツールがあります。
それは、Firefoxアドオンの「Firebug」です。

サイトデザイン時に幅を調べたり、id名やclass名を調べたり(テンプレート修正にはかなり重要)、さらには、JavaScriptの構文エラー箇所を調べたり、機能は多岐にわたり、非常に強力なツールです。
よくある勘違いを先に書いておくと、このツールはサイト制作を補助してくれるツールであって、制作自体は別のところで行う必要があります。
はじめは、使い方がちょっと難しいですので、のちのち、紹介記事を書きたいと思います。


ついでに、Web制作における便利サイトも紹介します。

ショップを見にきてくれるお客様のブラウザが、Internet Exploror(以下、IE)であるとは限りません。IE用にデザインを組むと、他ブラウザで表示したさいに、がたがたになることはよくあります。

私のようにFirefoxを使用している方もいるでしょう。
Operaや、最近ですとGoogle Chromeもありますし、Macユーザーかもしれません。
勢いのある、iPhoneだって捨てておけません。
IEであってもバージョン6と7とでは、デザインが思っていたように表示できているとは限りません。

手間の面から、全ブラウザをインストールしてチェックというわけにもいかないでしょう。
さまざまなブラウザで、どのような表示がされているかをチェックするサイトがあります(スクリーンショットを撮って見せてくれます)。
それが「BrowserShots」です。
同じような機能を持ったWebサイトで日本語のところもありますので、気に入ったところを探してみてください。

ブラウザが異なることによるサイトデザインの崩れについては、別の機会にいくつかのパターンを紹介できればと思います。

2010年5月14日

カラーミーの商品並び順

カラーミーショップ!プロは、その柔軟なカスタマイズ性によって、大体のことはできるんですが、なぜか商品のソート機能(並び順)が不思議です。

使用しているテンプレートによって若干違うかもしれませんが、基本形は
[並び順を変更] ・おすすめ順 ・価格順 ・新着順
となっています。具体的には、以下のように並び替えられます。

・おすすめ順

商品IDの古いものから新しいもの順(まったくおすすめじゃない)。

・新着順
商品IDの新しいものから古いもの順(商品IDは商品データを新規追加するたびに、より大きな数字が振られる)。
 

・価格順
価格の安いものから高いものへ並べ替えます(昇順・降順の選択はできない)。


なぜか、商品名で並び替えられません。これは不親切で、結構不便です。
商品数がすくないショップでしたら、手動でやっているところもあるようです。この問題ばかりは、ショッピングカート・システムを借りている私たちではどうしようもなく、ペパボが機能を追加してくれることを祈るばかり。


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

2010年5月13日

カラーミーにできること、できないこと

ショッピングカート「カラーミーショップ!プロ」を借りてネットショップを運営しはじめると、デザイン的(たとえば、2カラムから3カラムにしたい)、機能的(○○はできないのですか? など)な点で疑問が湧いてくることがあります。

はじめて使う方がほとんどですから、「なにができて、なにができないか」は、なかなか想像つかないものです。実践しながら覚えていくもの、とはいえ、他にやることがあるのに、ネットショップの制作ばかりに、時間を割いているわけにはいきません。
そんなときにはまず、「Color Me Shop! pro - 助け合い掲示板」で検索します。

カラーミー運営上の疑問点の多くが、すでに質問としてあげられています。
自分と同じように、ほかのひとも同じことで困っている場合が多いからです。

情報量も多く、私はいまでもよく利用しています。
デザイン的な事柄のほとんどは、HTML・CSSの知識さえあれば自力で解決できます。
しかし、機能的な事柄はショッピングカートを借りているわれわれでは、どうしようもないことがほとんどです。

それゆえに「なにができて、なにができないか」は重要な知識になります。
このブログでも、適宜ご紹介していく予定で、最終的には、まとめページを作成する予定です。


【関連記事】
カラメルとGMOとくとくポイント共通ヘッダー
カラーミーの商品並び順
カラーミーのカテゴリー表示 1(カテゴリー表示について)
カラーミーの検索機能+案
カートに入れるボタンを商品詳細ページ以外に設置する
ほしい物リストを作る 1
最近チェックした商品リストを作る
ショップ独自のポイント制度について 1
SSL対応ページのカスタマイズについて(記事とリンクはのちほど)
送料計算をどうしようか(記事とリンクはのちほど)

2010年5月12日

カラーミーのデザイン設定 3

前回の「カラーミーのデザイン設定 2」 からのつづき。


テンプレートを使って、簡単にページを量産するということを前回書きましたが、もしテンプレート(雛形)がひとつしかなかったら、どうでしょう?

ネットショップをするにあたって、商品ページ以外にも、必要なページがいくつもあります。検索結果を表示するページもそうです。
そういう役割の違うページごとに、いくつかデザインを用意しなければいけません。
ゆえに「種類」という項目があるのです。

いじっているうちに、それだけでは足りないことに気づくと思います。
多くのショップで使用される基本的なページ(共通、トップ、商品一覧など)のテンプレートしか用意していません。

テンプレートに影響されないページを作成するために、フリーページという場所が用意されています(「フリーページ設定」ボタン)。テンプレート(雛形)もない、まっさらなページです。
独自タグ」も(ほぼ)使えません

HTML、CSS(スタイルシート) 、JavaScriptを使い、ショップ独自のページを作成することができます(量産する必要のないページ、たとえば、店舗情報ページなど)。

だとしたらトップページも、ショップにひとつあれば十分なので、「テンプレートではなく、フリーページで作れるのでは」と思われた方もいらっしゃるかもしれません(そして、まさにそのとおりです)。


ただ、そうしないのは、
・フリーページでは「独自タグ」が使用できない
・たとえば、http://www.hogehoge.com/をアドレス入力すると「種類」-トップ(テンプレート)を自動的に表示する
・ショップの顔でもあるトップページのURLがhttp://www.hogehoge.com/?mode=f1ではおさまりがよくない(フリーページのURLはこんなかんじです)

フリーページは、一年目は10ページで、翌年以降増量されます。
4年目以降は100ページまで作成可能。これくらいあれば十分でしょう。

2010年5月11日

カラーミーのデザイン設定 2

前回の「カラーミーのデザイン設定 1」からのつづき。

デザイン設定ページの「デザイン設定」ボタンをクリックすると、テンプレートを編集するページに移動します。
修正の場合は、現在使用中のテンプレートをコピーし、コピーした先を修正しましょう。
プレビューし、思い通りに変更ができれいれば、使用テンプレートを切り替えて移行完了です。


・「初級モード」配色を変えられる。HTMLタグ不要
・「上級モード」HTMLタグ、CSS(スタイルシート)必須

写真をみているだけでも、いじれそうなところが多いように思います。
「種類」は非常に重要です。テンプレートのイメージができていないと理解が進みませんし、「独自タグ」も理解しにくいでしょう。テンプレートガイドを参考にイメージしてください。

こんな疑問ありませんでしたか?
「ネットショップにテンプレート(またはテンプレートエンジン)ってどうして必要なんだろう」
HTMLだけでサイトデザインは可能ですもんね。 
サイトの外観をHTMLタグの知識なしにいじれることもひとつですが、これだけでは理解不十分です(むしろこちらはオマケ)。

ブログをお使いの方は、テンプレートで日記ページを量産していることをご存知かもしれません。商品ページも同様です。
テンプレート(雛形)を一個作って、手間すくなく、ページを量産するためです。

実際にいじってみることが理解への近道です。
くれぐれも、現在使用中のテンプレートでためしたりしませんように(ページを 行ったり来たりしているうちに、現在使用中のテンプレートをいじっていたなんてことが、結構あるんですよ)。


カラーミーのデザイン設定 3」へつづく。

2010年5月10日

カラーミーのデザイン設定 1

カラーミーショップ!プロ、サイトデザインの第一歩目です。
何度もお世話になる「デザイン設定」ページ(メニュー「お店をつくる」>「デザインを設定する」)。

テンプレートは5つまで保存可能で、最初は「新規追加」ボタンからオフィシャルテンプレートを追加するといいでしょう。

デザインするにしろ、カスタマイズするにしろ、ベースの部分は流用するほうが効率的です。



秀逸なのはプレビュー機能です(「Preview」ボタン)。
運営中のショップページのデザインに影響させることなく、テンプレートを手直しすることが可能です。
「Preview」ボタンをクリックすれば、イメージどおり作成できたか確認できます。
JavaScriptが一部動かない、ページ遷移中にプレビューから抜けてしまう、などありますが、非常に便利です。

デザイン(配色や配置など)は影響しませんが、たとえば、ショップバナーの画像をいま使っている画像に上書きした場合は、当然ながら、運営中ショップに影響が出ます。
もうひとつは、メニュー「お店をつくる」で設定した各入力項目も共通で使用していますので、運営中ショップの表記に影響がでます。

上記二点、注意が必要です。


カラーミーのデザイン設定 2」へつづく

2010年5月9日

カラメルとGMOとくとくポイント共通ヘッダー

2009年9月にカラメル出店しているショップに対して、Webサイト上部に「GMOとくとくポイント共通ヘッダー」が強制的に表示されるようになりました。

Color Me Shop! pro - 助け合い掲示板」をみていると、なかなか不評です(販売手数料のことも絡むので複雑な思いもあるかもしれません)。
当然ながら、サイトデザイン的にも大問題です。いくつか問題点をあげてみました。

・マイアカウントへのログインとまぎらわしい
はじめてショッピングカートを使用するお客様もいる、と想定するならば、アカウントへのログインがふたつあるのは非常にわかりにくい。
お客様は「GMOとくとく ID」に登録しないと購入できないように思われる(実際よく訊かれている)。

・サイトデザインの不自由さ
CSS(スタイルシート)で「display:none !important」を指定しても消せない。
ショップの表示よりも読込時間がかかることもあった。
iPhoneで表示させたとき、メニューがガタガタになった(ヘッダーを消したら直った)。

表示・非表示を選べればと思いますが、「助け合い掲示板」に出ていたペパボの返答を読んだかんじだと、今後もその予定はない、という印象でした。

カラメル出店登録、それ自体は無料ですし、自由に選択が可能です。
カラメル出店のメリット・デメリットはすでに記事として書きましたので、以下の関連記事も参考にしてみてください。


【関連記事】
カラメルと販売手数料 1
カラメルと販売手数料 2
カラーミーにできること、できないこと

2010年5月8日

カラメルと販売手数料について 2

カラメルと販売手数料について 1」からの引き続きで、カラメルの販売手数料についてです。
カラメルは出店自体には手数料無料ですが、そのかわりに販売手数料が発生します。
前回書いた条件以外にも発生する場合があります。
「GMOとくとくID」でログインしたユーザーによる商品の購入。(販売手数料:1.5%)
興味のある方は、カラーミー公式の「販売手数料の課金対象について」をご覧下さい。

「GMOとくとくID」でログインし購入したお客様に、商品価格の1.5%のポイントが付与されます。ショッピングモールを宣伝力のあるものにするために、モール独自のポイントを付加することはよくあることです。
ポイントはショップが負担しますので、宣伝広告費として、どう判断するかだと思います。
費用のことばかり書いてきましたが、出店特典もあります。
カード決済を導入するなら、写真真ん中の「とくとくペイメント」が手数料の面でお得です。

2010年5月7日

カラメルと販売手数料について 1

カラメルとは、カラーミーショップ!プロでショップ運営されているお店の集まったショッピングモールです。
GMO(ペパボの親会社)ではショッピングポータルと呼んでいます。

参加しているショップの全商品をリンクすることにより、ショッピングモール「カラメル」を形成しています。
商品ページへの被リンクはSEO的にも有効だといわれており、また、カラメルからの集客もまずまずあります。

そのかわり、販売手数料がかかってきます。
カラメルを一度訪れた後30日以内にショップに訪れて購入した受注の場合、表示されます。(販売手数料:3.5%)
常連のお客様であっても、がんがん販売手数料がとられ、理不尽と感じる方も多いようです。
アフィリエイター(この場合はカラメル)とASP(アフィリエイト・サービス・プロバイダー)が一体で運営されていることにより、成果確認に対する疑念が湧くことが想像できます。

そのことについて、カラーミーユーザーが問い合わせた返答が、「Color Me Shop! pro - 助け合い掲示板」に掲載されていました。
エンドユーザー様が、『カラメル』へアクセスをすると、カラメルのCookieが発行されます。
そのため、カラメル経由からの誘導でなくても、カラメルのCookieを保有しているエンドユーザー様は、販売手数料の対象となります。

最初に引用した部分とあわせると、
カラメルにアクセスすると、Cookieを30日間保有し、その期間内に購入した商品は全部、販売手数料の対象になる
ということのようです。
常連のお客様が販売手数料の対象にされるのは、そういう理由ですね。
カラメル経由からの誘導でなくても」という点は、ショップ運営者にとって悩ましいところです。

参考までに、市場規模の大きくない特定のお客様向けに商品を販売しているオーナーさんに訊いたところ、売上金額の20~30%くらいが販売手数料対象だったとのこと。取り扱い商品にもよると思いますが、参考までに。
月間売上100万円に対して、7,000~10,500円の手数料が発生した計算です。


カラメルと販売手数料について 2」へつづく。

2010年5月6日

カラーミーの決済ページ

カラーミーショップ!プロはデザイン&カスタマイズが比較的容易に行えます。
しかし、SSL(Secure Socket Layer)を使用したページは、ページデザインがほとんどできません(配色、背景画像を変えられるくらい)。

写真は決済ページの一部です。

写真中段に、マイアカウントにログインする場所があります。
ログインすると、すでに登録されているお客様情報が表示されます。
ネットショッピングに慣れていないお客様は、ショッピングカートの利用が苦手なことが多いようです。使い方を丁寧に図解したページを作成したほうがよいと感じます。
私も「わかりにくいなぁ」としばしば感じることがあります。


【関連記事】
SSLページにおける背景画像の表示

2010年5月5日

SSLページにおける背景画像の表示

カラーミーショップ!プロはデザイン&カスタマイズが比較的容易に行えます。
しかし、SSL(Secure Socket Layer)を使用したページのデザインは、配色や背景画像を変えられるくらいです。
「決済」「お問合せ」 「マイアカウント・会員ログイン」「友達に教える」「メルマガ登録・解除」の各ページがSSL対応です(ブラウザで鍵マークが表示される)。
 
CSSでbackground-imageを追加し、SSLページの背景画像を読み込むと、「セキュリティ情報」ダイアログが表示されて「はい」または「いいえ」を選択しないと先に進めないということが起こります。



SSLページの背景画像はSSL対応サーバー上に置かなければいけません。

カラーミーで行こう」 に記事が出ていました。なるほど、勉強になります。
普段使うことの多い、レンタルサーバー「ヘテムル」をサンプルにします(SSL対応サーバー)。
レンタルサーバー「heteml」 - 独自 SSL 設定マニュアルを読むだけでOK。設定は不要でした。
SSL用のURLにするだけなんですね(よくわかっていなかった)。

あとは表示させたいページのclassやidを調べ CSSを追加すれば、「セキュリティ情報」ダイアログが表示されることなく、背景がつけられます(以下はヘテムル使用時のサンプルURLです)。
×SSL非対応 background-image:url(http://hoge.heteml.jp/bg.jpg);
○SSL対応     background-image:url(https://ssl*.heteml.jp/hoge/bg.jpg);

カラーミー標準のファイル置き場( お店をつくる>画像ファイルを管理する)の場合は、URLをhttpsにするだけ。
https://img01.shop-pro.jp/PA01234/001/etc/hogehoge.jpg
背景画像と配色が変更できれば、デザイン的には必要十分と思います。
皆様、ぜひお試しください。


【参考】
カラーミーで行こう(興味深い記事多数、要チェック)

2010年5月4日

カラーミーのマイアカウントページ

ネットショップには不可欠なマイアカウント機能について、お客様からみた場合の話。
カラーミーショップ!プロを使用してすぐに感じたことは、「マイアカウント」ページのしっくりこなさ、です。

カラーミーショップ!プロのマイアカウント機能は、必要最小限です。
マイアカウントにログインして行えることは、お客様情報の更新と、過去の注文履歴を見ることの二点です。

ちなみにマイアカウントは、SSL(Secure Socket Layer) を使用したページになっておりますので、ページデザインはほとんどできません(配色、背景画像を変えられるくらい)。
大手ネット通販サイトではおなじみの「ほしい物リスト」や、同じものを再度購入する際の「お気に入りリスト」などはついていません。

登録情報は、メニュー「商品を売る」>「顧客を管理する」>「顧客表示項目設定」で選択可能。
フリー項目が3つありますので、ショップによって必要な項目が追加できます。
オンラインマニュアル/顧客表示項目設定


【関連記事】
SSLページにおける背景画像の表示

2010年5月2日

カラーミーでショップ運営をはじめよう

ネットショップ運営にかかせないショッピングカート・システムにはいくつかあります。
代表的なひとつに、株式会社paperboy&co.(略称:ペパボ)の「カラーミーショップ!プロ」があります。
柔軟なカスタマイズ性と費用が安い点が大きな特徴です。

それでは、カラーミーを導入するに当たって、
・ショップを作成のにどのくらい手間がかかるの?
・どのくらい難しいの?
など、踏み込んだ部分が気になるところ。

そのようなところは、無料お試し期間のあいだに、「ショップ開店への道(基本編)」を読み、練習すると良いです。
オンラインマニュアルも充実していますので、初心者の方も根気よく読みこなせばなんとかなるかと思います。

2010年5月現在、30個のテンプレート(たまに追加されます)が用意されています。
写真はそのうちの一部です。

ショップ関連の情報(事務周りもろもろ)、販売商品の登録などを行えば、すぐに運営開始できます。
ただ、既存のテンプレートはあらゆるお店を対象とした、オーソドックスなタイプなので、使っているうちに、自分のショップ用にカスタマイズしたくなります。
Webサイト制作の知識があるかどうかで、デザイン&カスタマイズの第一歩目は変わってきます。

・初級(HTMLの知識なし)
用意されているテンプレート(画像・ボタン・配色などの雛形)から、好きなデザインを選択してショップデザインを行います。
カラーミーのデザイン変更には、初級モード、上級モードとあり、初級モードはHTMLを知らなくても、配色(文字色、背景色)を変えることができます。
先に進むためには、HTML(Webページを記述するためのマークアップ言語)の学習が不可欠です。上級モードを使用すれ ば、まったく別のページに作り変えることができます。

・中級(HTMLの知識あり)
上級モードの使用には、CSS(スタイルシート)の知識が必要です。
わずかでもWebサイト制作経験があれば、なんとなくいじれます。

・上級(JavaScriptの知識が少しある)
サンプルをコピペしたことがあるくらいで十分ですが、JavaScriptをすこし知っているなら、実践で勉強しながら十分なんとかなります。
このブログも回を重ねていったころには、Ajax(Asynchronous JavaScript + XML)を使ったり、jquery(JavaScript汎用ライブラリ)を勉強していきます。
また、カラーミーはSmartyとよばれるテンプレートエンジンを使用しています。ここらをいじらなければ、カスタマイズの幅は広がりません。


【追記】
カラーミーでショップ運営をはじめよう(2011年3月版)」を新たな記事として更新しました。

2010年5月1日

カラーミー解説サイトをはじめます

カラーミーショップ!プロ(Color Me Shop! Pro)をいじること一年。
クライアント様から無理難題(!?)を吹っかけられたおかげで、カラーミーの仕様はもちろんのこと、思いも寄らぬアイデアから便利機能まで、他に類を見ない(かもしれない)作成経験を獲得する機会を得ました。

記憶力の悪い脳内に保管するだけではもったいないので、備忘録代わりにブログを立ち上げました。

腕に自信がある方は(もちろん私はその結果に責任を取れませんが)ばりばり流用してください。
ちょこっと口コミで宣伝してくださるとうれしいです。

本業の合間に作っているサイトではありますが、私がすでに知っていること、検討したことをご提供できればと考えています。
このページがお役に立てましたら、リンク(アフィリエイト)を踏んでいただけるとありがたいです。