RSS

カテゴリー別アーカイブ: PHP

ArraySourceの勧め

今日もお酒のまないんで、ひとつ記事かいてねることにします。本日もcakePHP2.1のお話です。
さて、設定ファイルでデータベースに持つ程でもない情報というのは、かつてconst.phpに書いてました。
ところが例えば男・女 とか、普遍的なものだったりあまり情報が書き換わらないものって結構あります。
で、設定ファイルが結構カオスになってたりします。

今回は、設定情報もこんなふうに持つと良いよってことで、https://github.com/cakephp/datasources/tree/2.0/Model/Datasource
ここからArraySource.phpだけをいただきます。そんでapp/Model/Datasourceにポロリと入れます。

次に、設定です。database.phpにこんな記述を足します。既存のデータベースの設定に追加してくださいね。

	var $ArraySource = array(
		'datasource' => 'ArraySource',
	);

これで、利用できる準備が整いました。
次にGender.phpっていうモデルをModel配下に作成します。

<?php
App::uses('AppModel', 'Model');
/**
 * Gender Model
 *
 */
 class Gender extends AppModel
{
    public $name = 'Gender';

    public $displayField = 'display';

    public $useDbConfig = 'ArraySource';//ここにdatabase.phpで宣言した変数名をセット

    public $records = array(
            array(
                'id' => 1,
                'display' => '男性',
            ),
            array(
                'id' => 2,
                'display' => '女性',
            ),
        );

    const MAN     = 1;//一応定数としても利用できるようにしてみた。
    const WOMAN = 2;

}

これで、このモデルをbelongToに持つモデルにこんなふうに設定すると、(注1)

	public $belongsTo = array(
		'Gender' => array(
			'className' => 'Gender',
			'foreignKey' => 'gender_id',
			'fields' => 'display',//これがちょっときになる指定
		)
	);

親のモデルから芋ずるに引っ張ってくるとあたかもGenderモデルがDBから取得したデータのように、「女性」や「男性」を返してくれます。
設定ファイルとかから参照しなくて良いので、かなりストレスフルフリーです。

echo h($value['Gender']['display']);

(注1)
ここで一点だけ。どうもcontainableを使う場合、$belongsToの条件に‘fields’ => ‘display’,
指定をするか、あるいはcontainableのconditionsの中に、フィールドを指定する、
のどちらかをしないと取ってこれませんでした。
親モデルからfind(‘all’)の場合は別に指定はいらないのですが、ビヘイビアを使う場合には
上記指定をしないと結果がarray()になってしまい、途中でフィールド名がunsetされてしまうようでした。
これ仕様なのかちょっとわからないです。
でもcontainable使ってるだけだからなあ。。。できればフィールド名は指定しなくてもいいようになるといいんですが。

ここからは確認していませんが、新規登録の時にもちゃんとlistでとってこれれば

 echo $this->Form->input('gender');

こんなかんじでアソシエーションの恩恵を受けられるのではないでしょうか。

というわけで、設定ファイルの値をあたかもDBから取得したように振る舞えるArraySource。ぜひみなさんも使ってみてください。

 
2件のコメント

投稿者: : 3月 22, 2012 投稿先 cakephp, PHP

 

KtaiLibraryを使って勉強会をやりませんか。

ええと、色々やらなくちゃいけないんだけどテスト前日に風呂掃除とか机の掃除しだす感じに似てるけど、ついったーで「合宿いいなあ、勉強会やらないかなあ、できれば最近かったKtaiLibraryでつくる携帯サイトなんてあったらいいなあ」なんてつぶやいて「だれかやんない?じゃなくて自分で主催すればいいじゃん」なんてつぶやきもいただいて。仕事とは直接関係ないんですけど携帯サイトに疎いんですよね私。以前phpでSNSを鼻の黒い人が作って、それをラップした携帯サイトっていうのを作っただけ。検証はエミュレータ使ってやったけど、キャリアごととか全然やらず。絵文字の対応とかなしwww のような時代遅れでございます。でcakeを使った開発とあわせてせっかく「PHPで作る携帯サイト」の購入に至っているので、今購入された方も多いと思うわけで、たとえば全5回とかで勉強会やってみて、作ってみんなでどこつまづいた、とかどこわかんなかった、とかあったら共有できていいかな、と思った(他力本願的?)。

なんていうか目的がはっきりしてて、勉強会ごとのアジェンダみたいなのが決まってればわりと目的ごとの疑問点とかが解決しやすいんじゃないかと。漠然とわかんなーい!よりは○○ってやってみたけどこんなエラーだった。どこに着目すればいいんだろう…のほうが答えるほうもわかりやすいんじゃないか、という気持ち。で、ぶつくさいってたらcakephperさんが「おーいいじゃないですか」みたいなことを言ってくださって、いちおう口火を切ったのが私なので、どういう風にすすめたらいいかな…というのをちょっとまとめてみました。熱いうちに開催できるといいなあ。

  • 全5回みたいな感じで通しでやることをきめる(基本は書籍の流れを踏んで)
  • 課題やってこい!みたいなのだと来なくなる人がいるんじゃないかと予想。今日はこれをやってみようみたいな流れ?
  • 予習できるひとはしてきて、質問したり、テクニックを披露。みたいなのだと素敵(はぁと)
  • 携帯サイトのためにcakephpを使うので、ばりばりcakephpしってるわ!っていう人じゃない人も対象がいいかなあ。
  • うわー携帯サイトかんたーん、しかもcakephp素敵!ってな流れを期待age
  • 勉強会は実は数回の参加なので、会場押さえるとか、色々大変なのかなあ、と思ったのですが、わいわいphp勉強会でいった渋谷の会議室はわりと良かったです。距離感も近くてwLTとかするんじゃなくて結構近い距離で「あーだこーだ」いいながらソース書く事を想定しています。ちょっとここつまづいたよ><って言いながら「どれどれ…」っていいながら。合宿ってそういう感じじゃないですかね?w
    とにかく決まってるのは「合宿みたくゴリゴリコーディングしようぜ」な会で教科書が「PHPで作る携帯サイト」だってことだけです。LTとかの予定はないから、プロジェクターとか要らないし、PCだけ持ち込んで開発環境があれば他は電源タップと机と椅子でよいのだろうか。

    最近、自分の知識不足だったり技術不足を嘆いたりすることが多くてしんどいんですがそれを埋めるためには、とりあえず手と頭を動かすしかないんだな、と。で、仕事とは別のところで技術的な楽しみを見つけられるとそれがモチベーションの維持にもなるかなと思っております。「それどころじゃねえや」って時こそ情報を整理しながら進めていかないといけないですね。
    私?私はおそらく勉強会の中でもダントツに「わからんちん」な部類だと思いますので多いに予習して臨む予定でございます。

     
    2件のコメント

    投稿者: : 2月 17, 2010 投稿先 cakephp, PHP

     

    mb_strlenを使用するときの文字コード指定

    やりたいこと。

  • mb_strlenをつかって文字列が所定値以上ならmb_substrできりとって表示
  • なので

    if(mb_strlen($Member['Member']) > 10 ){
    	$aryItem['MaterialName1'] = mb_substr($Member['Member'],0,10);
    }else{
    	$aryItem['MaterialName1'] =$Member['Member'];
    }
    

    とやっていたら、切り取った文字列の最後のほうがなんと文字化け…。。。調べたらどうも

    mb_language("Japanese");
    mb_internal_encoding("UTF8");
    

    と、このような記述が必要であるらしい。で、ためしに書いたら文字化けが解消した。もちろんソースもUTF8なんだけどね・・。で、だ。この関数を色々な箇所で使うことになった場合、いったいどこにかいたらいいのか?ということ。今上記の処理は.ctpファイルにやっているのでテンプレートに全部かくのかな…。とちょっと嫌な感じに。ちなみに、default.ctpに書けば共通でOK?とか思ったけどだめだった。よくドキュメントを読んだら、こちらにあったんだけど、第4引数に”UTF-8″を指定すればよいらしい。実は会社では文字化けしたのだけれども、自宅ではphp.iniの設定なのか上記の設定を必要とせずとも文字化けはおきなかった。関数を呼び出す時には明示的に第4引数にUTF-8だよ!って言ってあげるのが一番良いのかねえ。ググってみたけど同じ状況になってそうな人はあまりいなかった。主に携帯やメール送信の時に明示的にかいたほうがいい!っていう記事をよく見かけました。php.iniでカバーできるのだろうけれども・・・。本番以降時にphp.iniが修正できるのか微妙なのでcakephpなどの設定で一元管理できるところがあれば、そちらで対応したいところ。

     
    5件のコメント

    投稿者: : 2月 11, 2010 投稿先 PHP

     

    php勉強会

    昨日、php勉強会にいってまいりました。いやー、ちゃんと地図で調べていかないせいで…神保町についてうろうろすることに。だめもとで@hampomにメールしたけど返信なんてくるわけがない。ってことで仕方なくi pod touchで探したらライブドアのポイントが;;やっとこ調べたら…!おい目の前じゃねえか!…。場所はコンテンツワンさん。いや、すんごいきれいなオフィスでした。無料で貸し出してくれるってすごいなあ。と思いつつ。ありがとうございます。

    さて今回も色々な方のLTがあったのですが、今回もっとも気になったのはMongoDBとデータソースのお話。最近はリレーショナルなデータベース以外の話題が巷でも色々沸騰してるわけですが、実は周りに使ってる人がいない。いない&実際のソースコードでどうやってあやつるんだろう…?で、「利用できるとしたらどんなシーン?」みたいなのがあまり自分の中で具体的じゃなかった。@kaz_29さんのTLではCSVというわかりやすいデータソースでの説明だったので頭のなかにわりとすんなり入ってきた感です。実際のところ、CSVデータはたとえばmysqlに入れるってそんなに難しくないし、CSVで操作するってどうなの?っていうのももちろんあると思うんだけど、今実は社内で特定のデータが入っているCSVファイルがあって、それを参照したい・・・っていうリアルな要望があるんです。テーブルに入れるのは入れるのでいいんだろうけど、CSVデータを素のまま参照したりいれることができるのであれば、それはそれで道具として使いこなしておいても損はないかな、という気持ちでした。わざわざデータベースをつかうまでもないよね、っていう社内的なものって結構あると思うんですよね。

    今回のCSVのデータをcakephpで操作するというリアルなソースを見させていただいたおかげでより身近に感じ、運用してみるかな…という気持ちになりました。いやこういうのってすごく大事で「便利そう」→「やってみる」までの敷居が高いと結局なにもやらんで…っていうことがあるので、発表してくださるっていうのはすごい事です。

    当分、php勉強会はコンスタントに参加する予定です。インプットされたものをアウトプットできるように(ブログは去年からはじめたので、勉強会でのリアルな「アウトプット」を今年は目指そうかと思います。)地道に参加していきたいと思います。今フレームワーク使って開発している人が多いので特定のフレームワークの話題になるのは仕方ないかな、と。コンスタントにcakephpの話題が上るように私も尽力したいと思いますwそうすればみんながつかって→情報一杯→どうもありがとう だもんね◎

    現在、12月から始まった開発がやっとこなんとか機能がそろいつつあるんだけど、やっぱりmodel関連に躓きが多い。modelは自分のなかで整理をきちんとつけないといかん!と思いつつ。あとmysqlのsetフィールドとかブログに色々あげたいんだけど本日はここまで!勉強会に参加されたかた、お疲れ様でした!またよろしくお願いします。(あっ懇親会いきたかったッス!)

     
    コメントする

    投稿者: : 1月 31, 2010 投稿先 cakephp, PHP

     

    あけましておめでとうございます。

    いろいろ長くかきたいんだけど、技術的なことに費やしたいので、今年の抱負を明文化させておく。できるだけかいて今年の年末に見直す。

  • このブログを続ける。技術的なことはぜひ書き留める。大分恥ずかしいわけですが。
  • 勉強会に参加する。行ってみてから考える。しかし勉強会の情報収集が微妙に難しい。
  • スパンとしてはできるだけ1ヶ月に一回の割合を目指したい。主にphp,mysql,apache等。htmlもかなあ。
  • 去年は結構ガイドブックをしっかり読んだので、今年はもう一冊、cakephpに関連した書籍を熟読する。
  • あわせて自宅にあるmysql本を一冊最初から最後まで熟読する。(夏の宿題)
  • あわせて自宅にあるapache本を一冊最初から最後まで熟読する。とにかくよんでみる。
  • 去年はファイルサーバ立てたことはすごい自分の中で新しい事だったので、それに類似することに挑戦する
  • とりあえず以上。

     
    コメントする

    投稿者: : 1月 6, 2010 投稿先 サーバ, cakephp, PHP

     

    qdmail

    自宅でなんで動かないのかわかんないけど、本番では動いた!

    サンプルコード。文字コード変換一切なし。これだけ。

    php ファイルを一本

    require_once(‘qdmail.php’);
    $mail = & new Qdmail( ‘UTF-8’ , ‘base64’ );
    $mail -> wrapWidth( true );

    //toに送る
    $returncode = $mail -> easyText(
    array( $to , $HTTP_VARS[‘fname’].”),
    $subject,
    $body,
    array($from , ”)
    );

    今後はこっちかねえ。デコメールまでおくれるらしいですよ。奥さん。

    2009.12.03追記。
    どうやら下記ハイライトは変更になったらしい

    require_once('qdmail.php');
    $mail = & new Qdmail( 'UTF-8' , 'base64' );
    $mail -> wrapWidth( true );
    
    //toに送る
    $returncode = $mail -> easyText(
    array( $to , $HTTP_VARS['fname'].''),
    $subject,
    $body,
    array($from , '')
    );
    
    //Qdmailの改行処理を有効にする
    $mail -> wordwrapAllow( true);
    //「文字の数」で折り返したい場合は、以下のように指定
    $mail -> wrapWidth( false );
    //デフォルトだと45文字数
    $mail -> wordwrapLength( 30 );
    
     
    コメントする

    投稿者: : 6月 4, 2009 投稿先 PHP

     

    ページング処理

    PEARのページング使えば一発ぽかったんですけど鯖に入ってない…いれるとなるとコンソールでいれないといけない…いれようとしたら権限ないですしおすし。

    だって。ちねちね。

    仕方ないから作る…。ceil関数なんてものがあるのか(;°ロ°)

    ページング処理は今後どのシーンでも使われそうだし(いやFM使ったら考えなくてもはりつけで終わりそうだけど…)ロジックとしてはphpも何も関係ないからメモ的に残しておこう。

    最大一ページに50件表示。リンク表示は最大10。

    現在のページ$n_page

    全体のページ数$n_page

    if ($count[‘cnts’] > 50) {
    $st_dsp = 10 * floor(($n_page – 1) / 10) + 1;
    $ed_dsp = $st_dsp + 9;
    if ($st_dsp > $sum_page) {
    $st_dsp = $sum_page;
    }

    for ($cnt = 1; $cnt <= $sum_page; $cnt++) {
    if ($st_dsp > $cnt || $ed_dsp < $cnt) {
    continue;
    }

    $startprm = ($cnt – 1) * 50;
    if ($cnt != $n_page) {
    // 現在ページでないときは、リンクをつける
    $link .= “<a href=’$_SERVER[PHP_SELF]?ctg=$categoryvalue&c=$cvalue&d2=$dvalue&os=$cnt&sp=$spvalue’>{$cnt}</a>&nbsp;&nbsp;”;
    } else {
    // 現在ページの場合は、リンクを付けない
    $link .= “{$cnt}&nbsp;&nbsp;”;
    }
    }
    }

    それと日付キャストはこれ。cast(’2000-09-01 01:00:00’ as datetime)

     
    コメントする

    投稿者: : 5月 31, 2009 投稿先 PHP, PostgreSQL