Drupal 视图 - 可以拆分暴露的表单吗?

Posted

技术标签:

【中文标题】Drupal 视图 - 可以拆分暴露的表单吗?【英文标题】:Drupal views - splitting up the exposed form possible? 【发布时间】:2011-07-02 22:16:46 【问题描述】:

我需要在页面的侧边栏中显示部分公开的表单,而在$content 区域中显示其余的表单和内容。我真的没有什么好方法可以做到这一点。我通过设置“公开形式”设置“块”视图然后尝试仅通过 .tpl 文件显示我需要的部分来让它以某种方式显示。问题是,当点击提交按钮时(提交按钮在$content区域),侧边栏中的过滤器不会被考虑在内。

【问题讨论】:

是否可以选择使用 javascript 不,不是。我想尝试仅使用服务器端方法来执行此操作。 我不能 100% 确定,但我认为你必须为这样的事情编写一个自定义模块,要么完全远离视图,要么大幅修改其行为。 【参考方案1】:

一些横向思考...为什么不探索纯 CSS 选项?您可以使用position:absolute 放置该表单元素吗?或者(考虑是右侧边栏)float:right 然后一些负的右边距将其推到边栏?如果您使用的是 960 网格系统,请使用 pullpush 类。

【讨论】:

【参考方案2】:

首先我要回答你的问题,然后我会解释你为什么问错问题:

如果您在 formapi 之外构建表单,您可能会有一些运气。这将变得很容易,并且需要您对攻击向量(例如质量分配)格外小心。

views_some_view.tpl.php

<form name="input" action="/link/to/view" method="get">
  Country: <input type="text" name="country" />

my_custom_exposed_view.module:hook_block() 城市:

这会生成一个表单,在大多数情况下会以 &lt;form&gt; 开头,有一些输入字段,然后有 很多 随机 html,然后是更多输入字段,然后关闭 .

您可能知道,&lt;input type="submit" value="Submit" /&gt; 只会发布它所包含的 form 标记的所有内容。以下 HTML 中的提交按钮:

<form name="input_1" action="/link/to/view" method="get">
  Country: <input type="text" name="country" />
</form>
<form name="input_2" action="/link/to/view" method="get">
  City: <input type="text" name="city" />
  <input type="submit" value="Submit" />
</form>

只会发送City。这些不是您要寻找的机器人。

它必须是一个大表单,但由于form/form 之间的所有内容都非常动态,并且包含大量HTML,包括潜在的其他表单,这确实不是您想要的。此外:块外观(显示/未显示)完全独立于内容进行控制。您将需要大量可靠的代码来确保块 a) 在起始 form 标记不存在时永远不会出现,并且 b) 当起始 form 标记存在时块将保证显示。否则,您不仅有无效的 HTML,而且有损坏的 HTML,在大多数情况下会真正使您的页面无法使用。

您只是不想将表单的一部分放在块中,而将另一部分放在内容中

但是,您希望它可视化,就好像一部分在正文中,其余部分在边栏中。

好消息是 HTML 表示结构是独立的。这就是您的解决方案所在。

    为您的表单域提供良好的 id 和类。您可以使用hook_form_alter 来更改现有表单,但您可能只是想自己为整个表单创建 HTML。主题层允许这样做。 使用 CSS 按 ID 和位置选择单个表单域:将它们绝对放置到正确的位置。或者通过 CLASS 和位置挑选字段类别:将它们相对到正确的位置。 制作一个简单的识别例程,允许向 body-tag 添加一个类。 (见下文)。

    添加一些 CSS 以将侧边栏向下移动,当该类位于 body-tag 中时,为要移入的表单域腾出空间。

    &lt;body class="&lt;?php print $splitform ?&gt;"&gt;

    function my_themename_preprocess_page() 
      if ($GET['q'] == 'path/to/view') 
        $vars['spliform'] = "splitform"
      
    

【讨论】:

【参考方案3】:

根据上面的解释,我假设您在块和内容区域中打印相同的表单,并且您在 page.tpl 中隐藏了表单的某些部分,如果这是真的,那么您可以在您的自定义模块中使用 hook_form_alter()那么

    将表单元素的值(存在于块中)存储在全局变量中。 现在使用该全局变量并设置表单元素(存在于内容区域中,此表单元素对用户不可见)。

如果您以其他方式实现,请提供更多信息。

问候, 钦坦。

【讨论】:

【参考方案4】:

这里有一个相关的问题: https://drupal.stackexchange.com/questions/3827/multiple-copies-of-views-filter-form-exposed-filters 它描述了如何复制您的过滤器。然而,这似乎是一个丑陋的黑客。

#6 中提到的这个解决方案看起来有点干净: http://drupal.org/node/641838#comment-3247748 没试过,不过看起来不错。

它仍然会给您一些开销(重复视图),但它可能是使用视图执行此操作的最简单方法。

另一方面,您可能会编写一个模块并构建自己的自定义过滤器块,该过滤器块会挂接到您的视图中。这是一篇关于此的博客文章: http://www.hashbangcode.com/blog/creating-custom-views-filters-exposed-form-element-drupal-6-561.html

【讨论】:

【参考方案5】:

如果您使用 context 之类的内容,您可以让暴露的过滤器块在同一页面中显示两次。然后,您可以使用 CSS 隐藏您不想在每个表单中显示的字段。

您遇到的根本问题是,如果要将两个表单放在不同的位置,它们每个都有自己的表单元素 - 当触发提交时,只会发送同一表单元素中的表单字段。您需要将它们移动到一个表单中,或者依靠 JavaScript 从两个表单中收集字段并构建帖子。

【讨论】:

【参考方案6】:

您可以将块创建为一个空的 div,并让主页面中的 javascript 使用辅助过滤器表单以及您需要的任何其他内容填充它。同样,您可以使用 javascript 将表单值从块表单复制到提交时主表单中的隐藏字段。这为您提供了从一个地方(节点输出)所需的所有控制。唯一需要注意的是,它更多地依赖于 javascript 来将它们连接在一起。

【讨论】:

以上是关于Drupal 视图 - 可以拆分暴露的表单吗?的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7 视图中的块中暴露的过滤器

带有自定义模板暴露过滤器的 Drupal 7 视图不显示

SEO 友好的暴露过滤器视图 Drupal 7

Drupal 7 视图暴露的过滤器

Drupal 视图和暴露的过滤器下拉菜单

在 Drupal 中搜索视图