我有一个网站使用Wayfinder来显示文章博客中的最新3个条目。现在,我想只考虑那些标记为Highlights
的博客条目。
我原来的Wayfinder电话看起来像这样,没什么了不起的:
[[!Wayfinder? &startId=`296` &level=`1`
&outerTpl=`emptyTpl`
&innerTpl=``
&rowTpl=`thumbnails_formatter`
&ignoreHidden=`1`
&sortBy=`menuindex`
&sortOrder=`DESC`
&limit=`3`
&cacheResults=`0`
]]
由于文章标签是通过articlestags
电视进行管理的,我认为&where
可以做到这一点,但还没有运气:
&where=`[{"articlestags:LIKE":"%Highlights%"}]`
不会产生任何结果。作为一个完整性检查,我尝试[{"pagetitle:LIKE":"%something%"}]
,这是有效的。显然,问题是articlestags
不是modx_site_content
的列,但我不确定如何放置子查询。
SELECT contentid
FROM modx_site_tmplvar_contentvalues
WHERE tmplvarid=17
AND value LIKE '%Highlights%'
在sql提示符下给我正确的ID,但是将它添加到这样的Wayfinder调用会再次给出一个空结果:
&where=`["id IN (SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE tmplvarid=17 AND value LIKE '%Highlights%')"]`
关于如何实现这一目标的任何想法?我希望与Wayfinder保持一致,但也欢迎其他解决方案。
答案 0 :(得分:3)
您可以使用pdomenu(pdoTools的一部分)代替Wayfinder
[[!PdoMenu?
&startId=`296`
&level=`1`
&outerTpl=`emptyTpl`
&innerTpl=``
&rowTpl=`thumbnails_formatter`
&ignoreHidden=`1`
&sortBy=`menuindex`
&sortOrder=`DESC`
&limit=`3`
&cacheResults=`0`
&includeTVs=`articlestags`
&where=`[{"TVarticlestags.value:LIKE":"%filter%"}]`
]]
答案 1 :(得分:0)
查看一些配置文件[core / components / wayfinder / configs] - 我还没有尝试过,但看起来好像你可以在config&amp ;;中运行你的选择查询将tmplvarid数组传递给$ where变量。
答案 2 :(得分:0)
一点点的游戏让我找到了一个解决方案:在引用ID时我需要包含类名(而不是表名):
&where=`["modResource.id IN (SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE tmplvarid=17 AND value LIKE '%Highlights%')"]`
一个小小的测试表明即使是简单的
&where=`["id = 123"]`
如果没有modResource.
,就无效。
查看wayfinder.class.php
显示以下行,这似乎是“罪魁祸首”:
$c->select($this->modx->getSelectColumns('modResource','modResource'));
此方法将所选列别名 - 相关代码位于xpdoobject.class.php
中。第一个参数是类名,第二个是表别名。结果是查询选择id AS modResource.id
,依此类推。
编辑:我的查询的最终版本:
&where=`["modResource.id IN (
SELECT val.contentid
FROM modx_site_tmplvars AS tv
JOIN modx_site_tmplvar_contentvalues AS val
ON tv.id = val.tmplvarid
WHERE tv.name = 'articlestags' AND (
val.value = 'Highlights'
OR val.value LIKE 'Highlights,%'
OR val.value LIKE '%,Highlights'
OR val.value LIKE '%,Highlights,%'
)
)"]`
我不认为这个查询特别有效(我似乎记得OR条件不好)。此外,如果没有删除换行符,MODx将无法使用此版本。不过,我更喜欢以格式良好的形式发布查询。
答案 3 :(得分:0)
我使用snippet作为wayfinder的includeDocs的参数,在我的情况下,它很有用,因为我需要菜单中的不同资源,具体取决于用户浏览器(移动或桌面)
[[!Wayfinder?
&startId=`4`
&level=`1`
&includeDocs=`[[!menu_docs?&startId=`4`]]`
&outerTpl=`home_menu_outer`
&rowTpl=`menu_row`
]]
然后是menu_docs代码段
<?php
if (empty ($startId))
return;
if (!isMobileDevice())
return;
$query = $modx->newQuery('modResource');
$query->innerJoin('modTemplateVarResource','TemplateVarResources');
$query->where(array(
'TemplateVarResources.tmplvarid' => 3,
'TemplateVarResources.value:LIKE' => 'yes',
'modResource.parent' => $startId,
'modResource.deleted' => 0,
'modResource.published' => 1,
'modResource.hidemenu' => 0
));
$resources = $modx->getCollection('modResource', $query);
$ouput = array();
foreach ($resources as $resource)
$output[] = $resource->get('id');
return implode (',', $output);