我有一个非常基本的拨号表单,可以检测DTMF,然后将其提交给dial.php
提交表单时会传递数字,我可以使用$_GET['digits']
这很有效。但是,如果我没有提交表单,只需使用<goto next="#dial">
如何检索数字并将它们分配给一个值,以便我可以使用PHP进行查找?
此外,如果输入的数字无效,我可以抛出一个事件,然后使用catch将其路由回原始表单。无论何时提交该表单,事件计数都将丢失。提交表单时有没有办法保持这种状态?
由于
答案 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>