11

複数のテーブルを使用するコンポーネント (フロント エンド) を作成しようとしています。質問に部分的に答えている投稿を1つまたは2つ見つけましたが、実際には答えていません。ポイントは、やり方を知っている人にとっては常に単純明快に思えますが、実際に説明されることはありません (または、適切な投稿を見逃していました)。

私のコンポーネントでは、ユーザーは 2 つのテーブルに格納する必要がある 1 つのビューにデータを入力します。標準の Joomla User テーブル、つまり # __users Joomla に含まれていないデータを格納するための追加のテーブル、つまり # __users_complements

初心者なので間違っているかもしれませんが、joomlaの標準機能ではフォームの結果を一つのテーブルにしか保存できないことがわかりました。私の場合、モデルの標準関数 com_component / model / my_model.php をオーバーライドする必要があると思います。

1) どの関数をオーバーライドする必要があるのか​​ よくわからないため、混乱しています: save ()? お店 ()?他の?

2) save() 関数をオーバーライドするとします。すべてのコードを書き直してデータを保存する (データ配列を展開し、すべての更新クエリを作成する) か、2 つの標準テーブル オブジェクトを作成する必要があります。

この場合、(2 つのオブジェクト) データ配列全体を毎回親関数に送信するのは奇妙に思えます。なぜなら、一部はテーブル 1 用であり、他の部分はテーブル 2 用であることがわかっているからです。ドンの前に分割できるはずです。私じゃない?

3) フォームからデータを取得し、モデルの保存機能を呼び出すときに、2 つのモデルを作成し、それらのモデルをコントローラーから管理する必要がありますか?

複数のテーブルでこの保存を行う方法を明確にするのを手伝ってもらえますか? コード付きの例は非常に高く評価されます。ありがとうございました

4

2 に答える 2

20

やっとできました。私はこれに何時間も費やし、多くの人が答えを探していることに気づきました。

標準の MVC 構造を使用して、コンポーネントを作成する方法を知っていると思います。

  1. コンポーネントのエントリ ポイント
  2. コンポーネントコントローラー
  3. 最終的にコンポーネント ルーター
  4. コンポーネント ビュー
  5. コンポーネントモデル
  6. コンポーネントコントローラー

モデルcomponents\my_component\models\my_model.phpで、独自の保存関数を作成します

public function save($data)
{
    // Initialise variables.
    $userId = (!empty($data['id'])) ? $data['id'] : (int)$this->getState('user.id');
    $user = JFactory::getUser();

    $table_one = $this->getTable('TableOne', 'MyComponentTable', array());
    $table_two = $this->getTable('TableTwo', 'MyComponentTable', array());

    // Bind the data.
    if (!$table_one->bind($data))
    {
        $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError()));
        return false;
    }

    if (!$table_two->bind($data))
    {
        $this->setError(JText::sprintf('USERS PROFILE BIND FAILED', $user->getError()));
        return false;
    }

    // Store the data.
    if (!$table_one->save($data))
    {
        $this->setError($user->getError());
        return false;
    }

    if (!$table_two->save($data))
    {
        $this->setError($user->getError());
        return false;
    }

    return $user->id;
}

もちろん、save 関数で呼び出される getTable 関数が必要です。

public function getTable($type = 'TableOne', $prefix = 'MyComponentTable', $config = array())
{
    // call the administrator\components\com_mycomponent\tables\__tablename__.php
    $this->addTablePath(JPATH_COMPONENT_ADMINISTRATOR . '/tables');
    return JTable::getInstance($type, $prefix, $config);
}

そしてそれはうまくいきます!とても簡単!もちろん、私の質問で述べたように、$data 全体が親の save() 関数に送信され、table_one または table_two に不要なデータが含まれます。標準の joomla 構造でこのように動作します (コード内でのハックや直接クエリはありません)。

それが役に立てば幸い。

于 2013-02-09T16:38:13.370 に答える
2

次の方法が MVC 構造を少し混乱させることに異議を唱える人がいるかもしれませんが、私にとってはそれが最も簡単であることがわかりました。

通常、テーブルの 1 つに適合するモデルがあります。ユーザーテーブルとコンポーネントのテーブルにデータをプッシュする例では、コンポーネントのテーブルのモデルに次を追加します。

public function save($data) {
    if (!parent::save($data)) {
        return false;
    }

    // add necessary code to save to the users table, since there isn't a standard way to do this that I'm aware of

    // sometimes I will grab another model even
    require_once(JPATH_BASE . '/administrator/components/com_users/models/user.php');
    $other_model = $this->getInstance('user', 'UsersModel');
    $other_model->save($data);

    return true;
}

この関数の最初の部分では、通常どおりコンポーネント テーブルにデータを保存する必要があります。ただし、必要なものをコンポーネントの残りの部分に追加して、好きなことを実現できます。

モデルをチェーンするためのより良い方法があることはほぼ保証します (そして、Joomla プラットフォーム コアで起こっているいくつかの変更が将来により良い方法につながるのを見てきました) が、今のところはこれでうまくいくはずです。

さらに、プロンプト 3 では、テーブルを 1 つだけ保存する必要がある場合と、両方を保存する必要がある場合に、コントローラーで処理します。保存機能は、パーツがロードされていないときでも安全に実行できることがわかったので、通常はそのまま実行します。

于 2013-02-06T21:23:39.183 に答える