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

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

ただいまの
回答率

90.76%

  • PHP

    19249questions

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

  • FuelPHP

    509questions

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

Fuel PHPでCall to a member function

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 230

permanent

score 20

一覧の編集ボタンを押すとモーダルが立ち上がり、該当するidに紐づいた情報が表示されるというのを実装しています。
ですが、一覧ページに遷移すると「ErrorException [ Fatal Error ]:Call to a member function label_text() on boolean」と
表示されて先に進めない状態です。
エラーはviewの
<?php echo $this->fieldset_edit->field(\Bms\Model_CountryCode::WBS_CODE)->label_text(['class' => 'col-xs-4 control-label']); ?>
で起きています。
コードを記載しますので、どなたかわかる方がいらっしゃいましたらご教授お願いいたします。

<?php
namespace Bms;

class Vo_Budgetperformance_Countrycode extends Vo_Abstract {

    //Fieldsetフォーム名
    const formname = 'budgetperformance_countrycode';
    const formnameedit = 'budgetperformance_edit';

    public function init(){

        // fieldsetを生成
        $form = new Form_Budgetperformance();

        // Fieldsetを生成
        $fieldset = $form->_fieldsetcountrycode(self::formname);
        $fieldset_edit = $form->_fieldsetcountry_edit(self::formnameedit);
        $fieldset->repopulate();

        $val = $fieldset->validation();

        $model = new \Bms\Model_CountryCode();

        //Validationする
        if($val->run(\Input::get())){

            //取得した値を整形
            foreach (\Input::get() as $key => $val) {
                if(!empty($val)){
                    // 対象取り込み年月が指定されていたら
                    if($key == 'target_month_period') {
                        // 年と月を分割
                        list($year,$month) = explode("/",$val);
                        $val = $year.$month;
                    } else {
                    }
                    $this->options[$key] = $val ? $val : null;
                }
                if ($val === '0') {
                    $this->options[$key] = 0;
                }
            }

            $model->set_per_pages($this->per_page);

        }else{
            //Validation失敗した場合
            foreach ($val->error() as $field => $error) {
                \Log::warning($error->get_message(), get_class($this));
            }
        }

        //DBから検索結果を取得
        $result = $model->get_results($this->options);

        $list = [];
        // 置き換え
        foreach ($result as $k => $v) {
            $list[$k]['id'] = $v['id'];
            $list[$k]['wbs_code'] = $v['wbs_code'];
            $list[$k]['text'] = $v['text'];
            $list[$k]['detail_text'] = $v['detail_text'];
            $list[$k]['amount'] = money_format( "%n", $v['amount'] );
        }

        //親クラスで定義している設定を取得
        $config = parent::get_pagenation_config($model);
        \Pagination::set_config($config);

        // PagenationのHelperを設定
        $this->pager = \Pagination::create_links();

        $this->fieldset = $fieldset;
        $this->fieldset_edit = $fieldset_edit;

        $this->list = $list;
    }
}
<?php
namespace Bms;
use \ViewForm\Fieldset;

class Form_Budgetperformance extends \Form_Abstract {

    public function _fieldsetcountrycode($name) {
        $form = parent::_fieldset($name);

        // 対象年月
        $form->add_text('target_month_period', __('target_month_period'),
                array('style' => '', 'placeholder' => 'yyyy/mm', 'type' => 'text'));

        // WBS要素
        $form->add_text('wbs_code', __('wbs_code'),
                array('style' => '', 'type' => 'text'));


        //国識別コード
        $opsfilekind = array(
                '1' => __('no_identifying_code'),
                '2' => __('north_america'),
                '3'    => __('europe'),
                '4' => __('korea'),
                '5' => __('taiwan'),
        );
        $form->add_select('country_code', __('country_code'), $opsfilekind, array('style' => '', 'multiple' => 'multiple'))
        ->delete_rule('allow_empty_in_array'); // multiselctを使うときは無効にする

        // テキスト
        $form->add_text('text', __('text'),
                array('style' => '', 'placeholder' => 'テキスト', 'type' => 'text'));

        $this->add_sort_order($form);
        $this->add_per_page($form);

        return $form;
    }

    public function _fieldsetcountry_edit($name) {
        $form = parent::_fieldset($name);
        $model = new \Bms\Model_CountryCode();

        // 対象年月
        $form->add(\Bms\Model_CountryCode::TARGET_MONTH_PERIOD, __('target_month_period'), array('type' => 'text', 'value' => ""))
        ->add_rule('required');

        // ID
        $form->add(\Bms\Model_CountryCode::ID, '', array('id' => 'form_id', 'type' => 'hidden'));

        return $form;
    }

}
<?php echo Asset::css('bootstrap-multiselect.css');?>
<?php echo Asset::js('bootstrap-multiselect.js');?>
<?php echo \Asset::js(['jquery.ui.ympicker.js']);?>

<script>
$(function(){
    // 編集ボタンを押下
    $(document).on('click', '[id^=edit_]', function(e) {

        e.preventDefault();

        // 初期化
        $(".modal-form").val("");

        blockUI();
        var id = $(this).data('id');
        $.ajax( {
            url: '/<?php echo __('after_sys_dir') ?>/budgetperformance/costdetail/'+id,
            type: 'get',
            async: true,
            dataType : 'json',
            success: function( data ) {

                // データを更新
                $.each(data,function(key,value){

                    if (key == '<?php echo \Bms\Model_Tblavoidrevenuename::TITLE_CODE ?>') {
                        $('#form_'+key).multiselect('select', value);
                        $('#form_'+key).multiselect('rebuild');
                    } else {
                        $('#form_'+key).val(value);
                    }
                });

                $('#modaldialog-country-edit').modal('show');
            },
            error: function( data ) {
                $('#modal-body-error').empty();
                $('#modal-body-error').append(data.responseJSON);
                $('#modaldialog-error').modal('show');
            },
            complete: function( data ) {
                unblockUI();
            }
        });
    });

});
</script>


<div class="row">
    <div class="col-xs-2">
        <h2 class="title bg-icon menu-icon"><?php echo __('after_expected_results_menu'); ?></h2>
        <?php // サブメニュー ?>
        <?php include APPPATH . 'modules/'. __('after_sys_dir') .'/views/budgetperformance/submenu.php'; ?>
    </div>
    <div class="col-xs-10">
        <h2 class="title-lg">
            <?php echo __('after_expected_results_sub_menu12'); ?>
        </h2>

        <div class="content content-main">

            <?php echo Form::open(array('action' => __('after_sys_dir').'/budgetperformance/countrycode', 'method' => 'post', 'class' => 'form-horizontal small', 'id' => 'budgetperformance_form')); ?>

                <table class="table table-bordered small">
                    <tr>
                        <th><?php echo __('wbs_code');?></th>
                        <th><?php echo __('text');?></th>
                        <th><?php echo __('detail_text');?></th>
                        <th><?php echo __('after_download_amount');?></th>
                        <th><?php echo __('edit');?></th>
                    </tr>
                    <?php foreach($list as $key => $v):?>
                    <tr>
                        <td><?php echo $v["wbs_code"];?></td>
                        <td><?php echo $v["text"];?></td>
                        <td><?php echo $v["detail_text"];?></td>
                        <td><?php echo $v["amount"];?></td>
                        <td class="text-center"><button id="edit_<?php echo $v["id"]; ?>" data-id="<?php echo $v["id"]; ?>" class="btn btn-primary btn-xs"><?php echo __('edit');?></button></td>
                    </tr>
                    <?php endforeach; ?>
                </table>
            <?php echo Form::close(); ?>

        </div>
    </div>
</div>

<!-- Modal -->
<div class="modal fade" id="modaldialog-country-edit" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" data-keyboard="false" data-backdrop="static">
    <div class="modal-dialog">
        <div class="modal-content" style="width:800px;margin-left: -70px;">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            <h4 class="modal-title" id="myModalLabel"><?php echo __('after_wbs_master')?></h4>
            </div>
            <div id="modal-body" class="modal-body">

                <?php // メッセージ領域 ?>
                <span id="modal_message" class="modal_error"></span>

                <?php echo Form::open(array('action' => '#', 'method' => 'post',  'class' => 'form-horizontal small', 'id' => 'country_edit_form')); ?>

                    <?php // 対象年月 ?>
                    <div class="form-group">
                        <?php echo $this->fieldset_edit->field(\Bms\Model_CountryCode::TARGET_MONTH_PERIOD)->label_text(['class' => 'col-xs-4 control-label']); ?>
                        <div class="col-xs-6" id="month_area"></div>
                    </div>>

                <?php echo Form::close(); ?>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal" id="wbs_edit_cancel"><?php echo __('close')?></button>
                <button type="button" class="btn btn-default" data-save="modal" id="wbs_edit_save"><?php echo __('save')?></button>
            </div>
        </div>
    </div>
</div>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • m6u

    2017/09/27 10:53

    View側から\Bms\Model_CountryCode::WBS_CODEを参照できていない可能性は考えられませんか? ViewFormパッケージのFieldSet->Field->label_text()へのパラメータの渡し方は問題なさそうなので。

    キャンセル

  • permanent

    2017/09/27 10:59

    View側で\Bms\Model_CountryCode::WBS_CODEをダンプしてみましたら、「'wbs_code'」と表示されました。これは参照できていると思っていいのでしょうか?

    キャンセル

  • m6u

    2017/09/27 11:10

    出来てますね、うーんなんだろう。fieldset->label_text()が正しくて、fieldset->fieldの時点でフォーム個要素を指しているから、fieldset->field->label_text()ってやるとフォーム個要素にテキスト入力フォームを追加するような流れになっておかしいような気もします。

    キャンセル

回答 2

check解決した方法

+1

viewの$this->fieldset_editを$this->fieldsetに修正したところ、エラーなく表示されました。
フレームワークの仕様がよくわかってませんが、とりあえずエラーは出ないので解決済みにします。

回答してくださった方、ありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

FuelPHPバージョンは何をお使いでしょうか。

1.6/1.7を確認したところ、Fieldsetfield()メソッドは nameが見つからなかった場合falseを返します。
(公式のドキュメントには書かれていないので、ソースを見たほうがいいです)


エラーはviewの
<?php echo $this->fieldset_edit->field(\Bms\Model_CountryCode::WBS_CODE)->label_text(['class' => 'col-xs-4 control-label']); ?>

載せてあるコード中に該当の記述が見つかりませんが、張っているコードはあっていますか?
エラーメッセージにあるlabel_text関数の呼び出しも見当たりませんでした。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/27 16:21

    すいません、指摘の箇所がコードから抜けていました。
    FuelPHPバージョンはよくわからないです。

    解決できなかったので、フレームワークではなくHTMLのタグを地下書きして対応しました。

    キャンセル

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

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

関連した質問

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

  • PHP

    19249questions

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

  • FuelPHP

    509questions

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