1月 2011 のブログ記事

CodeIgniterが2011年1月28日付で2.0にバージョンアップされました。

ちょうど今日スタートの案件で、CodeIgniterを使おうと思って、
ダウンロードしにいったら2.0になっててびっくり。
 
社内で Perl→Template::Toolkit PHP→Smarty という刷り込みを行ってきたので、
オープンソースのFWを採用してもSmartyを使いたい。
ということで、こちらのような方策をとったのですが、
果たして、2.0ではどうでしょう?
 
とりあえず、前回の記事のように処理したら、
コンパイル済みテンプレートファイルの格納ディレクトリがないと警告。
 
CIの1.x系では、システムディレクトリの中にアプリケーションディレクトリがあるという構造でしたが、2.xからこれらが分離して、すこしディレクトリ構造が変わったのが原因でした。
 
前回の記事からのリンク先の説明にある、
config/smarty_parser.phpの

$config['compile_dir'] = BASEPATH.'cache/';

$config['compile_dir'] = APPPATH.'cache/';

にすれば動きました。
 
一安心。
 
CodeIgniteゆるゆるで素晴らしいよ!

最近

  • ショッピングサイト作るのどうしたらいいですか?
  • システムは何を使うのがいいですかね?

というようなご相談を頂きます。

というわけで、ちょっとまとめておきます。

先に断っておきますが、

  • 私はあくまでECに携わっているプログラマで、より運営に近いディレクションをされている方と少し視点が異なるかもしれません。
  • 大規模案件では多くの場合当てはまりません

という点にご注意ください。

また、この記事の内容については、実店舗をもっている事業者がECに展開をするという前提で話を進めます。
そして、運営事業者≠サイト制作者であることを前提とします。

さらに付け加えると、以下は理想論を多分に含んでいます。
一番最後の一文を除いては、
ご自身のビジネスにどう置き換わるのかを考えてご利用ください。


まず、一番最初。
サイト構築云々というところの話の前の段階で、
ちょっとどうかな?って思うことがあるので、その点を。

ECの案件をもらったとき、
一番最初にクライアントに確認していただきたい点が、

  • 週3回以上のメルマガ発行、または、ブログ更新が可能か
  • 店舗運営費用(ホスティングなど)の他に、広告費として最低5万円準備できるか

です。

ECサイトは(というより、WEBサイト全体に言えると思いますが)、
実店舗と相違ありません。

ECサイトを公開したというのは、実世界で言えば、
ひっそりとラーメン屋オープンしたけど、
客寄せもしないし、広告もない、
しかも、旨いか不味いかもわからないので、
お客さんが入ってこない。
 

こんな感じだと思います。

ですので、運営費と販促費という考え方をしていないと、
200%失敗するパターンと言って良いと思います。

ちなみに、広告費については、最低5万円は出していただいて、
できれば、売上の何%まで確保できるのかを確認したほうが良いでしょう。
 


ここから、システムのおはなしをしていきます。

ECサイト構築でパッと思いつくのが、

とか、最近だと、

も候補に上がってくると思います。

また、各種汎用CMSのショップ構築プラグインも候補に上げてよいでしょう

これらのシステム。
一式揃ったシステムとしては非常にできがよく、
プログラマの私としては尊敬しております。
 
ですが、これらのシステム、導入にあたっては、
一考の余地があると思います。


前述のとおりECサイトも実質的には実店舗と変りないです。

したがって、

  • ページの見せ方、言わば店作り
  • 商品管理(実店舗や他のモールとの連携)
  • 受注処理

という、店舗運営の基本である3つ柱を、
運営事業主のスタイルにフィッティングする必要があります。

このあたりの「汎用で基本的な面」については、
前述のシステムに統合されています。

が、あくまで「汎用で基本的」なので、
運営事業主にとって「最適解」であるケースは
どちらかというと少なめと言っていいでしょう。

よって、多くの場合、
なんだかのカスタマイズをした上での運用を行う事になります。

また、カスタマイズをしないと、
売れない
とか
現在の運営形態にフィットしておらず、
人件費がかさんでしまう
などの状況に陥りがちです。


また、実店舗と照らし合わせた場合、
実店舗では、
魅せ方を変える
とか
陳列を変える
などというのは日常茶飯事です。

これをECに置き換えると、
ひとつは、ページのレイアウト変更で、
これは、HTMLの編集などで対応できますが、
もう一つの側面として、見せたい項目の増減
ということも出てくるでしょう。
 
こうなれば、やはりシステムカスタマイズの必要性が出てきます。


このようにシステム面でのカスタマイズは
必然的となってくるケースが多いのです。

それで、カスタマイズをした場合、問題になるのが、
前述のシステムのアップグレードの必要性が出た場合どうするのか
という点です。

制作会社さんの中には、
カスタマイズを外注しているケースもよくあります。
ですので、アップグレードをする場合、
そこでも外注となりますが、
当然お金が発生します。
クライアントに請求するわけにもいかないし、
自社でお金を出せない、
結果、アップグレードできずに、
最悪脆弱性放置などということもあります。

これらから判断するに、
商品管理・陳列・受注の一式が揃ったECサイト構築システムは、
自社内にカスタマイズする力があるのかどうか。
がひとつの鍵になっています。

わたしたち、制作サイドから見て、
恐ろしいことに、制作会社に頼らずに、
ECサイト構築しているショップマスターには、
職業プログラマよりはるかに上の
PHPやPerl、MySQLの知識を持った方々がゴロゴロいます。
それくらい、シビアなものだと思ったほうが良いでしょう。
 
 


 
では、カスタマイズ力がない場合、
どうしたら良いかです。

前述のとおり、
ECサイト運営の基本、実店舗と同様、

  • 商品管理
  • 陳列
  • 受注

です。
 
ここにショッピングカートシステムを加えて、
4本の柱で、それぞれ独立システムを導入するのが良いと思います。
 

■陳列

まず、陳列です。
ここは、WEB制作者にとって最も分かりやすい点でしょう。
いわゆる、お客さんに見せるHTMLの部分です。
ここは、静的HTMLでも良いですし、
汎用CMSなどを利用しても良いと思います。
 
ただひとつ気をつけなければならないのは、
「商品によってページの見せ方は絶対異なる!」ので、
商品ページによって、レイアウトをかえたりできるようにしておくことが必要です。
 

■ショッピングカート

私が、多くの人にオススメしているのが、
規定タグを商品ページに埋め込んで、
カートにPOST送信することでカートが用意できるシステムです。
 
私がよく人におすすめしているのが

です。
 
トントンカートの場合、

<form name="form1" method="post" action="https://tontoncart.com/demo-admin/carts/put" >
<input name="data[CartSets][7c74][product_no]" type="hidden" value="test" />
<input name="data[CartSets][7c74][product_name]" type="hidden" value="テスト" />
<input name="data[CartSets][7c74][base_price]" type="hidden" value="12500" />
<input name="data[CartSets][7c74][cool_shipping_flag]" type="hidden" value="0" />
数量<select name="data[CartSets][7c74][amount]">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
</select><br />
<input name="data[CartSets][7c74][amount_context]" type="hidden" value="0\n1\n2\n3">
<input name="data[CartSets][7c74][regular_shipping_flag]" type="hidden" value="0" />
<input name="data[CartSets][7c74][regular_shipping_term]" type="hidden" value="">
<input name="data[CartSets][7c74][regular_shipping_term_context]" type="hidden" value="">
<input name="data[CartSets][7c74][regular_shipping_times_option]" type="hidden" value="">
<input name="data[CartSets][7c74][regular_shipping_times_context]" type="hidden" value="">
<input name="data[CartSets][7c74][shop_url]" type="hidden" value="" />
<input name="" type="image" src="https://tontoncart.com/demo-admin/img/btn_kago.gif" /><br />
</form>

↑こんなタグを貼り付けます。
タグ沢山ありますが、実は入れるべき値は決まっていますので、
CMSを利用する場合は、
これらをカスタムフィールドとして入力できるようにしておけば良いです。

その他、ASPで提供している場合など、
選択肢の幅が広く、また決済も多くの決済に対応しており、
クライアントにとってはプラスに働くことばかりです。

 

■商品管理

商品管理は、ぶっちゃけると、エクセルでOKです。
タグ貼りつけ型のカートの場合CSVでのインポートなどに対応しており、
掲載アイテム数が数百点程度であれば、
すでにエクセルを使えるショップマスターの方は多く、
想像以上に柔軟な対応ができます。
 
また、実店舗運営を行っている場合や、
楽天など別のサイトを持っている場合は、
すでになんだかのマスターを持っていることも多く、
そこから別のDBに取り込むなどの手間を考えれば、
エクセル上で操作ができたほうが、
結果的に時間短縮になるケースが非常に多いです。
 
 

■受注管理

これは、楽天などとの連携もできる受注システムがリリースされています。
 
その例が

です。
 
これらのシステムは、
ECサイト運営の中から派生したシステムであることが多く、
一般システム会社が開発した受注システムより、
ECサイト運営の視点にたっているものが多く、
また、MS-AccessやFileMakerなどで構築されており、
個別カスタマイズに対応していることもあります。
 
受注管理は、制作会社が一番疎いので無視されがちなのですが、
運営事業者にとっては、
1件の注文において、最初で最後の接客になることが多く、
もっとも重要視しなければならない点です。
(そういった意味でも、前述の受注ソフトの個別カスタマイズが重要)
 
 
 
最近では、比較的用意にDBを構築できるFileMakerを覚えて、
商品管理と受注管理のDBを納入する制作会社さんもいらっしゃいます。
 
 
弊社の場合は、このように全て独立で考え、
それぞれ全てのシステムを自社開発でまかなっています。
 


 
長文になってしまいましたが、ざっとこんなところです。
最初に、
 

運営事業者のお金とメンタル面のチェック

 
をした上で、
 

自社にカスタマイズ能力があるのかないのかをチェック

 
して、導入ツールを考える。(そこで見積もり)
こんなワークフローでやってみてください。
 
 
あと、たまに「売れないのは制作会社の責任じゃない」と言っている制作業者さんがいますが、
そう言った方は、悪いことは言いません。
ECから手を引いた方がいいです。

今から作るアプリケーションでSQLiteを使わなくてはならなくなりました。
 
というわけで、CodeIgniterでSQLiteを使うにはどうしたらよいか。
 
system/application/config/database.phpの接続設定を

$db['default']['hostname'] = "";
$db['default']['username'] = "";
$db['default']['password'] = "";
$db['default']['database'] =  "データベースファイル";
$db['default']['dbdriver'] = "sqlite";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = TRUE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";

ドライバに「sqlite」にして、
dbnameはデータベースファイルへのパスを指定します。
データベースファイルへのパスは相対パスも場合、
index.phpからの相対パスです。
APPPATHとかで、絶対パスを指定したほうがいいかもです。
 


この方法で使えるSQLiteは「SQLite2」ですのでご注意ください。
SQLite3を使いたい場合は、
http://codeigniter.com/wiki/PDO_SQLite3/
こちらを参考に。
配布アプリの場合は権限とか設定とかの問題があるので、
あまりやらないほうがいいかな。。。

CodeIgniterに同梱のSQLite用ドライバは、
バグがあるようです。
http://zidane27.blog119.fc2.com/blog-entry-11.html
このへんを参考に。これ以外情報がないので、バグにぶつかったら自分で直すしかなさそう…。

まぁいろいろアレだけど、SELECTとかINSERTとか基本的なとこは問題なさそう。

案件の事情により、CodeIgniterをCLIからもWEBからも利用しなければならないという問題にぶち当たる。

CodeIgniterでは、
system/libraries/Router.php
で実行するコントローラとメソッドを指定しているので、これを拡張してやれば、行ける気がする。

今回のコマンドは、

index.php "ディレクトリ" "クラス" "実行するメソッド"

と指定することにした。

まず、Router.phpの拡張を作る。
system/application/libraries/MY_Router.php
を作成し、そのなかに以下のようなクラスを作成する。

<?php
if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class EB_Router extends CI_Router{
 
//ここに後述のメソッドを書く。
 
}
?>

「//ここに後述のメソッドを書く。」の部分に後述のメソッドを書きます。


続いて、コマンドライン引数からコントローラーなどを指定するメソッドを拡張します。
system/libraries/Router.php
の「_validate_request」メソッドを、
system/application/libraries/MY_Router.php
へコピーします。

そして、このメソッドの冒頭へ、
CLIでの起動だった場合に、コマンドラインからコントローラーを指定するコードを書きます。
 

function _validate_request($segments){

/**********************************************************/
if( PHP_SAPI == 'cli' )
{

    //ここでコントローラーなどを指定。
    $this->set_directory($_SERVER['argv'][1]);
    $this->set_class($_SERVER['argv'][2]);
    $this->set_method($_SERVER['argv'][3]);

    //カレントディレクトリを変更しておく
    chdir( FCPATH );

    return array();
}
/**********************************************************/

// Does the requested controller exist in the root folder?
if (file_exists(APPPATH.'controllers/'.$segments[0].EXT))
{
    return $segments;
}

// Is the controller in a sub-folder?
if(is_dir(APPPATH.'controllers/'.$segments[0]))
{ 

    // Set the directory and remove it from the segment array
    $this->set_directory($segments[0]);
    $segments = array_slice($segments, 1);

    if (count($segments) > 0)
    {
        // Does the requested controller exist in the sub-folder?
        if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$segments[0].EXT))
        {
            show_404($this->fetch_directory().$segments[0]);
        }
    }
    else
    {
        $this->set_class($this->default_controller);
        $this->set_method('index');

        // Does the default controller exist in the sub-folder?
        if ( ! file_exists(APPPATH.'controllers/'.$this->fetch_directory().$this->default_controller.EXT))
        {
            $this->directory = '';
            return array();
        }
    }
    return $segments;
}

// Can't find the requested controller...
show_404($segments[0]);
}

/**********************************************************/
で囲まれた部分が追加した部分です。

これで、コマンドからコントローラーやメソッドを指定できます。

定義済み定数の「PHP_SAPI」に「cli」が指定されたとき以外は、
通常のルーティングが行われるので、
CLIとWEBでハイブリッドな使い方ができそうです。


注意点としては、
上記のコードは、コマンドから渡された、
ディレクトリやらコントローラーやらメソッドが、
確実に存在するという前提で書いています。
実際に使う場合は、このへんのエラートラップもしておいたほうがいいでしょう。

拡張のヒントとしては、上記のコードでは、第4引数以降はと特になにもしていないですが、
ここも拾って、実行メソッドの引数として渡せると楽しいかもです。

何かの参考になればー。

皆様 新年明けましておめでとうございます。

2011年が始まりました。本年もよろしくお願い致します。


この春、わたくし伊藤清徳は、
現職で勤務しております有限会社キープランを離職し、
春芳堂という屋号にて、独立。新たなスタートをする予定でおります。

主たる業務としては、
・Perl PHP SQLite MySQLを利用したWEB開発
・FileMakerを利用したDB開発
・ECサイト構築
・Javascriptなどを利用したiOSアプリケーションの開発
を行っていくつもりでおります。

また、Seezoo CMS と a-blog cms の拡張(主にEC分野)にも
積極的に関わっていこうと考えております。


 
まだ30歳と、若輩者ではありますが、皆様のご協力を仰ぎながら、
少しずつ進歩していこうと思っております。
 
改めまして、皆様、本年もよろしくお願い申し上げます。


PostScript
なお、昨年に引き続きまして、aikoさん風 または 多部未華子さん風のお嫁さん候補をお待ちしておりますw