繁体   English   中英

使用MODx Wayfinder按模板变量值过滤资源

[英]Filter resources by template variable value with MODx Wayfinder

我有一个使用Wayfinder来显示Articles博客中最新的3个条目的网站。 现在,我只考虑标记为Highlights博客条目。

我最初的Wayfinder呼叫看起来像这样,没什么特别的:

[[!Wayfinder? &startId=`296` &level=`1`
    &outerTpl=`emptyTpl`
    &innerTpl=``
    &rowTpl=`thumbnails_formatter`
    &ignoreHidden=`1`
    &sortBy=`menuindex`
    &sortOrder=`DESC`
    &limit=`3`
    &cacheResults=`0`
]]

由于Articles标签是通过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保持一致,但是也欢迎其他解决方案。

你可以只用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%"}]`

]]

看看一些配置文件[core / components / wayfinder / configs]-我还没有尝试过,但是好像您可以直接在config中运行select查询并将tmplvarid数组传递给$ where变量一样。

经过一番尝试,我找到了一个解决方案:在引用ID时,我需要包括类名(而不是表名):

&where=`["modResource.id IN (SELECT contentid FROM modx_site_tmplvar_contentvalues WHERE tmplvarid=17 AND value LIKE '%Highlights%')"]`

一项小测试表明,即使是简单的

&where=`["id = 123"]`

没有modResource.就无法工作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将无法与此程序一起使用。 尽管如此,我还是更喜欢以格式良好的形式发布查询。

我使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM