web-dev-qa-db-ja.com

MVCでJInputを使用する場所

MVCデザインパターンのJInputからデータを取得する場所に興味があります。たとえば、モデルクラスメソッドのクエリで使用するJInput値が必要な状況で、そこにJInput値を取得するか、ビューから渡すか、またはそれは重要ですか?

6
doovers

適切なMVC構造では、コントローラーshouldがリクエストデータ(この場合はJInput)とインターフェイスし、コントローラー内でインスタンス化されたときに依存関係がビューとモデルに注入されます。

現在のCMS構造では、MVC構造の3つの部分すべてがリクエストデータとインターフェイスしていることがよくあります。モデルでは、これは通常populateState()メソッドで行われ、ビューは実際のクラスよりも多くの場合、ロードしているレイアウトファイルにあります。

11
Michael

適切な場所で検索する必要があると私は強く信じています。

つまり、常にJInputを使用する必要があります。そうしないと、データが重複し、破壊される可能性があります [〜#〜] dry [〜#〜] 原則。

viewクラスは、viewのテンプレート(/tmplファイル)またはlayoutsからのmodelmodelに値を挿入しません。結局のところ、viewは、データの操作やユーザーアクションの処理ではなく、データとUIの表示に関するものです。

2
Craig

JInputはそのような機能を提供していません。したがって、$ _ POSTを使用する必要がある場合があります。

入力を配列の形式にすることができる場合(そしてJInput :: getArray()を使用)

または

jsonでエンコードされたオブジェクト(json_decode(JInput :: getString())を使用)

http://developer.joomla.org/manual/chap-Joomla_Platform_Manual-Input.html

http://docs.joomla.org/Retrieving_request_data_using_JInput

1
kumarramalingam

通常、コントローラーでJInputを使用してリクエストをルーティングし、レジストリオブジェクトを介してリクエストをモデルに渡します。

理想的には、コントローラーでDIを簡単にするために、ルーターロジックからコントローラーにリクエストデータを渡すことになりますが、少なくともこの方法で、リクエストの依存関係がモデルに注入され、アクセスする必要がなくなります。 JInputでテストします。

モデルにデータを取得したら、それを使用してモデルの状態を設定できます。次に、コントローラーはそのモデルをビューに挿入します。ビューのデータ要求に対応するために必要なすべてのデータがそのプロパティに既に読み込まれています。

1
Joomsavvy

すでに回答しましたが、私の視点で説明していきます。

Joomla!本当に素晴らしい、柔軟なMVC実装です。

ViewModelからのデータを入力する問題についてユーザーは$ _GETを介してデータを送信しました。これが私のやり方です。

最初に述べておきたいのは、一般的なモデル、ビュー、コントローラーの他に、Joomla!で広く使用されているファイルの別のカテゴリーがあり、それらはミニコントローラーです。うん、あなたはそれを正しく読みました。

これらは、ビューフォルダー内に直接あるファイルです。

それらのいくつかを以下に示します。

view.html.php
view.raw.php
view.pdf.php

さまざまなタイプの出力を生成する目的に役立つだけでなく、コントローラーも(ある程度)機能します。

したがって、あなたのようなケースでは、モデルからデータを取得するためだけにコントローラを含める必要はありません。必要なのは、jinputを使用して送信されたデータをサニタイズし、データをオブジェクトまたは配列または単純な変数としてモデルに渡すことだけです。

以下に例を示します。

view.html.php
<?php
//-- No direct access
defined('_JEXEC') || die('=;)');

class compoViewDashboard extends JViewLegacy {
    public function display($tpl = null) {
        if (JRequest::getVar('layout') == 'somelayout') {
            $jinput = JFactory::getApplication()->input;
            $data = $jinput->post->get('xyz', 'null', 'INT');

            /* If you are calling method from other(different) model you can use the following one line else you can skip it. */
            $this->setModel(JModelLegacy::getInstance('syllabus', 'compoModel'));
            $model = $this->getModel('syllabus');
            $this->courses= $model->getcourses($data);
        }
        parent::display($tpl);
    }
}

それでおしまい。

免責事項:-これは私自身の実装であり、完全な方法ではない可能性があることを忘れないでください。したがって、本番環境で私のコードを使用する前に、これをプロから承認してください。

注:-JRequestは非推奨になっていますが、Joomlaのとおりです。コアチームも、コア全体で使用しています。

1