web-dev-qa-db-ja.com

テーブルプレフィックスを上書きするJoomlaプラグイン

概要:同じデータベース内にデータベーステーブルのさまざまなコピーがあるが、テーブルプレフィックスが異なる単一のJoomla Webサイトがあります。

どのユーザーがサイトにアクセスしているかに応じて、関連するテーブルを表示するために、どのjoomlaテーブルプレフィックスを使用するかを変更する必要があります。

これはサイト全体でなければなりません。

Problem:コアコードハックを使用すると、必要に応じてプレフィックスを変更できますが、プラグインとしてこれを使用します。

プラグインを使用すると、$ db-> getPrefix()を使用してプレフィックスを取得できます。また、$ db = JDatabaseDriver :: getInstance($ option)を使用して、接続の即時インスタンスを設定できます。しかし、これはサイト全体ではなく、標準の$ db = JFactory :: getDbo()によって上書きされます。

したがって、実行時にテーブルプレフィックスのすべてのインスタンスを置き換えるシステムプラグインが必要です。

何か案は?

4
Shaun

プラグイン内からこれを行う方法はまったくありません。これは、Joomlaがプラグインをロードする前にデータベースへのアクセスを開始するためです。

これを行う唯一の方法は、ロジックが必要なconfiguration.phpファイル内からです(getTablePrefixという関数を作成する必要があります)。 Joomlaがこのファイルに書き込めないことを確認する必要があります。そうすると、変更が破棄されます。

defines.phpファイルを使用してこれを行うことを考えましたが、構成がロードされる前にロードされるため、そこで実行することはできません。

ところで、すばらしい質問ですが、ユーザーごとに異なるテーブルセットが必要な理由にも興味があります。おそらく、最善の解決策は、ロジック全体を再考することでしょう。

1
itoctopus

私がそれを行う唯一の方法は、例えばあなたのカスタム_class JDatabaseDriverCustom extends JDatabaseDriverMySql_を追加することだと思います、そしてそこにあなたはいくつかのオプションで行くことができるでしょう:

  • ドライバーの内部にユーザー依存のロジックを書き込みます。
  • 別の場所で記述する関数を呼び出す。

とにかく、考えてみてください。ユーザーに依存するサイトが本当に必要ですか、それともIPなどのJoomlaに関連しないものに依存する必要がありますか。このようにして、設定ファイル内に__constructor()を記述し、そこにロジックを配置して_$this->db_prefix_を変更できます。

0
Alexandr