Drupal视图 - 可以分割暴露形式吗?

时间:2011-07-02 22:16:46

标签: drupal drupal-6 drupal-views drupal-theming

我需要在页面的侧边栏中显示部分展开的表单,以及$content区域中表单和内容的其余部分。我找不到这样做的好方法。我想让它以某种方式出现,通过“暴露形式”设置制作“块”视图,然后尝试仅通过.tpl文件显示我需要的部分。问题是,当单击提交按钮(提交按钮位于$content区域)时,侧边栏中的过滤器不会被考虑在内。

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

如果您在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表示结构是独立的。这就是您的解决方案所在。

  1. 为表单字段提供良好的ID和类。您可以使用hook_form_alter来更改现有表单,但您可能只是想自己为整个表单创建HTML。主题图层允许这样做。
  2. 使用CSS按ID和位置选择单个表单字段:将它们绝对地放入正确的位置。或者通过CLASS和位置选择字段类别:将它们相对于正确的位置。
  3. 制作一个简单的识别程序,允许在body-tag中添加一个类。 (见下文)。
  4. 添加一些CSS以将侧边栏移动到更低的位置,当该类位于body标记中时,为表单字段留出空间。

    <body class="<?php print $splitform ?>">

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

答案 2 :(得分:0)

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

  1. 将表单元素的值(存在于块中)存储在全局变量中。
  2. 现在使用该全局变量并设置表单元素(存在于内容区域中,此表单元素对用户不可见)。
  3. 如果您采用其他方式,请提供更多信息。

    此致 Chintan。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

这里有一个相关的问题: 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 :(得分:0)

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

相关问题