0

我正在开发一个用 ModX 创建的网站。我需要知道在创建任何资源时执行 php 代码的方式,以及编辑与创建的资源关联的模板变量。

4

2 回答 2

1

okyanet 的回答是正确的,但我为那些不熟悉 MODX 的人添加了详细信息。

创建一个插件,并将其配置为在两个系统事件“onBeforeDocFormSave”和“onDocFormSave”上执行。这两个事件在资源被保存之前和之后被触发。保存资源时,$mode变量可用于您的插件,如果它是新资源,它的值是modSystemEvent::MODE_NEW,如果更新,它的值是modSystemEvent:MODE_UPD

我写了一个要点,其中包括带有示例的完整代码:

https://gist.github.com/2768300

此示例向您展示如何通过 switch 语句定位任一事件,以及如何进一步定位操作的“新”或“更新”状态。对于拦截和更改资源字段,使用onBeforeDocFormSave事件非常容易,因为您可以简单地使用$resource->set('yourFieldname')更改任何资源字段名。不需要$resource->save(),因为这会在此事件之后自动发生。

由于处理电视的方式,使用 onBeforeDocFormSave 事件保存电视显然要困难得多,因此该示例显示了如何使用系统事件“onDocFormSave”更新电视。同样,不需要$resource->save(),因为当您在电视上调用“setValue”时会立即保存电视。

可以使插件仅需要其中一个系统事件即可运行,但是由于使用上述两种状态都有优势,并且为了帮助解释,我都使用了这两种状态。

于 2012-05-28T12:50:22.877 回答
1

您可以使用插件来执行此操作,设置为在OnDocFormSave事件上运行。此事件有一个mode属性,当正在保存的文档刚刚创建时,该属性将设置为new - 您可以对此进行简单检查,以防止每次保存文档时都运行插件。

要为当前资源设置 TV 值,请执行以下操作:

// get the required TV object by name (or id)
$tv = $modx->getObject('modTemplateVar',array('name'=>'tvName'));

// set the new value and save it
$tv->setValue($modx->resource->get('id'), $newValue);
$tv->save();
于 2012-01-04T12:05:31.173 回答