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

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

ただいまの
回答率

88.59%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,622

msx2

score 164

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

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

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

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

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

■Controller側

public function action_create(){

    $data = [];
    $data['item_cd'] = '';
    $data['item_name'] = '';
    $data['op_flag'] = '';
    $data['catalog_price'] = '';
    $data['stock_type'] = '';

    $data['message'] = '';

    //POSTの場合
    if(Input::method() == 'POST'){

        $val = Validation::forge();
        //ValidationクラスにFieldを登録
        $val->add('item_cd','商品コード')
            ->add_rule('required')
            ->add_rule('max_length',100);

        $val->add('item_name','商品名')
            ->add_rule('required')
            ->add_rule('max_length',300);

        $val->add('op_flag','オープン価格')
            ->add_rule('required')
            ->add_rule('max_length',1)
            ->add_rule('valid_string',array('numeric'));

        $val->add('catalog_price','定価')
            ->add_rule('max_length',8)
            ->add_rule('valid_string',array('numeric'));

        $val->add('stock_type','在庫タイプ')
            ->add_rule('required')
            ->add_rule('max_length',1)
            ->add_rule('valid_string',array('numeric'));

        $val->run()

        //postされた値を受け取る
        $data['item_cd'] = Input::post('item_cd');
        $data['item_name'] = Input::post('item_name');
        $data['op_flag'] = Input::post('op_flag',0);
        $data['catalog_price'] = Input::post('list_price');
        $data['stock_type'] = Input::post('stock_type');

        if($out===''){

            $item = Model_Item::forge();
            $item->item_cd = $data['item_cd'];
            $item->item_name = $data['item_name'];
            $item->op_flag = $data['op_flag'];
            $item->catalog_price = $data['catalog_price'];
            $item->stock_type = $data['stock_type'];

            if($item->save()){
                Response::redirect('item/view/' . $item->id);
            }
        }
    }

    $this->template->content = View::forge('item/create',$data);
}


■View側

<table>
<?php echo Form::open('item/create'); ?>
<tr>
  <td><?php echo Form::label('商品コード','item_cd'); ?></td>
  <td><?php echo Form::input('item_cd',$item_cd,array('size' => 20)); ?></td>
</tr>
<tr>
  <td><?php echo Form::label('商品名','item_name'); ?></td>
  <td><?php echo Form::input('item_name',$item_name,array('size'=>20)); ?></td>
</tr>
  <tr>
  <td><?php echo Form::label('オープン価格','op_flag'); ?>
</td>

<?php if($op_flag === '1'){
    $op_flag = ['id' => 'form_op_flag', 'checked' => ''];
}else{
    $op_flag = ['id' => 'form_op_flag' ];
}
?>
<td><?php echo Form::checkbox('op_flag','1',$op_flag); ?></td>
</tr>
<tr>
  <td><?php echo Form::label('定価','catalog_price'); ?></td>
  <td><?php echo Form::input('catalog_price',$list_price,array('size' => 20)); ?></td>
</tr><tr>
<td>在庫タイプ</td>
  <td>
<?php
$form_stock_type_1 = ['id' => 'form_stock_type_1'];
$form_stock_type_2 = ['id' => 'form_stock_type_2'];
$form_stock_type_3 = ['id' => 'form_stock_type_3'];
if(isset($stock_type)){
    switch(true)
        case $stock_type === '1':
            $form_stock_type_1 = ['id' => 'form_stock_type_1','checked'=>''];
            break;
        case $stock_type === '2':
            $form_stock_type_2 = ['id' => 'form_stock_type_2','checked'=>''];
            break;
        case $stock_type === '3':
            $form_stock_type_3 = ['id' => 'form_stock_type_3','checked'=>''];
            break;
        default:
    }
}
?>
    <?php echo Form::radio('stock_type','1',$form_stock_type_1), Form::label('設定なし','stock_type_1'); ?>
   <?php echo Form::radio('stock_type','2',$form_stock_type_2), Form::label('単品在庫','stock_type_2'); ?>
   <?php echo Form::radio('stock_type','3',$form_stock_type_3), Form::label('バリエーション在庫','stock_type_3'); ?>
  </td>
</tr>
<tr>
  <td><?php echo Form::submit('submit','チェック'); ?></td>
</tr>
</table>
<?php echo Form::close();?>
class Model_Item extends \Orm\Model
{
    protected static $_properties = array(
        'id',
        'item_cd' => array(
                'data_type' => 'varchar',
                'label' => '商品コード',
                'validation' => array('required','max_length'=>array(100)),
                'form' => array('type' => 'text'),
        ),
        'item_name' => array(
                'data_type' => 'varchar',
                'label' => '商品名',
                'validation' => array('required','max_length'=>array(300)),
                'form' => array('type' => 'text'),
        ),
        'catalog_price' => array(
                'data_type' => 'int',
                'label' => '定価',
                'validation' => array('valid_string'=>array(array('numeric')),'max_length'=>array(8),'intnull'),
                'form' => array('type' => 'text'),
        ),
        'op_flag' => array(
                'data_type' => 'int',
                'label' => 'オープン価格',
                'form' => array('type' => 'checkbox', 'options' => array(1 => 'aaa'), 'value' => 0 ),
        ),

        'stock_type' => array(
                'data_type' => 'int',
                'label' => '在庫タイプ',
                'validation' => array('required'),
                'form' => array('type' => 'radio', 'options' => array(0 => '設定なし', 1 => '単品在庫' , 2 =>'バリエーション在庫' )),
        ),
    );
    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array(
            'events' => array('before_insert'),
            'mysql_timestamp' => false,
        ),
        'Orm\Observer_UpdatedAt' => array(
            'events' => array('before_update'),
            'mysql_timestamp' => false,
        ),
    );
    protected static $_table_name = 'item';
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • liply

    2016/03/06 19:01

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

    キャンセル

  • msx2

    2016/03/07 14:08

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

    キャンセル

回答 1

check解決した方法

0

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

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

private function chk_prop(){
    //プロパティーのチェック
    $this->catalog_price = ctype_digit($this->catalog_price) ? $this->catalog_price : null;
    $this->op_flag =  ctype_digit($this->op_flag ) ? $this->op_flag : 0;
    $this->stock_type =  ctype_digit($this->stock_type) ? $this->stock_type : 1;
}

public function save($cascade = NULL, $use_transaction = false){
    $this->chk_prop();
    parent::save($cascade,$use_transaction);
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る