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

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

ただいまの
回答率

90.53%

  • PHP

    23533questions

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

FuelPHP veiwファイルがなぜか複数込んでしまいormでクエリが重複して発行されてしまう。

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 257

amaguri

score 209

viewファイルにてviewmodel.phpのViewModelを継承しています。
このindex.phpファイルがなぜか複数回読み込んでしまいormで発行したクエリが重複してしまっているのですが
原因がわからず困っています。
クエリの重複確認は
code Profilerにて確認済みです。
他のファイルでも同様なことが起きているのでいます。

コントローラー

    public function action_index()
    {
        parent::$_view->set('content', ViewModel::forge('admin/member/index')->set("self_admin",self::$_admin));
        parent::$_view->set('title', 'タイトル | '.'サイト名');
        return parent::$_view;
    }

モデル

viewmodel.php
abstract class ViewModel
{
    /**
     * Factory for fetching the ViewModel
     *
     * @param   string  ViewModel classname without View_ prefix or full classname
     * @param   string  Method to execute
     * @return  ViewModel
     */
    public static function forge($viewmodel, $method = 'view', $auto_filter = null, $view = null)
    {
        // if no custom view is given, make it equal to the viewmodel name
        is_null($view) and $view = $viewmodel;

        // strip any extensions from the view name to determine the viewmodel to load
        $viewmodel = \Inflector::words_to_upper(str_replace(
            array('/', DS),
            '_',
            strpos($viewmodel, '.') === false ? $viewmodel : substr($viewmodel, 0, -strlen(strrchr($viewmodel, '.')))
        ));

        // determine the viewmodel namespace from the current request context
        $namespace = \Request::active() ? ucfirst(\Request::active()->module) : '';

        // list of possible viewmodel classnames, start with the namespaced one
        $classes = array($namespace.'\\View_'.$viewmodel);

        // add the global version if needed
        empty($namespace) or $classes[] = 'View_'.$viewmodel;

        /**
         * Add non View_ prefixed classnames to the list, for BC reasons
         *
         * @deprecated 1.6
         */
        $classes[] = $namespace.'\\'.$viewmodel;

        // and add the global version of that if needed
        empty($namespace) or $classes[] = $viewmodel;

        // check if we can find one
        foreach ($classes as $class)
        {
            if (class_exists($class))
            {
                return new $class($method, $auto_filter, $view);
            }
        }

        throw new \OutOfBoundsException('ViewModel "'.reset($classes).'" could not be found.');
    }

    /**
     * @var  string  method to execute when rendering
     */
    protected $_method;

    /**
     * @var  string|View  view name, after instantiation a View object
     */
    protected $_view;

    /**
     * @var  bool  whether or not to use auto filtering
     */
    protected $_auto_filter;

    /**
     * @var  Request  active request during ViewModel creation for proper context
     */
    protected $_active_request;

    protected function __construct($method, $auto_filter = null, $view = null)
    {
        $this->_auto_filter = $auto_filter;
        $this->_view === null and $this->_view = $view;
        class_exists('Request', false) and $this->_active_request = \Request::active();

        if (empty($this->_view))
        {
            // Take the class name and guess the view name
            $class = get_class($this);
            $this->_view = strtolower(str_replace('_', DS, preg_replace('#^([a-z0-9_]*\\\\)?(View_)?#i', '', $class)));
        }

        $this->set_view();

        $this->_method = $method;
    }

    /**
     * Returns the View object associated with this Viewmodel
     *
     * @return  View
     */
    public function get_view()
    {
        return $this->_view;
    }

    /**
     * Construct the View object
     */
    protected function set_view()
    {
        $this->_view instanceOf View or $this->_view = \View::forge($this->_view);
    }

    /**
     * Returns the active request object.
     *
     * @return  Request
     */
    protected function request()
    {
        return $this->_active_request;
    }

    /**
     * Executed before the view method
     */
    public function before() {}

    /**
     * The default view method
     * Should set all expected variables upon itself
     */
    public function view() {}

    /**
     * Executed after the view method
     */
    public function after() {}

    /**
     * Fetches an existing value from the template
     *
     * @return  mixed
     */
    public function & __get($name)
    {
        return $this->get($name);
    }

    /**
     * Gets a variable from the template
     *
     * @param  string
     */
    public function & get($key = null, $default = null)
    {
        if (is_null($default) and func_num_args() === 1)
        {
            return $this->_view->get($key);
        }
        return $this->_view->get($key, $default);
    }

    /**
     * Sets and sanitizes a variable on the template
     *
     * @param  string
     * @param  mixed
     */
    public function __set($key, $value)
    {
        return $this->set($key, $value);
    }

    /**
     * Sets a variable on the template
     *
     * @param  string
     * @param  mixed
     * @param  bool|null
     */
    public function set($key, $value = null, $filter = null)
    {
        is_null($filter) and $filter = $this->_auto_filter;
        $this->_view->set($key, $value, $filter);

        return $this;
    }

    /**
     * Magic method, determines if a variable is set.
     *
     *     isset($view->foo);
     *
     * @param   string  variable name
     * @return  boolean
     */
    public function __isset($key)
    {
        return isset($this->_view->$key);
    }

    /**
     * Assigns a value by reference. The benefit of binding is that values can
     * be altered without re-setting them. It is also possible to bind variables
     * before they have values. Assigned values will be available as a
     * variable within the view file:
     *
     *     $this->bind('ref', $bar);
     *
     * @param   string   variable name
     * @param   mixed    referenced variable
     * @param   bool     Whether to filter the var on output
     * @return  $this
     */
    public function bind($key, &$value, $filter = null)
    {
        $this->_view->bind($key, $value, $filter);

        return $this;
    }

    /**
     * Change auto filter setting
     *
     * @param   null|bool  change setting (bool) or get the current setting (null)
     * @return  void|bool  returns current setting or nothing when it is changed
     */
    public function auto_filter($setting = null)
    {
        if (func_num_args() == 0)
        {
            return $this->_view->auto_filter();
        }

        return $this->_view->auto_filter($setting);
    }


    /**
     * Add variables through method and after() and create template as a string
     */
    public function render()
    {
        if (class_exists('Request', false))
        {
            $current_request = Request::active();
            Request::active($this->_active_request);
        }

        $this->before();
        $this->{$this->_method}();
        $this->after();

        $return = $this->_view->render();

        if (class_exists('Request', false))
        {
            Request::active($current_request);
        }

        return $return;
    }

    /**
     * Auto-render on toString
     */
    public function __toString()
    {
        try
        {
            return $this->render();
        }
        catch (\Exception $e)
        {
            \Error::exception_handler($e);

            return '';
        }
    }
}

viewファイル

<?php
class View_Admin_Member_Index extends ViewModel
{
    /**
     * Prepare the view data, keeping this in here helps clean up
     * the controller.
     *
     * @return void
     */
    public function view()
    {
        $orm = Model_Member::getSearchOrm($this->search_cond);
        $orm->order_by("id","desc");
        $orm->related("house");
            // ページャオプション
            $option = Model_Member::getSearchOption($this->search_cond);

            // pager
            $disp = 30;

            $total = $orm->count();
            $pager = new Pager($total, '/admin/member',$disp,$option);
            $orm->rows_limit($disp)->rows_offset($pager->getOffset());

            // 問い合わせルート
            $channel_list = Model_ClubMember::getSelectChannelList("----");

            $this->clubmembers = $orm->get();
            $this->pager = $pager;
            $this->channel_list = $channel_list

    }
}


追記
読みこみ回数は

        if (!isset($_SESSION['count'])) {
            $_SESSION['count'] = 1;
        } else {
            $_SESSION['count']++;
        }
        var_dump($_SESSION['count']."回読み込み");


にて
数えました

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正の依頼

  • fagai

    2017/07/03 17:10 編集

    それだけではクエリが重複してしまっているか確認できないと思うのですが。。。対象のviewメソッドの中で Log::debug("view method loaded."); などを書いてログに3回出力されますか?

    キャンセル

  • amaguri

    2017/07/03 17:41

    記載漏れですみません、fuelphpのcode Profilerにてクエリが重複されているには確認済みです。

    キャンセル

  • amaguri

    2017/07/03 17:42

    同じクエリが3回発行されており、ページ読み込みの回数をカウントしたら3回でした。。

    キャンセル

まだ回答がついていません

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

  • PHP

    23533questions

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

  • トップ
  • PHPに関する質問
  • FuelPHP veiwファイルがなぜか複数込んでしまいormでクエリが重複して発行されてしまう。