2

我曾经花了一个多小时对xPDO构造函数进行逆向工程,以弄清楚如何在实例化时加载基础包。

不幸的是,我丢失了那一小段代码!我只剩下这个了。

$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= 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, ...")
);

这是文档的链接,您可以在其中找到有关选项数组的更多详细信息:http ://rtfm.modx.com/xpdo/2.x/getting-started/fundamentals/xpdo,-the-class/the-xpdo-构造函数

编辑

字符串的格式如下:

“包名:绝对路径;前缀”

前缀是可选的。我已经用这个格式字符串更新了上面的代码。

于 2014-05-27T09:19:18.857 回答
1

虽然我不完全确定你在问什么,但我怀疑你在问是否有一些已知的方法可以为具有相同路径的包传递一组包名。假设这是正确的,我有以下可能的解决方案(如果不是,那么请按照scragar的要求澄清您的要求):

在类 xPDO 和方法 addPackage() 中查看@文件 xpdo.class.php 我看到它专门验证包名称是一个字符串,如果不是,则会产生错误。因此,这个方法 addPackage() 肯定不允许将数组传递给它。

但是,我怀疑您可能还记得,如果您在包含多个 xPDO 类 & 映射文件 & 一个模式的包/额外目录上使用 addPackage() ......那么表示的所有数据库表都将能够被实例化 &用于执行 CRUD 操作。

例如,我有两个包(来自单独的附加组件),它们具有以下路径 core/components/[packageName]/ (括号中的内容是特定包的实际名称)。此外,模型文件位于 core/components/[packageName]/model/[packageName]/ 以及子目录 /mysql。在这两种情况下,当我添加包 [packageName] 时,所有类都可以实例化,因为我没有包含/需要任何文件,所以 addPackage() 似乎包含它们,因此使它们可用作 xPDO 对象使用 modx 方法 newQuery()

(所以在代码中就是:

$modx->newQuery(nameOfxPDOClassToBeInstantiated);

)

(注意:我的两个包的所有必要类都是使用 Bob Ray在此处提供的非常方便的工具从自定义 DB 表生成的,并由他在此处的简单教程中进行了解释)。

希望有帮助。

作为事后的想法,这是关于 addPackage 的 xPDO 文档: http ://rtfm.modx.com/xpdo/2.x/class-reference/xpdo/xpdo.addpackage 这里是关于使用对象的文档... http:// /rtfm.modx.com/xpdo/2.x/getting-started/using-your-xpdo-model/retrieving-objects

于 2014-05-25T08:43:49.667 回答