0

我确信这个问题不值得成为它自己的话题,但我未能在论坛和 Stack Overflow 上找到令人满意的答案。

我有三个模板。我会尽量清楚和简单地说明我正在尝试做的事情。

{exp:channel:entries channel="page" dynamic="yes"}
    {!-- 'pages_module' is a matrix field --}
    {page_modules}
        {!-- The field 'module' is returning the entry_id from SP Table Select --}
        {embed="module/index" id="{module:value}"}
    {/page_modules}
{/exp:channel:entries}

模块 - 索引

{exp:channel:entries channel="module" dynamic="no" entry_id="{embed:id}" site="main_site"}
    {if module_type == "building"}
        {embed="module/building" id="{building_id}"}
    {/if}
    {!-- Other module type checking here... --}
    {!-- Note this following line --}
{entry_id} - {embed:id}
{/exp:channel:entries}

模块 - 建筑

{exp:channel:entries channel="building" dynamic="no" entry_id="{embed:id}" site="main_site"}
    <h1>{title}</h1>
    <p>{building_description}</p>
{/exp:channel:entries}

因此,基本上,在此设置中,您可以将“模块”附加到页面条目。在这种特殊情况下,我试图查看页面上是否设置了任何 {module_id}。如果是这样,将 {module_id} 传递给主模块模板,它将获取模块条目,比较 {module_type} 并将 {building_id} 发送到第三个模板。然后获取并显示建筑物信息。

在我写注释的模块模板中,{entry_id} 和 {embed:id} 不匹配。{entry_id} 等于动态获取的第一个页面条目的 ID。我认为这是因为它是嵌入式模板而不是片段,因此会产生三个嵌套的 {exp:channel:entries} 标签。但是话又说回来,我不能将 ID 传递给片段,可以吗?

另外值得注意的是,我正在使用 MSM,因为我有 8 个站点在上面运行,所以我希望“模块”是模块化的,并且都位于“主站点”下以便于维护。

如果我错了,我希望有人能澄清这一点和/或纠正我。

4

2 回答 2

1

但是话又说回来,我不能将 ID 传递给片段,可以吗?

一个片段的行为就好像它是一个内联代码块,所以它会同样知道它的周围环境。例如,如果 Module - Index 是一个片段,您可以这样做:

{exp:channel:entries channel="page" dynamic="yes"}
    {if module_id}{snippet_module_index}{/if}
{/exp:channel:entries}

片段 (snippet_module_index)

{exp:channel:entries channel="module" dynamic="no" entry_id="{module_id}" site="main_site"}
    ...
{/exp:channel:entries}

但这并非一帆风顺,因为您有嵌套的频道条目标签,这通常是最好避免的。您不使用关系字段是否有任何特殊原因?显然{module_id}对应于模块通道中的一个条目,那么为什么不在这里利用 EE 的内置功能呢?如果你突然开始使用关系,你可以这样做:

{exp:channel:entries channel="page" dynamic="yes"}
    {related_entries id="related_module"}
        {if module_type == 'building'}  
            Embed/snippet containing building 'module'
        {/if}
    {/related_entries}
{/exp:channel:entries}

很难确切知道哪种方法最适合您的需求,但我希望您最好避免多次通道条目调用和嵌套嵌入以支持关系和片段。您也应该能够避免相当多的开销。

于 2012-11-12T18:38:48.347 回答
0

如文档中所述:

嵌入来自其他站点的模板

要从另一个站点嵌入模板,只需在指定的模板组和模板前面加上您希望从中提取模板的站点的短名称,如下所示:

{embed="site_short_name:template_group/template"}

但!

指定多个站点(准备出发)

注意:指定多个站点不适用于{embed=”“}标记。

然后我想我可以用 PHP 解决这个限制,但它似乎甚至是基本的......

$output = $this->EE->TMPL->parse_variables('{exp:channel:entries channel="module" dynamic="no" site="main_site"}{entry_id}{/exp:channel:entries}', array());

...wouldn't return the expected values. It seems there is no way to embed a template that itself fetches data from a different site. This is disappointing since getting data from other since while not repeating channels/templates is, to me, the exact reason why you want to use the multi-site manager...

于 2012-11-13T14:31:52.107 回答