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 网格系统,请使用 pull
和 push
类。
【讨论】:
【参考方案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() 城市:
这会生成一个表单,在大多数情况下会以 <form>
开头,有一些输入字段,然后有 很多 随机 html,然后是更多输入字段,然后关闭 .
您可能知道,<input type="submit" value="Submit" />
只会发布它所包含的 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 中时,为要移入的表单域腾出空间。
<body class="<?php print $splitform ?>">
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 视图 - 可以拆分暴露的表单吗?的主要内容,如果未能解决你的问题,请参考以下文章