【问题标题】:Add HTML to node title in Drupal module, not in theme layer将 HTML 添加到 Drupal 模块中的节点标题,而不是主题层
【发布时间】:2010-11-23 00:04:19
【问题描述】:

我想向我的 Drupal 6 模块添加一些功能:我想在某些节点标题旁边插入一个图像(它涉及一个 span 和一个 img 标签)。我想我可以通过实现 mymodule_preprocess_node() 并修改标题来做到这一点。但是,Drupal 会去除所有标签以避免 XSS 攻击。

我见过很多涉及主题层的解决方案(最常见的是http://drupal.org/node/28537),但我想在我的模块中执行此操作,而不是在主题中。我不想修改任何 .tpl.php 文件或 template.php。谁能给我一些关于如何做到这一点的提示?

【问题讨论】:

    标签: drupal drupal-6 drupal-modules


    【解决方案1】:

    您提到您已经尝试过 preprocess_node(),并且是正确的,如果您将 img 标签存储为节点标题的一部分,Drupal 确实会删除它,因为它通过 check_plain 运行 $node->title在template_preprocess_node().

    我的建议是将实际图像存储为图像字段(使用imagefield 模块和imagecache 的某种组合来调整大小),将该字段的显示设置为隐藏在 CCK 显示选项卡上给定内容类型,然后将图像附加到模块预处理函数中的 $title 变量中。此解决方案还允许您在可能需要创建的任何视图中在标题旁边显示该图像。

    【讨论】:

    • 不幸的是,图像发生了变化——显示哪个图像取决于该节点与其他节点相比的加载频率。所以我不能只用节点存储静态图像 - 我需要在每次加载页面时查找要添加的图像。
    【解决方案2】:

    “某些节点标题” - 您是指来自某些节点类型的所有节点标题吗?

    如果是这样,您可能只使用 CSS 设置节点样式。默认情况下,所有节点都会有一个对应于节点类型的类。使用 CSS 背景图像,您可以将图像添加到节点标题。

    您的模块可以调用drupal_add_css 并将任何所需的CSS 添加到页面中。这样,它就独立于主题了。

    【讨论】:

    • 如果我只需要添加图像,这将起作用,但不仅如此。但是,如果我找不到获取所需 HTML 标记的方法,我也许可以使用此方法 - 显示图像总比没有好。正如我上面提到的,图像会根据情况而变化,所以看起来我必须为每个图像设置不同的样式表,并选择在加载时添加哪个样式表 - 这听起来对吗?
    【解决方案3】:

    我认为更简单的方法是使用 javascript/Jquery。 您创建一个仅在某些类型的节点中调用的 Jquery 脚本,并将视图数量从 drupal 传递给 jscript。

    您可以在 module_preprocess_node 中调用 drupal_add_js() 并将包含视图数量或图像链接的变量传递给脚本。像这样的:

    <?php
    drupal_add_js("var mymodule_imagelink = " . drupal_to_js($imagelink) . ";", 'inline');
    drupal_add_js("my_js_file.js");
    ?>
    

    然后在 my_js_file.js 中更改文本。有几种方法可以实现这一点。例如,您可以在文档中进行搜索并将标题更改为其他内容,或者您​​可以使用确定的 ID 等...

    Find text string using jQuery?

    http://api.jquery.com/replaceWith/

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2015-02-18
      相关资源
      最近更新 更多