如何从多页Webform的先前步骤访问值?


12

我正在使用Webform4。它使用Drupal的令牌,而不是它自己的%令牌,就像在版本3中一样,而我发现的几乎所有内容都与Webform 3有关。

说我要制作多页订阅表格。在第一页上只有一个电子邮件字段。在第二篇文章中,我想要一个标记,其内容应为:

molot@example.com的详细订阅配置

同样,我希望能够将它们用作将来字段的默认值,例如要求用户提供帐单地址,然后再提供送货地址。

是否有任何代币?我现在所做的是:

function mymodule_token_info() {
  $type = array(
    'name' => t('Webform submitted values'),
    'description' => t('Tokens related to $_POST[\'submitted\'].'),
  );
  $tokens = array();
  if(isset($_POST['submitted'])) {
    foreach($_POST['submitted'] as $key => $val) { //discard $val now
      $tokens[$key] = array(
        'name' => $key,
        'description' => "\$_POST['submitted']['$key']",
      );
    }
  }
  return array(
    'types' => array('webform_submitted' => $type),
    'tokens' => array('webform_submitted' => $tokens),
  );
}

function mymodule_tokens($type, $tokens, $data, $options) {
  if($type == 'webform_submitted') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
      //Hide errors below. We don't care if it really exists yet. If empty, so be it.
      @$replacements[$original] = (string)$_POST['submitted'][$name];
    }
    return $replacements;
  }
}

它可以工作,但只显示前一步的值,因此需要一些带有隐藏字段的肮脏技巧,才能跨多个步骤传递电子邮件值。我承认-那又快又脏。是否有任何内置方法可以做到这一点,或者为此目的适当维护了贡献模块?还是一种使该代码独立于$_POST['submitted'],使其在多个步骤中都带有值并使其令牌(来自可用Webform元素)在编辑窗口中的令牌列表上可见的方法?


提交具有所需值的页面时,可以设置会话变量吗?
Darvanen

@Darvanen我可能可以,但是值已经保存在某个地方,对吗?所以我宁愿使用已经存在的东西。而且我几乎不相信我是第一个需要此功能的人。可能我只是找不到合适的解决方案?
Mołot

我不确定这个$ form_state ['storage'],但是我搜索了2或3个帖子,他们提到了所有存储在$ form_state ['storage']中的数据,所以我认为您可以访问数据,来源stackoverflow.com/questions/ 6408170 /…drupal.org/node/717750
Bala

2
@Bala这适用于所有钩子更改形式。但是我如何获得令牌中的表单状态?我的意思是,我要在两周内辞掉这份工作。会照顾这种形式的家伙不是编码员,他可以做到,但这不是他的主要技能-这就是为什么我需要令牌。
Mołot

是的,您提到的未来需求我完全忘记了。
Bala 2015年

Answers:


1

这不会回答标题中的问题,但阅读用例听起来像是为Profile2编写的方案。 相关的stackoverflow帖子

Webform非常适合进行调查,但是,如果您希望“能够将它们用作将来字段的默认值”,则需要将其连接到用户。因此,您随后将需要更多的自定义代码来提取用户的历史Web表单提交内容,以将这些值提取为帐单地址的表格形式。精确地编写Profile(2)可以使此操作更加容易。

同样,在将其交给其他人之前,您所做的最后一刻的自定义编码越少,当他们试图进行更新时,其他人会对他们的内心诅咒就越少。


一切都很好,但是这种形式不是:((我的意思是,我们不想为要求订阅的人创建个人资料。当您这样做时,适用不同的法律,更严格的法律。)由法律部门负责人告诉另外,现在我需要它完全无关的使用情况,如果在所有:)。
Mołot

好的,您的法律团队所说的很有趣。底线是,如果要使用连接到用户的数据预填充表单,则需要连接到用户的数据。概要文件模块是维护该数据功能的简便方法,并且与您所请求的功能非常匹配。更改站点权限,以便没有人可以查看配置文件,现在它与您想要的配置文件相同,但带有更标准的代码。仅仅因为模块被命名为Profile并不意味着它必须被如此部署。
DeveloperWeeks

0

将变量声明为全局变量,然后将from_state [values] []传递给它们。这对我有用,具有ctools模态弹出窗口的多阶段形式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.