| 1 |

09/29@07:23 - Ethna #8 (AppObject)

Category: General
Posted by: psycho
誤ってリロードして書いた奴、全部消えた・・・
メモ帳とかでバックアップしてない時に限ってコレだ

ところで、EthnaではSQLを撃たなくても
データベースを操作する方法が用意されている
それがAppObject(アプリケーションオブジェクトだ)

さて、実際にやってみよう

コンソールで
ethna add-app-object テーブル名
と打ちEnter

そしてapp内にできる
プロジェクト名-テーブル名.php野中を(野中広務は売国奴)みてみよう

extends Ethna_AppObjectの下に

   var $table_def = array(
    'テーブル名' => array('primary' => true,),);
   );

    var $prop_def = array(
    'フィールド名' => array('primary' => true'key' => false'form_name' => 'フォーム名''type' => VAR_TYPE_INT,),
   );


と入れる

table_defのprimaryはそのテーブルに主キーがあるなら
trueにしよう

prop_defの中の配列の設定値は
primary 主キーがあるならtrue
key 主キーか唯一キーがあるならtrue
seq オートインクリメントならtrue
form_name フィールド名がウェブから送信されたものに対応するフォーム名
type 正直今のところ、どうでもいいようだ

このファイルをコントローラ側でインクルードして
使う側のactionまたはviewで
$Obj = & new AppObject作成で指定した名前($this->backend);
とすれば後は好き放題だ
$Obj->set("フィールド名", "テスト");
$Obj->add
してINSET INTOするもよし
$Obj->update
して更新するもよし
$Obj->remove
して削除するもいい

searchpropその他でデータを引きずり出せる

詳細は次回
Category: General
Posted by: psycho
ここまでは某所に書いてきたのを
そのままもってきたのでリターンズとしてたが
ここからはここだけで新たに行かせてもらう

前回は掲示板作成のところまでこぎつけた
さて、ここで喜んではいられない
次のステップへと行こうじゃないか

それはDAO化だ
さっきのソースコードを見た限り
やはりフレームワークを使っているので
結構シンプルに出来ていると思われる、がだ
データベースアクセス処理に関してだが
ここは後で無駄が起きてしまう
なぜ?処理は2つしかないのに?

いやいや、ここからが大変なんだ
これがショッピングカートやSNSとか作る際に
こんなコードを一杯書いていったら・・・
当然だけど、冗長化していき
同じコードを何度も書いてしまうはめになる
そこでDAO化なんだ
DAOとはData Access Objectの略で
そのままデータにアクセスするための部品
これを書くことで少しはコードの削減に
一役買ってくれる事だろう

DAO化はそれぞれ手順を踏むだろうが
私はこう書いてみた

まずappディレクトリにBBSのIO処理のためのDAOを作成する
名前はbbs.io.dao.php
oh! なんてセンスのないファイル名なんだろう!!!

サンプルソース↓

因みにPEAR DBに直接アクセスしている
これをコントローラの上部にincludeすれば
使えるようになる
include_once('bbs.io.dao.php');
こうね

ところて、mb_converというのが目に入ったか?
これはmb_convert_encodingが配列に対応
してないっぽいので、独自に配列に対応
させたのを組んでみた
エラーが出てしまうのがアレだが・・・
ソース↓


もうちょっと吟味する必要があるな・・・
さて、ここまで出来たら後はこうするだけだ

ViewのIndex.phpのデータ読み込み処理

$bbs = new bbs_io;//BBSデータ読み込みオブジェクトの生成
$read = $bbs->bbs_read(); //読み込むだけ

array_pop($read); //ケツについてしまった要らんデータを消す・・・
$this->af->setApp("bbs", $read);//出力

ここここ・・・・・これだけ・・・・
DAOの威力恐るべし

続いて書き込みactionのIndexの処理

$name = $this->af->get('nm');
$mail = $this->af->get('mail');
$body = $this->af->get('bd');
//書き込み用に配列を作る
$write = array($name,$mail,$body);
//BBS入出力DAOオブジェクトの生成
$bbs = new bbs_io;
//入力チェック
if($this->af->validate() == 0){
$bbs->bbs_add($write);//書き込み
}
return 'index';

はいしゅーりょー

DAOって凄いね
Category: General
Posted by: psycho
オーチンハラショー!!!
順調だ

前回はデータベースアクセスの方法について記述した
さてここからは、公約通り掲示板の作成作業に
当っていく

コントローラからの記述の説明とか
前に書いてあるので想像に任せるとして
ここからは、いきなりコアな部分から行くとしよう

流石に、これまで使ってきたSampleプロジェクトの
Loginを流用するにはごちゃごちゃしてて
限界があるので掲示板用に新たにプロジェクトを
作成する事にする



まずデータベースを生成する
DB名はbbs
そこにbbsテーブルを作る
name mail共にvarchar 255
datetimeはtimestamp
commentはtext

EthnaコマンドでBBSプロジェクトを作る
Ethna add-project BBS /ドキュメントルート
ディレクトリ作るか?y

appのviewにIndex.phpを作る(最初からあると思うけど)

$form内に

'mail' => array('name' => 'メール', 'required' => false, 'type' => VAR_TYPE_TEXT,),
'nm' => array('name' => '名前', 'required' => false, 'type' => VAR_TYPE_TEXT,),
'bd' => array('name' => 'コメント', 'required' => true, 'type' => VAR_TYPE_TEXT,),

そしてfunction preforwardの中に
$db = & $this->backend->getDB();
$sql = "select * from `bbs`";
$result = & $db->query($sql);
$i = 0;
while($temp = $result->fetchRow(DB_FETCHMODE_ASSOC)){
$fd[$i][name] = mb_convert_encoding($temp[name], "euc", "auto");
$fd[$i][mail] = mb_convert_encoding($temp[mail], "euc", "auto");
$fd[$i][datetime] = mb_convert_encoding($temp[datetime], "euc", "auto");
$fd[$i][comment] = mb_convert_encoding($temp[comment], "euc", "auto");
$i++;
}

etcのiniの$configの中に
'dsn' => "mysql://ユーザ名:パスワード@localhost/bbs",

templateのjaにbbs.tplを作って
{foreach from=$app.bbs item=data}
名前:{if $data.mail}{/if}{$data.name}{if $data.mail}{/if} 書き込み時刻{$data.datetime}

{$data.comment|nl2br}


{/foreach}

<form action={$script} method=POST>
<input type=hidden name=action value=bbs>
名前:<:input type=text name=nm>
メール:<input type=text name=mail value={$form.mail}><br>
コメント<br>
<textarea cols=70 rows=10 name=bd>
</textarea><br>
<input type=submit value=書き込み name=bbs>

BBS_Controllderの$forwardの中に
'index' => array('forward_path' => 'bbs.tpl',),

これで表示はできるようになった
Smartyの説明は書かない

class_nameとview_nameは別に要らない模様

さて書き込み処理だ

appのactionの中に
//DB書き込み処理
$db = & $this->backend->getDB();
$name = mb_convert_encoding($this->af->get('nm'), "UTF-8", "EUC-JP,SJIS");
$mail = $this->af->get('mail');
$body = mb_convert_encoding($this->af->get('bd'), "UTF-8", "EUC-JP,SJIS");
if($body||$name){
$result = & $db->query("INSERT INTO bbs VALUES('$name','$mail',NOW(),'$body')");
}
return 'index';

データベースがUTF-8
表示がEUC-JPである事を想定している
私の環境がそうなので

名前が統一されてなかったり
おかしな部分もあるかもしれないけど
多めに見てくれ

さて、このままではDBにアクセスするのに
無駄があると思われるので
次はDAO化に挑戦するとしよう
Category: General
Posted by: psycho
一気に第五版まで来てしまった

Ethnaを使うための環境構築
Ethnaの初歩の初歩
Ethnaで作るHello World
Ethnaでの入力処理

と今まできてきた
んで遂に5版な訳だが
ここから先は掲示板の作り方を紹介する
IO処理にはファイルではなく
データベースを使わせてもらう
折角のPHPなのにDBを使わない方法は勿体無い
なのでfopenなんてのは使わない

と、、、その前に復讐と行こうではないか
おっと復讐ではない復習だ
わかっててやってると思っても突っ込むな

前からも述べたがSmartyについての
説明は省く、何故か?
面倒だからだ

appディレクトリにコントローラファイルがある
そこに記述する内容として
--------------------------
表示を司るforward
view_name = 表示する時に使うViewクラス
forward_path = 使うテンプレ
/?に連動するアクションクラス
class_name = 使うアクションクラス
-------------------------
因みにこれらは省略できる模様
ただforward_pathは必要か

*これらは全てappのapp_id_Controllerに記述する
MVCのCの部分

出力はSmary奴隷
$this->af->setApp("向こうの名前", 変数)

Okay?

さて、お次はなんだ?
掲示板と行こう
その前にデータベースへの
アクセス方法を、紹介する

といっても、悩む必要はない
やり方は極簡単だ
まず、設定を済ませよう
ここは手続きみたいで
元VBユーザな私にとっては楽しい(いや一応まだ現役なんだけど・・・)

海外旅行の際には出国する際も入国する際も
パスポートがいる
見せるだけという手続きと同じように単純だ

etcにあるプロジェクト名がついてini.phpファイルを探そうか
あったら開いて$config配列の中に
'dsn' => 'mysql://ユーザ名:パスワード@接続先DBホスト名/データベース名',
と記述する
dsnはData Source Nameの略で道案内サービスではない

mysqlはDBによって変えられる
Postgreの場合はpgsql
参考例
ユーザ名はroot
パスワードはpassword
接続先はlocalhost
データベース名はsample
'dsn' => 'mysql://root:password@localhost/sample',

これで大丈夫だ

例えばさっき作ったLogin.php
Viewディレクトリのね?
を開こう

こいつはtemplateのjaのLogin.tplに
処理結果を表示している

ここにデータベースアクセス処理を記述しよう
DBにアクセスするにはEthnaのbackendを使う
$db = & $this->backend=>getDB();
これでデータベースにアクセスできるようになる
sampleデータベースのtestというテーブルにアクセスしてみよう
$result = & $db->-query("SELECT * FROM `test`");
SQL構文についても説明しない
めんどうだからだ

これで$resultに取得結果が返ってくる
次にその中身をわかりやすく変数に入れよう
$i=0;
while($row[$i] = $result->fetchRow()){
   $i++;
}

これで例えば初めのレコードの
初めのフィールドをとりたい場合は
$this->af->setApp($row[0][0]);
で行ける

更にデータ取得の場合は2種類の取得方法がある
DB_FETCHMODE_ORDERED

DB_FETCHMODE_ASSOC


前者はフィールドの順番毎に番号で
後者はフィールド名そのままで返してくれる

なのでフィールドごとの名前を連想配列に使いたい場合はASSOCを使おう
使い方は
while($row = $reuslt->fetchRow(DB_FETCHMODE_ASSOC))
で行ける
Category: General
Posted by: psycho
前回はHello Worldの出し方を紹介した
次は一歩踏み込んでフォームを使ってみよう

テーマは入力だ

私は入力処理の習得の簡素の第一歩として
税金を計算するプログラムをいつも
どのような言語でも最初に作ってる

まず、今回はテンプレートから作ろうか
前回作ったlogin.tplを再利用しよう
templateのjaにあるlogin.tplを開いて
<form action={$script} method=post>
<input type=hidden name=action value=login_do>
<input type=text name=tax>
<input type=submit value=税込み>:
</form>
と入力する

税金なクセしてloginなのは本家に忠実だからだ
気にしないでくれ

続いてEthnaコマンドを使用して
login_doファイルを生成する
Ethna add-action login_do /ドキュメントルート/sample
するとappのactionにLoginディレクトリができる
更にそこにDo.phpというファイルも生成される

Do.phpを開く
$formの中に
'tax' => array('name' => '税込み', 'required' => true, 'type' => VAR_TYPE_INT,),
と入力し定義する

次にperformの中に
return 'login_do';
return 'index'; //それぞれ遷移先を記述する
$tax = $this->af->get('tax')*0.05;
$tax = $tax + $this->af->get('tax');
$this->af->setApp("tax", $tax);

税込み価格は税率が5%だから5/100で0.05
それに定価をかける
そして出た結果を定価に足す

そしてtemplateのjaにLoginというディレクトリを作って
Do.tplを作成し
{$app.tax}と書く
後は/?action_login=trueにアクセスして好きな値段を書いて
税込みを押すと結果が返ってくる
例100>105円

ただ、税金を出すにはもってやりやすい方法があって
定価*1.05とするだけで出てくる
$this->af->setApp("tax", $this->af->get('tax')*1.05);
だけでも答えがでてくるわけだ
ブラボー!!!
Category: General
Posted by: psycho
いよいよ、Hello Worldへと突入する

ethna add-action login /web/sample
でアクションファイルを生成し
appのactionのLogin.phpを開く

function performの中に
return 'login';
と書こう

次にviewファイルを同じ要領で書き
appのviewの中のLogin.phpを開く

function preforwardの中に
$this->af->setApp('test', 'Hello World');
とか書いてみよう

そしてtemplateのjaの中に
Login.tplファイルを作成して
{$app.test}とか書いて保存すれば
Hello Worldの完成だ

プロジェクトディレクトリ/?action_login=true
としてみよう
Category: General
Posted by: psycho
偉そうにサブタイつけてみる
それもNHKの○○の○○のパクリみたいな
タイトルで

いきなりだが本題だ
PEARでEthnaを入れると
Ethnaコマンドが使える
早速作業に取り組もう

例えばSampleというプロジェクトを作るとする
DocumentRootはwebとする
Ethna add-project Sample /web
ディレクトリがない場合は作るか?と聞かれる
yと入力しよう

気づいたら色々とファイルができているが
そこら辺の説明は本家に書いてある

早速コードを弄ろう
/web/sample/app/Sample_Controller.phpを開く

こっから重要なのが
$actionと$forward

$actionの配列内に
'index' => array('class_name' => 'Sample_Action_Index',),
と書いてみよう

これでappの中のactionディレクトリにある
Sample_Action_Indexクラスと関連付けられる
これはアクションが生じた時に処理が行われる

次に$forwardだ
$forwardの配列内に
'index' => array('view_name' => 'Sample_View_Index', 'forward_path' => 'index.tpl'),
と書いてみよう
これで、Viewディレクトリ内にある
Sample_View_Indexと関連づけられて
表示時にこの処理が実行される
forward_pathで指定されるのは
templateのjaの中のテンプレートファイル(Smarty経由で使用)となる

ただ、view_nameとclass_nameは入力する必要がない
という驚くべき事実

08/04@23:11 - Ethnaリターンズ#1

Category: General
Posted by: psycho
とりあえず、今までわかってきた
Ethnaについての以下略称を以下略称


いきなりEthnaを入れる前に
Ethnaには側近がいるんだ
それは賢いのかスリムなのかわからないが
Smartyっていう奴と
わたしがどうしてもピアと呼んでしまう梨、PEARだ
PHP Extension Application Repositoryだったけ?

両方を入れていざ鎌倉
それとMySQLとかいれとこう
ああ、Apacheとかは当然ね

それらをphp.iniでinclude_pathして
ここら辺の説明は省くね
XAMPP使わない限りいくらでも
導入説明があるし


コードの書き始めは次のアイテムに渡す

08/04@22:54 - はじめに

Category: General
Posted by: psycho
これはあなたのweblogにおける最初のアイテムです。自由に削除していただいてかまいません。

いいえ、削除しません
| 1 |