BANSYSTEMSBLOG

Load of the ○○○○PHP!?

JsHelper使ってますか!
僕は元気ですw

便利なものは使おうということで、Js->submitで保存できるテンプレートを作りました。
bakeするとadd.ctpとedit.ctpがJs->submitになるというものです。
Ajaxで保存します。

cake/console/templates/defaultをコピーして、vendors/shells/templatesへコピーします。

defaultをjssubmitへリネームします。

変更内容
1.Ajax処理にするため、保存時に全体を書き換えるめ、idでactionより上をすべて囲む
2.Js Helperを読み込む
3.Js->submitを設定する
4.大前提としてjQueryを用意する

//form.ctp
<div id="<?php echo $action ?>">
<div class="<?php echo $pluralVar;?> form">
<?php echo "<?php echo \$this->Html->script('jquery', array('inline'=>false));?>\n";?>
<?php echo "<?php echo \$this->Form->create('{$modelClass}');?>\n";?>
	<fieldset>
 		<legend><?php echo "<?php printf(__('" . Inflector::humanize($action) . " %s', true), __('{$singularHumanName}', true)); ?>";?></legend>

<table>
<?php
		echo "\t<?php\n";
		foreach ($fields as $field) {
			if (strpos($action, 'add') !== false && $field == $primaryKey) {
				continue;
			} elseif (!in_array($field, array('created', 'modified', 'updated'))) {
				echo "echo '<tr><td>';\n";
				echo "\t\techo \$this->Form->input('{$field}');\n";
				echo "echo '</td></tr>';\n";
			}
		}
		if (!empty($associations['hasAndBelongsToMany'])) {
			foreach ($associations['hasAndBelongsToMany'] as $assocName => $assocData) {
				echo "echo '<tr><td>'\n";
				echo "\t\techo \$this->Form->input('{$assocName}');\n";
				echo "echo '</td></tr>'\n";
			}
		}
		echo "\t?>\n";
?>
</table>
	</fieldset>
<?php
	echo "<?php echo \$this->Js->submit(__('Save', true), array('update'=>'#".$action."', 'url'=>'".$action."', 'buffer'=>false));?>\n";
	echo "<?php echo \$this->Form->end();?>\n";
?>
</div>

<div class="actions">
	<h3><?php echo "<?php __('Actions'); ?>"; ?></h3>
	<ul>

<?php if (strpos($action, 'add') === false): ?>
		<li><?php echo "<?php echo \$this->Html->link(__('Delete', true), array('action' => 'delete', \$this->Form->value('{$modelClass}.{$primaryKey}')), null, sprintf(__('Are you sure you want to delete # %s?', true), \$this->Form->value('{$modelClass}.{$primaryKey}'))); ?>";?></li>
<?php endif;?>
		<li><?php echo "<?php echo \$this->Html->link(sprintf(__('List %s', true), __('{$pluralHumanName}', true)), array('action' => 'index'));?>";?></li>
<?php
		$done = array();
		foreach ($associations as $type => $data) {
			foreach ($data as $alias => $details) {
				if ($details['controller'] != $this->name && !in_array($details['controller'], $done)) {
					echo "\t\t<li><?php echo \$this->Html->link(sprintf(__('List %s', true), __('" . Inflector::humanize($details['controller']) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'index')); ?> </li>\n";
					echo "\t\t<li><?php echo \$this->Html->link(sprintf(__('New %s', true), __('" . Inflector::humanize(Inflector::underscore($alias)) . "', true)), array('controller' => '{$details['controller']}', 'action' => 'add')); ?> </li>\n";
					$done[] = $details['controller'];
				}
			}
		}
?>
	</ul>
</div>
</div>

jQueryを読み込んでいますが、別に読み込んでいる場合は不要です。

設置したらbakeします。

./cake/console/cake bake

Viewを選択します。
Welcome to CakePHP v1.3.0 Console
—————————————————————
App : app
Path: /Applications/MAMP/htdocs/hoge/app
—————————————————————
Interactive Bake Shell
—————————————————————
[D]atabase Configuration
[M]odel
[V]iew
[C]ontroller
[P]roject
[F]ixture
[T]est case
[Q]uit
What would you like to Bake? (D/M/V/C/P/F/T/Q)
> v

※テーブルは任意のテーブルです

—————————————————————
Bake View
Path: /Applications/MAMP/htdocs/hoge/app/views/
—————————————————————
Possible Controllers based on your current database:
1. Users
Enter a number from the list above,
type in the name of another controller, or ‘q’ to exit
[q] >1

※途中で下記のメッセージがでたら、jssubmitを選択する

—————————————————————
You have more than one set of templates installed.
Please choose the template set you wish to use:
—————————————————————
1. jssubmit
2. default
Which bake theme would you like to use? (1/2)
[1] > 1

その後はそのままbakeするだけ!
できあがったformはコントローラーを変更する必要はなく使用できるはずです。

デモ:http://bansystems.org:8080/hoge/users/add

最近、クラサバのレガシーシステムをWEBに移行したいというご要望が多々あります。
しかしWEBシステムでデフォルトで構築した場合のユーザビリティは必ずしも使い勝手が良いとは言いづらいものがります。
そこでいささか手間ではありますが、JavaScriptとJQueryを利用して、レガシーなシステムを再現してみましょうという試みです。

コボルなどではキーボードオンリーで操作するのが常であり、入力オペレーターは既にそれに慣れすぎていて、
少しでもマウスを使うのことを敬遠しがちです。しかしこれはどうすることもできません。
現場の作業員は誰が登場しても説得することは不可能なのです(経験者は語る)
※飲みに誘っても断られるだけです(^^;

ま、ということで作りました。技術的には大したことではありませんがgithubに上げておきます。

使い方:
econtrol.phpをapp/views/helpersに置いてください。

controllerの設定

<?php
class VouchersController extends AppController {

	var $name = 'Vouchers';
	var $helpers = array('Js', 'Econtrol');

viewの設定

//画面上のコントロールを順番にエンターで移動する処理
<?php echo $this->Econtrol->handleEnter();?>
<?php echo $this->Econtrol->end();?>

//submitから次のコントロールへ移動する処理
<?php echo $this->Econtrol->submitEnter("#voucheradd","#ProductName");?>
<?php echo $this->Econtrol->submitEnter("#itemsadd","#ProductName");?>

※submitからの移動はループ処理ではわからなかったのでそこだけjQueryになってます。
やり方教えてください!

//$this->Form-inputを$this->Econtrol->inputへ変更します。
echo $this->Econtrol->input('Invoice_no');

submitはajaxを使用しなければなりません。

//Js Helperを使用していますが、直接書いてもokです。
echo $js->submit('Save', array('id'=>'voucheradd', 'update'=>'#voucher','url' => '/vouchers/add'));
echo $js->writebuffer(array('inline'=>false));

デモページはこちら。
http://bansystems.org:8080/kbms/demo/vouchers/add

githubはこちら。
http://github.com/konnoyosuke/econtrol

おふざけで作ったCakeBeerアイコンです。

cakebeer

cakePHP勉強してますか!
私は元気ですw

さて、去る5月29日にcakePHP勉強会に参加してきました。
今回はサテライト会場が北海道、東海、福岡に企画されてそれぞれをSkypeで中継すると言う新しい試みで行われて大変盛り上がりました。
またNYから@yandoさんの発表がありました。
PHP Matsuriは大変興味があり、是非参加したいと思っております。→@phpmatsuriをフォローしましょうー。

ちなみに、弊社は晴海グランドホテルは以前開発合宿しました。連泊5日間…。
都内で観光するわけがなく、24時間部屋に篭りっきりです(マジ)
しかし、4日目の夜にやばくなって、月島でもんじゃでリフレッシュしました(これもマジ)
月島もんじゃは最高です!
IMG_0552

本題ですが、勉強会の内容の感想は月並みになってしまいますので、@MASA-Pさんのサイトにリンクが纏められていますのでそちらを参考にしてください。
http://blog.ecworks.jp/archives/1207

私自身、実務ではcakePHPをメインで開発を行っております。殆どが業務システムです。
最近では、印刷通販システムを構築しましたので公開しましたらお知らせしたいと思います。
面白くてハマっているのはjQueryですね。cakeで便利に使うためにいろいろ考えていきたいと思っております。
今後、cakePHPでやることは実務でmongoDBを組み合わせていきたいと思っております。
それと、これは目標ですがiPadで業務システムを推進していきたいと思っております。もちろんバックエンドはcakeでw

では今夏は#cake_beerで行きますか?(^-^¥
※時間がなくて色がぬれなかったのはかんべんしてください(バックトゥザフューチャーのドク風で)
cakestudy5

Actionの削除リンクを画像にしたいですよね!
下記のようにします。

//cakephp1.3
<?php echo $this->Html->link($this->Html->image("delete.jpg"), array('action' => 'delete', $users['User']['id']), array('escape'=>false), sprintf(__('Are you sure you want to delete # %s?', true), $users['User']['id']));?>

cakePHPでのバリデーションは便利ですね!
実際の画面にはemailやpasswordなど確認用のフィールドが存在すると思います。
確認用のバリデーションは下記のように設定します。

<?php
class User extends AppModel {
var $name = 'User';

var $validate = array(
	'email' => array(
		'email' => array(
			'rule' => array('email', true),
			'message' => 'メールアドレスを正しく入力してください。'
		),
		'email' => array(
			'rule' => 'isUnique',
			'message' => 'このメールアドレスはすでに使用されています。'
		),
	  'confirmFields' => array(
		'rule' => array('confirmFields', 'email_confirm'),
		'message' => 'emailが一致しません',
		),
	),

	'email_confirm' => array(
		'email' => array(
		'rule' => array('email', true),
		'message' => 'メールアドレスを正しく入力してください。'
		),
	),

	'new_password' => array(
	  'minLength' => array(
		  'rule' => array('minLength', 8),
		  'message' => 'パスワードは8文字以上の長さで入力してください。。'
		  ),
	  'notEmpty' => array(
		'rule' => 'notEmpty',
		'message' => 'パスワードを入力してください。'
			),
	  'confirmFields' => array(
		'rule' => array('confirmFields', 'password_confirm'),
		'message' => 'パスワードが一致しません',
		),
	 ),
	'password_confirm' => array(
	  'minLength' => array(
		  'rule' => array('minLength', 8),
		  'message' => 'パスワードは8文字以上の長さで入力してください。。'
		  ),
	  'notEmpty' => array(
		'rule' => 'notEmpty',
		'message' => 'パスワードを入力してください。'
		),
	),
);

//$data:バリデーション名; $target:フィールド名;
function confirmFields($data, $target) {
	$source = '';
	if (isset($target)) {
		$source = array_shift($data);
	}
	return $source == $this->data[$this->name][$target];
}
?>

cakePHP1.3からは引数の指定が変わっていました。

cakePHP1.2では、


<?php
echo $html->link(
    $html->image("recipes/6.jpg", array("alt" => "Brownies")),
    "recipes/view/6",
    null, null, false
);
?>

cakePHP1.3では、

<?php
echo $html->link(
    $html->image("recipes/6.jpg", array("alt" => "Brownies")),
    "recipes/view/6",
    array('escape'=>false)
);
?>

$html->linkでも動きますが、1.3からの書き方は$this->Html->linkになっています。

※mod_pythonやdigest認証は設定済みです。

複数プロジェクト管理するために、trac-adminで新しいリポジトリを指定して作成した場合に、
もともとあるユーザを新しいプロジェクトで権限を与える必要があります。

1.複数プロジェクト
10021701

2.管理画面が表示されない。
10021702

3.利用可能な管理パネルが存在しません
10021703

4.コンソールから権限を設定します。まずインタラクティブモードにする。
trac-admin [path/to/project-dir]
10021704

5.パーミッションを設定する。

Trac [patth/to/project] > permission add yosuke TRAC_ADMIN

6.管理画面が表示される。
10021705

プロジェクト毎にTracの権限設定が必要。

ググってたらインストーラーがあることを知りました。
紹介しておきます。

http://code.google.com/p/git-osx-installer/downloads/list?can=3

1.インストール完了
スクリーンショット(2010-02-10 11.01.02)

2.ターミナルで確認する
スクリーンショット(2010-02-10 11.03.40)

1/30にPHP勉強会に参加しました。
その内容と簡単な感想を添えて記録しておきます。

1.Lithiumラボ 超先進的フレームワーク yandodさん
・以前はcake3と呼ばれていて、クオリティ・速度・柔軟性を追求し、ドキュメント指向DBを積極利用
・Lithiumの本質は、「PHP5.3」「拡張性」
・コードの分量がcakePHPよりも少なくてすむ。
・静的遅延束縛でstaticも拡張できる
・ネームスペース、クロージャ
・簡単に拡張ができるフレームワーク

→新しく聞くことが多かったでしたが非常に参考になりました。
デフォルトDBがドキュメント指向DBということが今後に大きな影響を与えそうですね。

2.PHPでBrainF*ck by openpear/Acme_BrainPhack : msakamoto-sf さん
BrainF*ckという言語は、8つの命令だけで作られた言語でメモリアドレスをポインタで操作していく。
Misa は文法上、Brainf**k というプログラミング言語の亜流言語
・アスキーアートやる夫とジョジョでHello world!を出力。
→面白い!こういう発表大好きです。

3.NetBeansを使ってAgaviで携帯サイトを作ってみた。 megeso さん
・AgaviはPHP5アプリケーションフレームワーク
→また一つ新しいフレームワークを知りました。

4.Datasourceをおすすめします。kazu_29 さん
・Datasourceとはモデルとモデルが表現しているデータ自体をリンクするもの。
・dbo_source => RDBに共通する処理をまとめたDatasourceの基底クラス。
・Datasourceの例 => CSV Datasource, Twitter Datasource, CouchDB…、mongoDB…などなど。
・1.3からはDatasourceがPlugin化できる。
※つまり、Datasourceをどんどん使いましょう!とのことです。
個人的にはmssql datasourceを直したいのですが需要がなさそうなので…。

5. MongoDB + PHP + Cake cakephper さん
・MongoDB => ドキュメント指向DB(リレーション、トランザクションがない)
・Table => Collection , Row => Document
・パフォーマンスは良いと言われている。(スライドを参照)
・MongoDBのcakePHP Datasourceを開発した話。
※非常に興味を持ちました。
今後是非使ってみたいと思います。

今回はLithiumの話、MongoDB, Datasourceと興味がある内容でしたので急遽参加しました。
また懇親会も参加させて頂きましたが、みなさん気さくでとても楽しくお話をさせて頂きました。
感謝致します。今後参加する機会がありましたらよろしくお願いいたします。

最後に、会場をお貸ししてくださったコンテンツワンさんありがとうございました。