ModX の不具合に遭遇しましたが、解決するのに長い時間がかかりました。ModX はハッシュを使用して多くのキャッシングを行い、明らかに、複数のスニペットに分割された 1 つのページ内から複数の接続が行われると、この不安定な動作が見られます。これは非常に望ましくない動作である可能性が高く、簡単に解決できますが、そうしないとひどい頭痛の種になります。
症状の 1 つは、$modx->getObject($classname, $id)(多くの場合) null を返すことです。
解決策は非常に簡単です。単一の db インスタンスを持つ静的クラスを使用するか、 を使用する$modx->setPlaceholder($instance, $tag);か、組み合わせて使用します。
私の解決策は次のとおりです。
class dt__xpdo {
private function __construct() {}
public function __destruct() {
$this->close();
}
static public function db($modx = null) {
if ($modx->getPlaceholder('dt_xpdo') == '') {
$dt_user = 'xxxxxxxxx';
$dt_pw = 'xxxxxxxxx';
$dt_host = 'localhost';
$dt_dbname = 'xxxxxxxxx';
$dt_port = '3306';
$dt_dsn = "mysql:host=$dt_host;dbname=$dt_dbname;port=$dt_port;charset=utf8";
$dt_xpdo = new xPDO($dt_dsn, $dt_user, $dt_pw);
$dt_xpdo->setPackage('mymodel', MODX_CORE_PATH.'components/mymodel/'.'model/', '');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'mymodel.config.php');
//$modx->log(modX::LOG_LEVEL_DEBUG, 'Could not addPackage for mymodel!');
$modx->setPlaceholder('dt_xpdo', $dt_xpdo);
}
return $modx->getPlaceholder('dt_xpdo');
}
}
これで、コードで次を使用できます。
require_once 'above.php';
そして次のようなものを使用します
$xpdo = dt__xpdo::db($modx);
そして完璧に続けてください!