楽をして開発をする

Posted: 2014-03-01 19:07 |  PHP全般 
使い慣れたフレームワークや言語の他にも少しのアイディアで簡単に基本の部分が実装できたりします。
phpの開発で一番面倒臭いのがformだったりするんですが、

(しかも作業的に作るから全く面白くない)


今回はそんなformを少しでも楽にしようとする試みです。
ある程度オートですべて作ってしまうという、夢の一歩!
何個も作らないと行けない場合に実際にやってる方法だったりしますが、
その為にはまずDB設計からです。

まずはきっちりと正規化を心がける

DBの事について書くにはまだちょっと知識不足なんですが、
これは何用のフォーム、というのは必ずあると思いますので、
まずは、
master_forms
+------------------+------------------+------+-----+---------------------+----------------+
| Field            | Type             | Null | Key | Default             | Extra          |
+------------------+------------------+------+-----+---------------------+----------------+
| m_form_id        | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| form_title       | varchar(255)     | NO   |     |                     |                |
| created_at       | datetime         | NO   |     | 0000-00-00 00:00:00 |                |
+------------------+------------------+------+-----+---------------------+----------------+
form_elements
+--------------------------+------------------+------+-----+---------------------+----------------+
| Field                    | Type             | Null | Key | Default             | Extra          |
+--------------------------+------------------+------+-----+---------------------+----------------+
| form_element_id          | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| m_form_id                | int(11)          | NO   | MUL | NULL                |                |
| form_element_title       | varchar(255)     | NO   |     |                     |                |
| form_element_name        | varchar(255)     | NO   |     |                     |                |
| form_element_type_id     | int(11)          | NO   |     | NULL                |                |
| created_at               | datetime         | YES  |     | 0000-00-00 00:00:00 |                |
+--------------------------+------------------+------+-----+---------------------+----------------+
当然、form_elements.form_idはmaster_forms.form_idとなるのでFKになります。
forms
+----------------+------------------+------+-----+---------------------+----------------+
| Field          | Type             | Null | Key | Default             | Extra          |
+----------------+------------------+------+-----+---------------------+----------------+
| form_id        | int(11) unsigned | NO   | PRI | NULL                | auto_increment |
| m_form_id      | int(11)          | NO   | MUL | NULL                |                |
| form_title     | varchar(255)     | NO   |     |                     |                |
| created_at     | datetime         | NO   |     | 0000-00-00 00:00:00 |                |
+----------------+------------------+------+-----+---------------------+----------------+
あとはvalueを保存するtableを作ります
+-----------------------+------------------+------+-----+---------+----------------+
| Field                 | Type             | Null | Key | Default | Extra          |
+-----------------------+------------------+------+-----+---------+----------------+
| form_value_id         | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| form_id               | int(11)          | NO   | MUL | NULL    |                |
| form_element_id       | int(11)           | NO   |     |         |                |
| form_value            | text             | NO   | MUL | NULL    |                |
+-----------------------+------------------+------+-----+---------+----------------+
というような形で作り、
このフォームに必要なエレメントはこれ!というのがすぐ分かる内容になっていると思います。
inputのtext,selectなどはもうちょっと細かく設計すれば簡単にできます。
またこれにあわせて、validateルール等もDBの中に入れてしまいます。

(お使いのフレームワークにあわせてください)

このような場合に、php側でformを実装する場合は、こんな感じになります。
// laravel4 blade template
@foreach($form as $fo)
	@if($errors->first($fo->form_element_name) != '')
{{$errors->first($fo->form_element_name)}} @else
{{Form::label($fo->form_element_name, $fo->form_element_title)}} 
@endif 
{{Form::text($fo->form_element_name, (isset($data->form_element_name)) ? $data->form_element_name : '', [ 'class' => 'form-control', 'id' => $fo->form_element_name]) . "\n"}}
@endforeach
登録フォームですが、smartyなど使われている方もこんな感じだと思います。 同様にvalidate ruleもそれ用のクラス等を作ってすべてDBから取得して生成します。

全部書くと長くなるので割愛

同様に、確認画面や、裏側の登録実行処理なども基本的にはかなり少ないコード量で実装できます。
要件などでもちろん使えない場合もありますが、ちょっとしたことで楽して実装できる様になるのではないでしょうか?!

お前に言われなくてももうやってる!!って方も多いはずですが


laravel4 custom validateについてはqiitaの方で書く事にしました
Laravel Advent Calendar 2013

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014