2

インスタンス化時に基本パッケージをロードする方法を理解するために、 xPDOコンストラクターのリバース エンジニアリングに 1 時間以上を費やしたことがあります。

残念ながら、コードの小さなスニペットを失ってしまいました! そして、私はこれを残しています。

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    $this->config->item('dbprefix', XPDO)
);

// This is line I would like to pass to the constructor.
$this->database->addPackage('packageName', $this->config->item('core_path') . "components/package/model/", '_packagePrefix');

ドキュメントのどこにもこれが見つかりません。

編集 xPDO では、デフォルトでロードされないパッケージを具体的に追加する必要があります。デフォルトでは、xPDO はインスタンス化時にパッケージをロードしません。

ただし、xPDO のコンストラクターの分解にかなりの時間を費やしたことがあり、インスタンス化時にロードされるパッケージの配列を定義できるオプションのパラメーターがあることがわかりました。

私の問題は、これを行う方法を思い出せないことです。

4

2 に答える 2

1

あなたが何を求めているのか完全にはわかりませんが、同じパスを持つパッケージのパッケージ名の配列を渡す既知の方法があるかどうかを尋ねているのではないかと思います。これが正しいと仮定すると、次の可能な解決策があります(そうでない場合は、スクラガーが要求したように、あなたが求めていることを明確にしてください):

@クラスxPDOのxpdo.class.phpファイルとメソッドaddPackage()を見てみると、パッケージ名が文字列であることを具体的に検証し、そうでない場合はエラーが発生することがわかります。したがって、このメソッド addPackage() では、配列を渡すことはできません。

ただし、複数のxPDOクラスとマッピングファイルとスキーマを持つパッケージ/追加のディレクトリでaddPackage()を使用すると、表されるすべてのデータベーステーブルをインスタンス化できることを覚えていると思います& CRUD 操作を実行するために使用されます。

例として、core/components/[packageName]/ というパスを持つ 2 つのパッケージ (個別のエクストラから) があります (括弧内は特定のパッケージの実際の名前です)。さらに、モデル ファイルは、core/components/[packageName]/model/[packageName]/ とサブディレクトリ /mysql にあります。どちらの場合も、パッケージ [packageName] を追加すると、すべてのクラスをインスタンス化できます。ファイルを含めていない/要求していないため、addPackage() はそれらを含めているように見えるため、xPDO オブジェクトとして使用できるようになります。 modx メソッド newQuery() を使用する

(コードでは次のようになります:

$modx->newQuery(nameOfxPDOClassToBeInstantiated);

)

(注: 2 つのパッケージに必要なすべてのクラスは、Bob Ray が提供する非常に便利なツールを使用してカスタム DB テーブルから生成され、ここで簡単なチュートリアルで説明されています)。

それが役立つことを願っています。

後付けとして、 addPackageに関する xPDO のドキュメントは次のとおり です/rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/retriving-objects

于 2014-05-25T08:43:49.667 に答える
1

基本パッケージをロードして、適切なオプションを xPDO コンストラクターに渡すことができます。これはコンストラクターの定義です:

$xpdo= new xPDO($dsn, $username= '', $password= '', $options= array(), $driverOptions= null) 

options 配列はさまざまな構成をサポートしています。探しているのはxPDO::OPT_BASE_PACKAGESです。

xPDO::OPT_BASE_PACKAGES — インスタンス化時にロードされるパッケージ名/パス (コロンで区切られた) のコンマ区切り文字列。

基本的に、次の方法でコードを変更して、必要なことを行うことができます。

$this->database = new xPDO(
    "mysql:host=" . $this->config->item('hostname', XPDO) . 
    ";dbname="  . $this->config->item('database', XPDO), 
    $this->config->item('username', XPDO), 
    $this->config->item('password', XPDO), 
    array(xPDO::OPT_BASE_PACKAGES => "package1:path1;prefix, package2:path2, ...")
);

オプション配列の詳細を確認できるドキュメントへのリンクは次のとおりです。コンストラクタ

編集

文字列の形式は次のとおりです。

"package_name:absolute_path;prefix"

プレフィックスはオプションです。上記のコードをこのフォーマット文字列で更新しました。

于 2014-05-27T09:19:18.857 に答える