VXML表单,将值传递给PHP并返回

时间:2013-04-04 12:13:42

标签: php forms vxml

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

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

获取它们

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

此外,如果输入的数字无效,我可以抛出一个事件,然后使用catch将其路由回原始表单。无论何时提交该表单,事件计数都将丢失。提交表单时有没有办法保持这种状态?

由于

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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

<?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>