如何通过资源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
相关产品推荐
相关产品推荐

