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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

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

Q&A

解決済

2回答

3160閲覧

FuelPHPのFieldsetオブジェクトのadd_modelで追加したくない項目がある場合

msx2

総合スコア174

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

FuelPHP

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

2グッド

0クリップ

投稿2016/03/10 02:47

いくつかのテーブルを組み合わせて1つのフォームを作る際に、Fieldsetオブジェクトにadd_model()で複数のModelを追加するとcreated_atやupdated_atが重複してしまいNoticeが発生してしまいます。

エラーを発生させないためにadd_model()してから不要なフィールドの削除→次のadd_model()という手順を踏みたいところですがフィールドを削除するメソッドが見つかりません。
フィールドをunsetしようにもアクセス制限があるのでクラスを拡張しないと削除することができませんでした。

###質問したいこと
Fieldsetオブジェクトのadd_model()でフィールドとして取り込まれないようにModelの$_propertiesで設定可能かどうか

PHP

1class Model_Item extends \Orm\Model 2{ 3 protected static $_properties = array( 4 'id', 5 'item_name' => array( 6 'data_type' => 'varchar', 7 'label' => '商品名', 8 'validation' => array('required','max_length'=>array(300)), 9 'form' => array('type' => 'text'),), 10 'created_at' => array('form' => array('type' => false ),), 11 'updated_at' => array('form' => array('type' => false ),) 12 ); 13//以下省略

複雑なフォームを作る場合はadd_model()を使わずに一つ一つフィールドを追加していますよ、といったご意見でも構いません。Fieldsetオブジェクトのメリットの一つとしてValidationルールなどをModelに集めて記述できるのはとても便利な機能だと思いました。皆さんどれくらい活用されているのか知ることができれば幸いです。

よろしくお願いします。

ikuwow, fagai👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

ソースをちょっと手動で追ってみました。
実際の動作を確認していないのですが、フィールドの指定の際に'skip'キーを指定すれば良いみたいです。

どうやらskipの指定はver1.2からすでに採用されていたようです。

protected static $_properties = array( 'id', 'item_name' => array( 'data_type' => 'varchar', 'label' => '商品名', 'validation' => array('required','max_length'=>array(300)), 'form' => array('type' => 'text')), 'created_at' => array('skip' => true), 'updated_at' => array('skip' => true) );

一応追ったソースの経緯としては、
Fieldset - クラス - FuelPHP ドキュメント
add_modelにはデフォルトでモデルのset_form_fieldsを呼び出すような形になっていたので、実際にどうなっているか確認しました。

orm/model.php at 1.7/master · fuel/orm
こちらでObserver_Validationのset_fieldsが呼ばれており、フィールドの設定をぐるぐる回すのが
orm/validation.php at 1.7/master · fuel/orm
です。
最初に

if (\Arr::get($settings, 'skip', in_array($p, $primary_keys))) { continue; }

この判定でskipキーの存在を確認して、あれば取得してtrueならcontinueとなるので問題なくこれで動作すると思います・・・!

(後ほどこの件で確認が取れたらブログの方も直しておきます・・・。)

投稿2016/03/10 04:23

編集2016/03/10 04:24
fagai

総合スコア2158

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

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

msx2

2016/03/10 05:09

いつもありがとうございます! バッチリできました。 これでfieldsetクラスを少しはマシに使えるようになりそうです。。
msx2

2016/03/10 05:17

フレームワークのソースが読めると困ったときに自分で調べられてすごく便利ですね。 何気にgithubのソースがこんな風にリンクでハイライトできるのも初めて知りました。 teratailは本当に勉強になります。
guest

0

すいません、うろ覚えなのですが、

php

1$fieldset = Fieldset::forge()->add_model('Model_name'); 2$fieldset->delete('field_name');

で削除出来たような気がします。Coreのソースを見たらそんなfunctionがありました。
いずれにせよ、add_model()の後で不要なフィールドを消すのはやったことがあるので、上記やり方じゃ無いにしろ出来たかと思います。

投稿2016/03/10 03:56

amaranthine

総合スコア501

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

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

msx2

2016/03/10 04:59

上記のdelete()メソッドで削除することができました! 今回の目的は不要な項目をスキップすることでしたが、画面によっては不要になる項目もあると思うので大変ありがたいです。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問