【问题标题】:Views is stripping tags from the output视图正在从输出中剥离标签
【发布时间】:2011-04-02 02:19:43
【问题描述】:

我有一个 Drupal 视图,它应该使用 Flash 输出视频播放器。我正在尝试输出一个将调用 Flash 电影的脚本。问题是 Views 应用了某种过滤器,去除了我的 <script> 标记、开头和结尾标记。我正在寻找解决方案(视图中的某些设置将禁用该过滤器),但似乎找不到答案。其他 HTML 标签可以工作,但似乎脚本标签正在被剥离,可能是出于某种安全原因。

我选择了重写字段输出的选项,并且我正确使用了标签

视图还会从我的标签中去除样式属性。例如:

<h3 style="border-bottom: solid 1px #ffcc99;">Some text here</h3>

看起来像这样:

<h3>Some text here</h3>

有解决办法吗?谢谢。


开始编辑


我将粘贴在我在视图中使用的代码下方。

<div class="bloco-filme">
  [title]
  <div class="field-imagem">
    [field_imagem_fid]

    <script type='text/javascript' src='sites/default/files/js/swfobject.js'></script>

    <div id='mediaspace[nid]'>Se você estiver visualizando esta mensagem, significa o Flash Player não está instalado em sua máquina. Para assistir ao vídeo é preciso instalar o Flash player</div>

    <script type='text/javascript'>
      var so = new SWFObject('sites/default/files/plugins/jqplayer/player.swf','mpl','205','undefined','9');
      so.addParam('allowfullscreen','true');
      so.addParam('allowscriptaccess','always');
      so.addParam('wmode','transparent');
      so.addVariable('file','[field_video_fid]');
      so.addVariable('quality','false');
      so.write('mediaspace[nid]');
    </script>
    [field_video_fid]
  </div>
  <div class="field-resumo">
    <p>[body]</p>
  </div>
</div>

再次修改


上面的代码正在我的视图中发布。我创建了一个视图来处理这个问题。这是我认为的 FIELDS 区域:

字段 节点:Nid 节点:Título(标题,在 pt-br 中) 节点:链接“编辑器”(编辑) 节点:链接“apagar”(删除) 内容:Imagem 缩略图 Conteúdo: Video URL do arquivo (video file URL) 节点:Corpo(身体)

我已禁用以上所有字段的显示,并将所有代码打包在 Body 字段中。在那里我选择了我想重写字段输出的选项。

【问题讨论】:

  • 视频是什么?它是嵌入的 youtube 视频吗?如果是这样,它嵌入在哪里?它是否使用托管在您网站上的播放器,例如 Wimpy?它是上传到 CCK 文件字段的视频文件吗?您是否将 HTML 粘贴到应该显示视频的节点中,如果没有,视频是如何上传/显示的?如果上传到节点,直接查看节点时会显示吗?
  • 您好,这是一个flv文件。我正在使用 JWPlayer。我正在使用 javascript 代码嵌入它 (swfobject.swf),如下所示:longtailvideo.com/support/jw-player-setup-wizard。该视频是通过 CCK 文件字段上传的。在视频字段中,我请求其原始 URL,然后我重写输出以使用脚本使用其原始 URL 提取视频。直接查看节点时,视频显示为下载链接,这是带有下载链接的文件字段的默认主题。
  • “在视频字段中,我请求其原始 URL,然后我正在重写输出以使用脚本” - 你在哪里处理这个?在自定义模组中?
  • 也许我太厚了——但是你的意思是什么?您在哪里输入了该代码?
  • 上面的代码到底是在哪里粘贴的?

标签: drupal content-management-system tags drupal-views


【解决方案1】:

我几乎完全遇到了这个问题(感谢您发布它!),但自从这篇文章发布以来的三年里,一些事情(显然)发生了变化。

在我的例子中,使用 Views 3 和 D7,我能够将所有相关的 swfobject 代码粘贴到我的视图的页眉或页脚中,确保使用带有完整 HTML 的文本区域类型作为文本输入过滤器。

无需编辑 template.php。我什至使用令牌替换来为我的电影的 flashvars 提供上下文过滤器参数。

【讨论】:

    【解决方案2】:

    kiamlaluno 确定了基本问题,但要解决它,您将不得不使用字段模板,该模板将避免使用 Views 使用的过滤系统。 Group 42 has a great guide 向您介绍 Views 主题的基础知识,因此我将忽略这些细节并讨论您的具体案例。

    首先,您需要确定要重写哪个字段:我相信您正在使用 Field 配置执行此操作,但不清楚您要重写哪个字段。我将假设它是身体场。仔细阅读第 42 组的指南,为主题中的正文字段创建一个新模板文件。

    在新的模板文件中,使用以下代码:

    <div class="bloco-filme">
      <?php print $view->field['title']->render($row) ?>
      <div class="field-imagem">
        <?php print $view->field['field_imagem_fid']->render($row) ?>
    
        <script type='text/javascript' src='sites/default/files/js/swfobject.js'></script>
    
        <div id="mediaspace<?php print $view->field['nid']->render($row) ?>">Se você estiver visualizando esta mensagem, significa o Flash Player não está instalado em sua máquina. Para assistir ao vídeo é preciso instalar o Flash player</div>
    
        <script type='text/javascript'>
          var so = new SWFObject('sites/default/files/plugins/jqplayer/player.swf','mpl','205','undefined','9');
          so.addParam('allowfullscreen','true');
          so.addParam('allowscriptaccess','always');
          so.addParam('wmode','transparent');
          so.addVariable('file','<?php print $view->field["field_video_fid"]->render($row) ?>');
          so.addVariable('quality','false');
          so.write('mediaspace<?php print $view->field["nid"]->render($row) ?>');
        </script>
        <?php print $view->field['field_video_fid']->render($row) ?>
      </div>
      <div class="field-resumo">
        <p><?php print $output ?></p>
      </div>
    </div>
    

    保存您的新模板文件,现在 body 字段将替换为正确的输出。当您编辑 View 时,请确保您在模板中引用的所有字段都位于 Fields 列表中的正文字段之前。

    您可以看到这主要是带有一些 PHP 位的 HTML。像这样的代码:

    <?php print $view->field['title']->render($row) ?> 
    

    输出当前字段以外的字段的内容(即,当您要引用正文以外的字段时使用此代码)。它引用同一行并找到该字段的值。

    还有这样的代码:

    <?php print $output ?> 
    

    输出当前字段的值,在本例中为 Body。

    【讨论】:

    • 嗨,马克,非常感谢,这是一个很好的建议,我现在完全走在了正确的轨道上!!我现在面临的唯一问题是,当我获取文件字段的原始数据时,我所能得到的只是文件的 ID。我可能得到的是原始数据,而不是 URL(我的字段的处理输出)。我想要的是图像和视频字段的 $output。你有什么想法我该怎么做?谢谢。
    • 啊,对不起; $row 返回原始输出。我已经编辑了我的答案以使用$view-&gt;field['field_name']-&gt;render($row),它将输出渲染的内容。
    • 嗨,马克,谢谢。我已经解决了一切。最后,我决定使用views-view-fields,这在我看来是一种更好的方法。我从来没有耐心去真正检查视图主题的文档。这是非常有趣的。虽然我今天在这方面花了几个小时,但将来可能会非常有用。
    • 没问题:如果要重写整行,view-view-fields 绝对是更好的选择。
    【解决方案3】:

    我不认为是视图导致了问题。 kiamlaluno 非常正确,除非您更改输入格式,否则输入格式会从您的代码中删除很多内容,但是我不确定您是否真的能够使用 body 字段实现您想要做的任何事情一种优雅的方式。

    使用视图从每个节点类型输出您需要的内容,但我从不使用视图来确定其显示方式(除了排序字段等)。我倾向于使用显示字段选项(/admin/content/node-type/[your-node-type]/display)或在主题中执行此操作。换句话说,我为节点(内容类型)或字段本身设置主题。

    我会考虑查看这里 - http://drupal.org/node/206980 - 了解如何为各个字段设置主题。在您的主题文件夹中的 content-field.tpl.php 副本的开头使用 field_(字段名称前缀)(您可以在 cck 文件夹的主题文件夹中找到它),并使用它来为该字段设置主题您希望它的呈现方式(使用上面的代码)。因此,当视图选择它来显示它时,它会使用您上面的代码对其进行主题化。

    当然,这还有一个额外的优势,即您不需要在页面的 body 元素中添加任何代码,这根本不是一种可扩展的方式。

    或者,您可以 write a small module 使用 hook_field() (link 1, link 2) 来重写字段显示,但除非您希望能够在站点的管理区域中自定义任何这些,您最好的选择可能是如上所述为字段本身设置主题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多