You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过资源ID程序化获取MODX资源的自定义TV及其对应值?

获取MODX资源的自定义TV及对应值

嘿,刚接触MODX就能写出获取资源对象的代码,已经很棒啦!要拿到这个资源的所有自定义TV和对应值,其实MODX已经给我们准备了很方便的方法,下面给你两种实用的方案:

方案一:快速获取所有TV值(推荐)

MODX的modResource对象自带了getTVValues()方法,能直接返回该资源所有关联TV的别名-值键值对数组,用起来超省心:

$resourceId = 1;
$resource = $modx->getObject('modResource', $resourceId);

// 一键获取所有TV值,数组键是TV的别名,值是对应内容
$tvValues = $resource->getTVValues();

// 把TV值合并到你的结果数组里
$array[] = [
    'id' => $resource->id,
    'pagetitle' => $resource->pagetitle,
    'alias' => $resource->alias,
    'tv_values' => $tvValues // 也可以直接把TV键值对展开到外层数组
];

这个方法会自动识别资源关联模板下的所有TV,不需要手动查询数据库,而且返回的结果直接可用,适合大多数场景。

方案二:获取TV的详细信息(如ID、标题等)

如果你不仅需要TV的值,还想拿到TV本身的元数据(比如TV的ID、后台显示标题、描述等),可以直接查询modTemplateVar和关联表:

$resourceId = 1;
$resource = $modx->getObject('modResource', $resourceId);

// 先拿到资源关联的模板ID
$templateId = $resource->get('template');

// 查询该模板下的所有自定义TV
$tvs = $modx->getCollection('modTemplateVar', [
    'template' => $templateId
]);

$tvDetails = [];
foreach ($tvs as $tv) {
    // 获取TV在当前资源上的值,第二个参数设为false可以跳过渲染(比如富文本TV返回原始代码)
    $tvValue = $tv->getValue($resourceId, false);
    
    $tvDetails[] = [
        'tv_id' => $tv->get('id'),
        'tv_name' => $tv->get('name'), // TV的别名
        'tv_caption' => $tv->get('caption'), // TV在后台的显示标题
        'value' => $tvValue
    ];
}

// 合并结果
$array[] = [
    'id' => $resource->id,
    'pagetitle' => $resource->pagetitle,
    'alias' => $resource->alias,
    'tv_details' => $tvDetails
];

小提示

  • 如果资源没有关联模板(template字段为0),那getTVValues()会返回空数组,记得检查资源的模板设置哦;
  • 如果你只想获取单个TV的值,可以用$resource->getTVValue('tv_alias'),直接传TV的别名就行。

内容的提问来源于stack exchange,提问作者dBdx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:41:42