使用ProcessWire / Smarty动态使用子字段选择器

时间:2016-02-23 19:30:58

标签: smarty processwire

我正在使用Smarty Templating模块ProcessWire(v2.1.6),我有两个模板TeacherSubjectTeacher模板有一个字段(类型是多个页面),引用教师可以教授的主题。在Teacher模板中可以看到,访问Smarty中的内容非常简单:

{foreach from=$page->subjects item=subject}
    <li><a href="{$subject->url}">{$subject->title}</a></li>
{/foreach}

但是,该网站的用户还应该能够查看Subject的所有教师:

{foreach from=$pages->find('template=Teacher,subjects.title={$page->title}') item=teacher}
    <li><a href="{$teacher->url}">{$teacher->title}</a></li>
{/foreach}

这会使用subfield selector subjects.title并尝试动态扩展操作数({$page->title})。

首先我认为动态扩展是问题,但是如果我用常量字符串替换它,子字段选择器也不起作用(foreach不生成任何东西):

{foreach from=$pages->find('template=Teacher,subjects.title="History"') item=teacher}

有趣的是,非常相似的count selector确实有效:

{foreach from=$pages->find('template=Teacher,subjects.count > 1') item=teacher}

2 个答案:

答案 0 :(得分:1)

我对Smarty一无所知,但{$page->title}无法扩展,因为它位于单引号字符串中。尝试使用双引号:

    $pages->find("template=Teacher, subjects.title={$page->title}")

有关详细信息,请参阅字符串中的PHP manual on variable parsing

我还建议您选择subjects.id=$page->idsubjects.name=$page->name,因为这些字段是唯一的,不使用输出格式。

答案 1 :(得分:0)

这是我使用的解决方法(但我仍然对实际解决方案感兴趣):

{foreach from=$pages->find("template=Teacher") item=teacher}
    {foreach from=$teacher->subjects item=subject}
        {if $subject->title == $page->title}
             <li><a href="{$teacher->url}">{$teacher->title}</a></li>
[...]