【问题标题】:How do I decide between theme('node', $node) and drupal_render($node->content) for programmatic $node output我如何在 theme('node', $node) 和 drupal_render($node->content) 之间决定程序化 $node 输出
【发布时间】:2010-10-08 00:29:28
【问题描述】:

给定$node,我正在尝试在以下两种输出该 $node 的方式之间做出决定。

任一

$output = theme('node', $node);

node_build_content($node);
$output = drupal_render($node->content);

它们似乎都给出了相似的结果,但是在我选择一种方法而不是另一种方法之前我应该​​考虑什么?

【问题讨论】:

    标签: drupal drupal-6


    【解决方案1】:

    如果没有其他模块和主题通过主题层更改输出,则您的输出是相似的。

    但是!如果您绕过主题层,当您安装模块或主题并更改使用主题层来更改节点输出的配置设置时,您可能会开始遇到意外行为。

    简而言之,通过绕过主题层,您将错误构建到应用程序中。在您将应用程序移交给开始在管理员中更改设置的人(可能是客户)之后,这些错误可能会发生/

    如果您有兴趣,请查看装饰器模式。 Drupal 广泛使用它。

    http://en.wikipedia.org/wiki/Decorator_pattern

    【讨论】:

    • 其中哪一个绕过了主题层?我理解为使用 theme() 会产生很多绕过的问题。
    • 我很确定 $output = drupal_render($node->content);正在绕过它。
    【解决方案2】:

    嗯,有点。

    你真正想要的是

    $output = node_view($node);
    

    如果您只是调用 node_build_content,然后调用 theme('node', $node),则永远不会调用 hook_nodeapi('alter'),也不会调用 hook_link()

    因此,如果任何模块期望更改已构建的节点,它就没有机会这样做,并且如果应该有链接,它们也不会在那里。

    此外,您可以调用$output = node_view($node, FALSE, FALSE, FALSE);,它会为您提供没有链接的节点。

    请参阅node_view() 的文档。

    【讨论】:

    • 这也是我刚刚发现的:`node_view(stdClass node object, bool teaser, bool page, bool links)。
    【解决方案3】:

    如果您查看drupal_render() 的源代码,它实际上也会调用theme() 本身(前提是提供了#theme 覆盖)。

    【讨论】:

      【解决方案4】:

      在 Drupal 7 中,您应该这样做:

      $elements = node_view($node, 'teaser');
      $rendered_node = drupal_render($elements);
      

      【讨论】:

        【解决方案5】:

        这里有效的解决方案是这两种技术的结合。没有node_build_content($node); 的帮助,仅仅使用theme('node', $node); 似乎是行不通的。

        这是仅使用theme('node', $node); 的示例的结果。

        但是如果我们在处理 $node 到主题函数之前先做node_build_content($node);,你可以看到表单按钮也被渲染了。

        因此,真正的解决方案是:

        node_build_content($node);
        $output = theme('node', $node);
        

        【讨论】:

        • node_view() 在函数本身内执行此操作 + 其他一些不错的东西,例如调用钩子等。
        【解决方案6】:

        推荐首先,因为它是通过主题层传递的。

        【讨论】:

          猜你喜欢
          • 2020-08-12
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2017-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多