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