web-dev-qa-db-ja.com

単一の管理ビューに複数のテーブルとフォームをロードする

データのある2つのテーブルがあり、両方のテーブルからデータを取得して1つのビューに表示する必要があります。

両方のテーブルのフィールドを保持する1つのXMLファイルがあります。

モデルの関数「getForm」は、XMLからすべてのフィールドをロードし、フォームにHTML要素をロードできます。

問題は、関数 'getItem'が1つのテーブルからのみデータを取得でき、他のテーブルからは取得できないことです。関数「getTable」は最初のテーブルに関連付けられているため、最初のテーブルからのデータのみを取得すると思います。

GetItem内の2番目のテーブルからデータをロードするにはどうすればよいですか?

2
Malaiselvan

モデルクラスで、次のようにgetItemメソッドをオーバーライドします。

public function getItem() {
    $item = parent::getItem();

    $item->second_table = $this->getSecondTable($item->second_table_foreign_key);
    $item->third_table = $this->getThirdTable($item->third_table_foreign_key);
    return $item;
}

ここで重要なのは、特に何らかの種類のキャッシュが有効になっている場合は、バックグラウンドで多くのことが行われているため、親クラスgetItemを呼び出すことです。これで、ビューがない場合でも、セカンダリテーブルのモデルとテーブルクラスを設定する必要があります。このようにして、ヘルパーメソッドから関連データを簡単にロードできます。

private function getSecondTable($id) {
    $model = JModelLegacy::getInstance('SecondTable','MyComponentModel');
    $table = $model->getTable('SecondTable', 'MyComponentTable');
    return $table->load($id);
}

フォームのxml定義フィールド名が2番目と3番目のテーブルの実際の列名と一致していることが重要です。最後に、saveイベントの逆を行う必要があります。ここでも、モデルのsaveメソッドをオーバーロードします。

public function save($data) {
    $this->saveSecondTableData($data);
    $this->saveThirdTableData($data);
    parent::save($data);
}

ヘルパーメソッドで再度テーブルクラスを使用して保存できます。

private function saveSecondTableData($data) {
    $model = ModelLegacy::getInstance('SecondTable','MyComponentModel');
    $table = $model->getTable('SecondTable', 'MyComponentTable');
    $table->bind($data);
    $table->store();
    parent::save($data);
}

さて、これは非常に骨のない例であり、私が残してきたデューデリジェンスはたくさんあります。エラーチェック、サーバーサイドフォーム検証、テーブルバインド、イベントのロードと保存、アラートの表示など。

また、これは、DBに保存される補助テーブルデータの変更を保存することを想定しています。必要なのがデータを表示することだけであれば、getListQuery()モデルメソッドの左結合はすぐにソートされます。

ただし、複数のテーブルを単一のビューに接続するための基本的な概念はそこにあります。

4
Brian Bolli