0

我有一个网站,它使用 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电视管理的,我认为 a&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 保持一致,但也欢迎其他解决方案。

4

4 回答 4

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%"}]`

]]
于 2014-08-09T13:15:02.157 回答
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 将无法与此一起使用。不过,我更喜欢以格式良好的形式发布查询。

于 2014-08-09T14:31:58.533 回答
0

查看一些配置文件 [core/components/wayfinder/configs] - 我没有尝试过,但看起来您可以直接在配置中运行选择查询并将 tmplvarid 数组传递给 $where 变量.

于 2014-08-09T12:40:56.637 回答
0

I used snippet as a parameter for the includeDocs of wayfinder, In my case it was useful because I was need different resources in menu depend on user browser (mobile or desktop)

[[!Wayfinder? 
    &startId=`4`
    &level=`1`
    &includeDocs=`[[!menu_docs?&startId=`4`]]`
    &outerTpl=`home_menu_outer`
    &rowTpl=`menu_row`
]] 

and then menu_docs snippet

<?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);
于 2015-08-03T06:38:44.850 回答