質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

解決済

1回答

5730閲覧

フォームからの入力で未入力の場合はnullでデータベースに登録したい

msx2

総合スコア174

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2016/03/04 06:32

編集2016/03/07 05:07

FuelPHPを独学で学びながらシステムの構築をしています。

まずは練習としてフォームに入力した値を送信し入力した値をチェックしてフォームに再セットして表示するページを作ってみました。

困っているのは「定価」という項目のデータベースへの登録で、この項目はテーブル定義では数値型でNULLが許可されています。(MySQL)

何も入力がなかった場合はNULLとしてデータベースに登録したいのですが、このソースでModelのSaveメソッドを実行すると''で登録しようとしてSQLエラーになってしまいます。(ORMモデルです)

Validationのチェックが通ったらSaveメソッドも成功するようにする様に作りたいです。''をNULLに変える処理をどこに書くのが適当でしょうか?

■Controller側

PHP

1public function action_create(){ 2 3 $data = []; 4 $data['item_cd'] = ''; 5 $data['item_name'] = ''; 6 $data['op_flag'] = ''; 7 $data['catalog_price'] = ''; 8 $data['stock_type'] = ''; 9 10 $data['message'] = ''; 11 12 //POSTの場合 13 if(Input::method() == 'POST'){ 14 15 $val = Validation::forge(); 16 //ValidationクラスにFieldを登録 17 $val->add('item_cd','商品コード') 18 ->add_rule('required') 19 ->add_rule('max_length',100); 20 21 $val->add('item_name','商品名') 22 ->add_rule('required') 23 ->add_rule('max_length',300); 24 25 $val->add('op_flag','オープン価格') 26 ->add_rule('required') 27 ->add_rule('max_length',1) 28 ->add_rule('valid_string',array('numeric')); 29 30 $val->add('catalog_price','定価') 31 ->add_rule('max_length',8) 32 ->add_rule('valid_string',array('numeric')); 33 34 $val->add('stock_type','在庫タイプ') 35 ->add_rule('required') 36 ->add_rule('max_length',1) 37 ->add_rule('valid_string',array('numeric')); 38 39 $val->run() 40 41 //postされた値を受け取る 42 $data['item_cd'] = Input::post('item_cd'); 43 $data['item_name'] = Input::post('item_name'); 44 $data['op_flag'] = Input::post('op_flag',0); 45 $data['catalog_price'] = Input::post('list_price'); 46 $data['stock_type'] = Input::post('stock_type'); 47 48 if($out===''){ 49 50 $item = Model_Item::forge(); 51 $item->item_cd = $data['item_cd']; 52 $item->item_name = $data['item_name']; 53 $item->op_flag = $data['op_flag']; 54 $item->catalog_price = $data['catalog_price']; 55 $item->stock_type = $data['stock_type']; 56 57 if($item->save()){ 58 Response::redirect('item/view/' . $item->id); 59 } 60 } 61 } 62 63 $this->template->content = View::forge('item/create',$data); 64}

■View側

PHP

1<table> 2<?php echo Form::open('item/create'); ?> 3<tr> 4 <td><?php echo Form::label('商品コード','item_cd'); ?></td> 5 <td><?php echo Form::input('item_cd',$item_cd,array('size' => 20)); ?></td> 6</tr> 7<tr> 8 <td><?php echo Form::label('商品名','item_name'); ?></td> 9 <td><?php echo Form::input('item_name',$item_name,array('size'=>20)); ?></td> 10</tr> 11 <tr> 12 <td><?php echo Form::label('オープン価格','op_flag'); ?> 13</td> 14 15<?php if($op_flag === '1'){ 16 $op_flag = ['id' => 'form_op_flag', 'checked' => '']; 17}else{ 18 $op_flag = ['id' => 'form_op_flag' ]; 19} 20?> 21<td><?php echo Form::checkbox('op_flag','1',$op_flag); ?></td> 22</tr> 23<tr> 24 <td><?php echo Form::label('定価','catalog_price'); ?></td> 25 <td><?php echo Form::input('catalog_price',$list_price,array('size' => 20)); ?></td> 26</tr><tr> 27<td>在庫タイプ</td> 28 <td> 29<?php 30$form_stock_type_1 = ['id' => 'form_stock_type_1']; 31$form_stock_type_2 = ['id' => 'form_stock_type_2']; 32$form_stock_type_3 = ['id' => 'form_stock_type_3']; 33if(isset($stock_type)){ 34 switch(true) 35 case $stock_type === '1': 36 $form_stock_type_1 = ['id' => 'form_stock_type_1','checked'=>'']; 37 break; 38 case $stock_type === '2': 39 $form_stock_type_2 = ['id' => 'form_stock_type_2','checked'=>'']; 40 break; 41 case $stock_type === '3': 42 $form_stock_type_3 = ['id' => 'form_stock_type_3','checked'=>'']; 43 break; 44 default: 45 } 46} 47?> 48 <?php echo Form::radio('stock_type','1',$form_stock_type_1), Form::label('設定なし','stock_type_1'); ?> 49 <?php echo Form::radio('stock_type','2',$form_stock_type_2), Form::label('単品在庫','stock_type_2'); ?> 50 <?php echo Form::radio('stock_type','3',$form_stock_type_3), Form::label('バリエーション在庫','stock_type_3'); ?> 51 </td> 52</tr> 53<tr> 54 <td><?php echo Form::submit('submit','チェック'); ?></td> 55</tr> 56</table> 57<?php echo Form::close();?>

PHP

1class Model_Item extends \Orm\Model 2{ 3 protected static $_properties = array( 4 'id', 5 'item_cd' => array( 6 'data_type' => 'varchar', 7 'label' => '商品コード', 8 'validation' => array('required','max_length'=>array(100)), 9 'form' => array('type' => 'text'), 10 ), 11 'item_name' => array( 12 'data_type' => 'varchar', 13 'label' => '商品名', 14 'validation' => array('required','max_length'=>array(300)), 15 'form' => array('type' => 'text'), 16 ), 17 'catalog_price' => array( 18 'data_type' => 'int', 19 'label' => '定価', 20 'validation' => array('valid_string'=>array(array('numeric')),'max_length'=>array(8),'intnull'), 21 'form' => array('type' => 'text'), 22 ), 23 'op_flag' => array( 24 'data_type' => 'int', 25 'label' => 'オープン価格', 26 'form' => array('type' => 'checkbox', 'options' => array(1 => 'aaa'), 'value' => 0 ), 27 ), 28 29 'stock_type' => array( 30 'data_type' => 'int', 31 'label' => '在庫タイプ', 32 'validation' => array('required'), 33 'form' => array('type' => 'radio', 'options' => array(0 => '設定なし', 1 => '単品在庫' , 2 =>'バリエーション在庫' )), 34 ), 35 ); 36 protected static $_observers = array( 37 'Orm\Observer_CreatedAt' => array( 38 'events' => array('before_insert'), 39 'mysql_timestamp' => false, 40 ), 41 'Orm\Observer_UpdatedAt' => array( 42 'events' => array('before_update'), 43 'mysql_timestamp' => false, 44 ), 45 ); 46 protected static $_table_name = 'item'; 47}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

liply

2016/03/06 10:01

Model_Itemも提示したほうが有用な回答が得られやすいかと思います。
msx2

2016/03/07 05:08

ご指摘ありがとうございます。 Model_Itemも追加しました。
guest

回答1

0

自己解決

Model_Itemにプロパティをチェックするメソッドを追加しデータベースでエラーにならない値に変換、saveメソッドをオーバーライドしてチェックメソッドを実行するようにしました。

とりあえずこれで思っている感じにはなったので解決です。

PHP

1private function chk_prop(){ 2 //プロパティーのチェック 3 $this->catalog_price = ctype_digit($this->catalog_price) ? $this->catalog_price : null; 4 $this->op_flag = ctype_digit($this->op_flag ) ? $this->op_flag : 0; 5 $this->stock_type = ctype_digit($this->stock_type) ? $this->stock_type : 1; 6} 7 8public function save($cascade = NULL, $use_transaction = false){ 9 $this->chk_prop(); 10 parent::save($cascade,$use_transaction); 11}

投稿2016/03/08 05:23

msx2

総合スコア174

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問