如何响应 Acumatica 中的自定义操作或按钮播放声音?
How do I play a sound in response to a custom action or button in Acumatica?
我们需要在网格单元格上播放声音文件,为此我们使用了下面的控件 <audio>
类似于默认的 Acumatica 在某些屏幕中用于条形码扫描等的方式。我们做了同样的事情,但是当我们注册脚本时,控制代码正在更改为 <PXControl>
并且 Play 等方法无法访问。仅当我们尝试将此音频控件插入自定义包时才会发生这种情况。在 ASPX 上,所有功能都可以正常工作。
在包中生成脚本之前
<audio id="audiobeep" preload="auto" src="http://www.soundjay.com/button/beep-07.wav" style="visibility: hidden" />
在包中生成脚本后
<px:Control runat="server" ID="audiobeep" />
由于“audio”标签正在转换为“px:control”标签,因此不支持Preload、Src、Style等属性。
您能否指导我们使用这种方法?
使用带有 "Generate Customization Script" 按钮的 Aspx 编辑器时,唯一支持嵌入任意 HTML 标签(如 <audio>
)的方法是使用 PXLiteral 控件。以下是直接在 Aspx 编辑器中输入时如何使用 PXLiteral 控件的示例:
<px:PXLiteral runat="server" Text="<h1>Test!</h1>" />
生成脚本后,就可以从布局编辑器编辑控件的属性。
对于这个特定的场景,我会建议一种稍微不同的方法,只涉及使用 JavaScript 连接到 PXDataSource 控件的代码。第一步是在您的图形中创建一个 PXAction,当您单击您的按钮时将调用它:
public PXAction<Customer> test;
[PXUIField(DisplayName = "Test", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select, Enabled = false)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.Process)]
public virtual IEnumerable Test(PXAdapter adapter)
{
//TODO: Do something useful
return adapter.Get();
}
为简单起见,我们假设您可以在主屏幕工具栏中使用该按钮 - 但您也可以将其映射到页面上某处的 PXButton
控件。
然后,使用布局编辑器,我们将添加一个 JavaScript 控件,方法是将它拖动到表单中。
添加 JavaScript 控件后,转到属性部分并设置脚本。该脚本需要设置为单行,但为了便于阅读,这里是我们将要使用的脚本的格式良好的版本:
function commandResult(ds, context)
{
if (context.command == 'Test') // Test is the name of the PXAction we created earlier
{
var audio = new Audio('../../Sounds/Ding.wav');
audio.play();
}
}
注意:Ding.wav 文件随 Acumatica 一起提供,但您可以自由使用来自另一个 URL 的声音,或随您的自定义一起提供。如果使用外部 URL,请确保使用正确的协议 HTTP/HTTPS.
最后一步是将数据源挂接到您的 JavaScript 函数。为此,单击布局编辑器的 DataSource 部分,从 属性 编辑器打开 Client Events 组,并将 CommandPerformed 事件设置为 commandResult
,这是 JavaScript我们创建的函数。
发布后,您会在表单的工具栏中看到“测试”按钮。如果你点击它,你会听到美妙的叮当声!
声音将无条件播放,无论您的 PXAction
代表发生什么。如果您只想在特定条件下播放声音,实现此目的的一种方法是读取屏幕上由您的代表设置的字段的内容,类似于 IN305000 页面中所做的:
var description = px_alls["edDescriptionPnl"];
if (description != null && description.getValue() != null)
{
var audio = new Audio('../../Sounds/Ding.wav');
audio.play();
}
我们需要在网格单元格上播放声音文件,为此我们使用了下面的控件 <audio>
类似于默认的 Acumatica 在某些屏幕中用于条形码扫描等的方式。我们做了同样的事情,但是当我们注册脚本时,控制代码正在更改为 <PXControl>
并且 Play 等方法无法访问。仅当我们尝试将此音频控件插入自定义包时才会发生这种情况。在 ASPX 上,所有功能都可以正常工作。
在包中生成脚本之前
<audio id="audiobeep" preload="auto" src="http://www.soundjay.com/button/beep-07.wav" style="visibility: hidden" />
在包中生成脚本后
<px:Control runat="server" ID="audiobeep" />
由于“audio”标签正在转换为“px:control”标签,因此不支持Preload、Src、Style等属性。
您能否指导我们使用这种方法?
使用带有 "Generate Customization Script" 按钮的 Aspx 编辑器时,唯一支持嵌入任意 HTML 标签(如 <audio>
)的方法是使用 PXLiteral 控件。以下是直接在 Aspx 编辑器中输入时如何使用 PXLiteral 控件的示例:
<px:PXLiteral runat="server" Text="<h1>Test!</h1>" />
生成脚本后,就可以从布局编辑器编辑控件的属性。
对于这个特定的场景,我会建议一种稍微不同的方法,只涉及使用 JavaScript 连接到 PXDataSource 控件的代码。第一步是在您的图形中创建一个 PXAction,当您单击您的按钮时将调用它:
public PXAction<Customer> test;
[PXUIField(DisplayName = "Test", MapEnableRights = PXCacheRights.Update, MapViewRights = PXCacheRights.Select, Enabled = false)]
[PXButton(ImageKey = PX.Web.UI.Sprite.Main.Process)]
public virtual IEnumerable Test(PXAdapter adapter)
{
//TODO: Do something useful
return adapter.Get();
}
为简单起见,我们假设您可以在主屏幕工具栏中使用该按钮 - 但您也可以将其映射到页面上某处的 PXButton
控件。
然后,使用布局编辑器,我们将添加一个 JavaScript 控件,方法是将它拖动到表单中。
添加 JavaScript 控件后,转到属性部分并设置脚本。该脚本需要设置为单行,但为了便于阅读,这里是我们将要使用的脚本的格式良好的版本:
function commandResult(ds, context)
{
if (context.command == 'Test') // Test is the name of the PXAction we created earlier
{
var audio = new Audio('../../Sounds/Ding.wav');
audio.play();
}
}
注意:Ding.wav 文件随 Acumatica 一起提供,但您可以自由使用来自另一个 URL 的声音,或随您的自定义一起提供。如果使用外部 URL,请确保使用正确的协议 HTTP/HTTPS.
最后一步是将数据源挂接到您的 JavaScript 函数。为此,单击布局编辑器的 DataSource 部分,从 属性 编辑器打开 Client Events 组,并将 CommandPerformed 事件设置为 commandResult
,这是 JavaScript我们创建的函数。
发布后,您会在表单的工具栏中看到“测试”按钮。如果你点击它,你会听到美妙的叮当声!
声音将无条件播放,无论您的 PXAction
代表发生什么。如果您只想在特定条件下播放声音,实现此目的的一种方法是读取屏幕上由您的代表设置的字段的内容,类似于 IN305000 页面中所做的:
var description = px_alls["edDescriptionPnl"];
if (description != null && description.getValue() != null)
{
var audio = new Audio('../../Sounds/Ding.wav');
audio.play();
}