0

我有一个非常基本的拨号表单,可以检测 DTMF,然后将其提交给 dial.php

提交表单后,数字被传递,我可以使用$_GET['digits']

这很好用。但是,如果我不提交表单,只需使用<goto next="#dial">如何检索数字并将它们分配给一个值,以便我可以使用 PHP 进行查找?

此外,如果输入了无效数字,我可以抛出一个事件,然后使用 catch 将其路由回原始表单。但是,当提交该表单时,事件计数会丢失。提交表单时有什么方法可以保持这种状态吗?

谢谢

4

2 回答 2

2

在 VXML 中,goto通常用于在文档中导航。您可以调用外部文档(可能是您的 PHP),但它没有namelist属性来传递查询字符串中的信息。您可以将查询字符串构建到 URI 中,但不能动态执行,因为next属性不接受表达式。

将信息传递给 PHP 应用程序的最佳方式是使用提交子对话框标记,它们都具有用于传递数据的名称列表属性。对话框用于调用可重用的通用对话框,并将返回到调用文档中停止执行的位置。它可以将数据返回给调用文档。而提交不会自动返回到调用文档。

如果您希望信息保留(而不是将其保留在后端),您可以使用根文档来分配变量。根文档中的变量对整个应用程序是全局的,并且将在整个调用过程中持续存在。您可以在VoiceXML Specification的第 1.3.3 节中阅读有关根文档的更多信息。

于 2013-04-04T13:29:51.467 回答
1

有两种通用方法可以解决这个问题。正如您提到的,如果您离开当前页面,所有内置错误计数器都会重置。一种解决方案是使用一个通用的根文档,它可以存储“全局”变量,这些变量将在页面转换中持续存在。您将需要通过操作这些应用程序级变量来手动处理所有错误计数。第二种更优雅的解决方案是使用允许您将数据发送到另一个脚本的标签,该脚本可以选择执行更多 VoiceXML,然后返回到当前脚本而不会丢失上下文。子对话框可以被认为很像函数调用。您当前的范围被保留并创建了一个新范围。您可以传入变量并获取返回值。这是一个人为的例子:

<?xml version="1.0"?>
<vxml version="2.1">
  <form id="getdigits">
    <field name="digits" type="digits">
      <prompt>Please enter some digits</prompt>
    </field>
    <subdialog name="dial" src="dial.php" namelist="" method="get">
      <filled>
        <if cond="dial.status == 'failure'">
          <goto next="#getdigits"/>
        </if>
        <goto next="someotherpage.php"/>
      </filled>
    </subdialog>
  </form>
</vxml>

<?php
header("Content-type: text/xml");
echo("<?xml version=\"1.0\"?>\n");
$status = $_GET['digits'] == '1234' ? 'success' : 'failure';
?>
<vxml version="2.1">
  <form>
    <block>
      <var name="status" expr="'<?=$status?>'"/>
      <return namelist="status"/>
    </block>
  </form>
</vxml>
于 2013-04-04T21:14:23.910 回答