2011年7月28日

Codeigniterを使ってショッピングカートをゼロから作ってみよう。 # 3

テンプレート化の下地ができたので、調子に乗ってそのままバックエンドの分離に着手します。
テンプレート化はこちら


■フロントエンドとバックエンド(管理画面)の分離


一般的にフロントエンドとバックエンドはデザインが異なることが多いですし、機能的にも違ったものになります。そう考えると分離させるのはそれほど悪い考えでもないでしょう(であって欲しいw)

/admin/index.php./index.php をほぼコピーした感じです。

/admin/index.php
<?php
define('EXT', '.php');
define('FCPATH', __FILE__);
$pathinfo = pathinfo(FCPATH);
define('SELF', $pathinfo['basename']);
define('ROOT',realpath($pathinfo['dirname'].'/../').'/');
unset($pathinfo);

define('SYSPATH', ROOT.'system/');
define('EXTPATH', ROOT.'extension/');
define('APPPATH', ROOT.'admin/application/');

$f=pathinfo(__FILE__, PATHINFO_BASENAME);
if (!is_dir(SYSPATH))  exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);
if (!is_dir(APPPATH))   exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);
if (!is_dir(EXTPATH)) exit("Your extension folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);

define('ENVIRONMENT', 'development');

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'development':
            error_reporting(E_ALL);
        break;
    
        case 'testing':
        case 'production':
            error_reporting(0);
        break;

        default:
            exit('The application environment is not set correctly.');
    }
}

require(SYSPATH.'core/Bootstrap'.EXT);


ここで問題になってしまったのがLayoutライブラリです。
./index.phpTEMPATHを設定していたため$this->layout->view()が全てTEMPATHに向いてしまっていました。

そこで両方のindex.phpにADMIN定数を設定し、ADMIN=TRUEの場合にはTEMPATHに向かないように/extension/core/Layout.phpを変更しました。
(毎回コントローラで$this->layout->set('admin');とやるのは無駄ですからね…)

./indexphp
define('ENVIRONMENT', 'development')直前

define('ADMIN', FALSE);

/admin/indexphp
define('ENVIRONMENT', 'development')直前

define('ADMIN', TRUE);

/extension/core/Layout.php
18行目

if(! ADMIN) $load->set_view_path(TEMPATH.$template.'/');


■ コントローラの設定
admin/application/controllers/home.php
<?php
class Home extends Controller
{
    function index()
    {
        $this->layout->view('home');
    }
}


■ ビューの設定
admin/application/views/home.php
this is admin directory - <?php echo __FILE__; ?>


■ レイアウトの設定
admin/application/views/_layout/main.php
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Admin Template</title>
</head>
<body>

<?php echo $contents; ?>

<p><br />Page rendered in {elapsed_time} seconds</p>

</body>
</html>


■ てすと
http://localhost/lsc/admin/ にアクセスしてみます。


ちゃんとアクセスできてます。大丈夫そうです。
無事に分けられたところで、次はアクセス制御かな?

2011年7月25日

Codeigniterを使ってショッピングカートをゼロから作ってみよう。 # 2

さてインストールが終わったので目的に合わせて色々と変更していきます。
#1 インストールはこちらからどうぞ。



■ テンプレート化
デザインを拡張したり、変更したりできる機能は人に使ってもらうことを考えると外せないですよね。
もちろん、簡単に拡張できれば使ってくれる人も多くなるでしょうし。


そこで初期設定では application/views に設定されているview用のディレクトリを templates ディレクトリに移します。HTML/CSSなどのデザイン部分は1つにまとめられて楽になるんじゃないかな。(ダメそうなら後で変更しますw)



後で変更できるようにindex.phpTEMPATHを追加。

define('TEMPATH', ROOT.'templates/');


■ Layoutライブラリ
当然templatesディレクトリに移しただけでは使えないので、ライブラリを1つ追加します。

extension/core/Layout.php
<?php
class Layout 
{
    var $layout;
    
    function __construct()
    {
        $this->layout = config_item('layout_default_file');
        log_message('debug', 'Layout Class Initialized');
    }
    
    function set($layout) { $this->layout = $layout; }
    
    function view($view = '' , $data = array(), $template = 'default', $return = FALSE)
    {
        $load =& load_class('Loader','core');
        // set template path as view path if not admin
        if($template !== 'admin') $load->set_view_path(TEMPATH.$template.'/');
        // load contetns in side of the layout
        $view_data['contents'] = $load->view($view, $data, TRUE);
        // load layout directory config
        $this->layout = config_item('layout_directory').$this->layout;

        // then finaly load layout
        return $load->view($this->layout, $view_data, $return);
    }
}


ライブラリ内で使われている設定をconfig/config.phpに2つ追加。
$config['layout_default_file']  = 'main';
$config['layout_directory']     = '_layouts/';
1つ目はLayoutライブラリがロードされた時にレイアウトファイルが指定されなかった場合に自動的に読み込まれるファイル名を指定します。
2つ目はディレクトリを分けたい際に指定できます。空欄も可。


■ Loaderクラス拡張
ビューファイルのパスを指定するのにLoaderクラスを拡張します。

extension/core/MY_Loader.php
<?php
class MY_Loader extends Loader
{
    /**
     * set view file path
     *
     * This function sets the location of view file.
     *
     * @access    public
     */
    public function set_view_path($path, $absolute=FALSE)
    {
        $this->_ci_view_path = ($absolute) ? ROOT.$path : $path;
    }
}
これで_ci_view_pathはtemplatesディレクトリに向きます。


■ Layoutライブラリ読み込み
最後にライブラリを読み込みます。
普通にconfig/autoload.phpに追加でもいいんですが、Layoutライブラリは常に使うことになるし、1行だけなのでsystem/core/Controller.phpに書き込んじゃいました。

$this->layout =& load_class('Layout', 'core');

Codeigniterのアップデートの時に面倒とか、わからない人はconfig/autoload.phpに追加してくださいね。

$autoload['libraries'] = array('Layout');



■ てすと

コントローラ:application/controllers/home.php
<?php
class Home extends Controller
{
    function __construct()
    {
        parent::__construct();
    }
    
    function index()
    {
        $this->layout->view('home/index');
    }
}

ビュー:templates/default/home/index.php
<?php echo __FILE__; ?>


結果:


大丈夫そうです(^_^v
これでテンプレート化の下地ができまた。

2011年7月24日

Codeigniterを使ってショッピングカートをゼロから作ってみよう。 # 1

■ 環境設定&インストール

本来なら開発は本番環境と同じ状態でやるのが一番良いのですが、ネットがない環境でも作業ができるようにローカルに開発環境をセットアップします。

まずWampをダウンロードしてDドライブにインストール。インストールする場所はご自由に。
www.wampserver.com

D:\wamp\www
がlocalhost(以下、ローカル)になります。


次にCodeigniterをダウンロード。
www.codeigniter.com/downloads

ダウンロードしたファイルを解凍してローカル配下に設置。
同梱されているuser_guideは開発自体には必要ないので別の場所に保管します。

開発ディレクトリ:
D:\wamp\www\lsc

マニュアルディレクトリ:
D:\wamp\www\manual\ci


とりあえずは、これで環境設定とインストールできました。


■ 微調整

初期設定でCodeigniterはsystemとapplicationの2つのディレクトリに別れてます。
これを少しだけ以下のように変更しました。


変更の理由は後日記載します。

それに伴い、index.phpも多少変更。

<?php
/*
 *  Constants: Core Application Constants
 *  EXT - The file extension.  Typically ".php"
 *  FCPATH - The full server path to THIS file
 *  SELF - The name of THIS file (typically "index.php")
 *  ROOT - ROOT direcotry
 *  SYSPATH - The full server path to the "system" folder
 *  APPPATH         - The full server path to the "application" folder
 *  EXTPATH- The full server path to the "extension" folder
 */

define('EXT', '.php');
define('FCPATH', __FILE__);
$pathinfo = pathinfo(FCPATH);
define('SELF', $pathinfo['basename']);
define('ROOT',realpath($pathinfo['dirname'].'/').'/');
unset($pathinfo);
define('SYSPATH', ROOT.'system/');
define('EXTPATH', ROOT.'extension/');
define('APPPATH', ROOT.'application/');

$f=pathinfo(__FILE__, PATHINFO_BASENAME);
if (!is_dir(SYSPATH)) exit("Your system folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);
if (!is_dir(APPPATH)) exit("Your application folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);
if (!is_dir(EXTPATH)) exit("Your extension folder path does not appear to be set correctly. Please open the following file and correct this: ".$f);

define('ENVIRONMENT', 'development');

if (defined('ENVIRONMENT'))
{
    switch (ENVIRONMENT)
    {
        case 'development':
            error_reporting(E_ALL);
        break;
   
        case 'testing':
        case 'production':
            error_reporting(0);
        break;

        default:
            exit('The application environment is not set correctly.');
    }
}

require(SYSPATH.'core/Bootstrap'.EXT);


よく見たらほとんど全部変えてた(笑)
わからない人は触らないほうがいいかもしれませんねー。


変更がちゃんと動いてるかhttp://localhost/lsc/にアクセスして確認。




大丈夫そう。
それじゃあ次回からガリガリ開発です!

2011年7月22日

Codeigniterを使ってショッピングカートをゼロから作ってみよう。 # 0

仕事柄毎日コード書いてるけど、色々と思うこともあるので日記風に書き残しておこうかと思います。

とは言えだ、ただの日記じゃ芸がないし自分が飽きそうなので企画っぽくしようかと。
Google先生に聞いてみたけど見当たらなかったのと慣れていることもあるので企画内容決定。


Codeigniterを使ってショッピングカートをゼロから作ってみよう。


それじゃ企画の概要。
- CodeigniterとjQueryをメインにiscなみのショッピングカートを作る。
- 原則としてコードは恥も外聞もなく公開。まぁでも徹底入門よりはマシだと思います、はいw
- 既に企画内容が途方もなく大きいので、いつ終わるかは不明。
- 途中で投げ出すこともあるでしょう。・・・っつーか、投げ出す気満々なんであまり期待しないでください(苦)
- 投げ出さずにできたら商用化。(あくまでも予定)

以下、仕様。
コア部分:
- カート機能
- ユーザ機能
- 管理ページ
- 製品管理系

準コア部分:
- 決済系(Paypalとか色々)
- 税金系
- 配送系
- 在庫管理系
- 返品受付機能

デザイン部分:
- テンプレート(スキン)機能

余力があれば:
- B2B機能
- SEO系
- プロモーション機能
- API


6ヶ月~1年くらいあればある程度まともなのできるかな?
機能はこのブログを読んでくれる人がいて、要望出してくれたりアドバイスくれたりしたら追加されるかもしれません。

投げ出す気は満々ですが、投げ出さないように励ましつつ見守ってくれれば幸いです。

んじゃ、始めますか。