如何响应Acumatica中的自定义动作或按钮播放声音?

Gab*_*iel 5 acumatica

我们需要在网格单元格上播放声音文件,为此我们使用下面的控件<audio>类似于默认Acumatica在某些屏幕中用于条形码扫描的方式等.我们做了同样的事情,但是当我们注册脚本时并且控制代码正在改变,<PXControl>并且Play等的方法不可访问.仅当我们尝试将此音频控件插入自定义程序包时才会发生这种情况.在ASPX上,所有功能都可以正常工作.

在包中生成脚本之前

<audio id="audiobeep" preload="auto" src="http://www.soundjay.com/button/beep-07.wav" style="visibility: hidden" />
Run Code Online (Sandbox Code Playgroud)

在包中生成脚本之后

<px:Control runat="server" ID="audiobeep"  />
Run Code Online (Sandbox Code Playgroud)

由于"audio"标签正在转换为"px:control"标签,因此它不支持Preload,Src,Style等属性.

你能指导我们这种方法吗?

Gab*_*iel 8

使用带有"生成自定义脚本"按钮的Aspx编辑器时,唯一支持嵌入任意HTML标记的方法<audio>是使用PXLiteral控件.以下是直接在Aspx编辑器中输入时如何使用PXLiteral控件的示例:

<px:PXLiteral runat="server" Text="&lt;h1>Test!&lt;/h1>" />
Run Code Online (Sandbox Code Playgroud)

生成脚本后,就可以从布局编辑器编辑控件的属性.

对于这个特定的场景,我建议采用略有不同的方法,仅涉及使用连接到PXDataSource控件的JavaScript代码.第一步是在图表中创建一个PXAction,当您单击按钮时将调用该PXA:

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();
}
Run Code Online (Sandbox Code Playgroud)

为简单起见,我们假设您可以在主屏幕工具栏中找到按钮 - 但您也可以将其映射到PXButton页面某处的控件.

然后,使用布局编辑器,我们将通过将其拖动到表单来添加JavaScript控件.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(); 
     } 
}
Run Code Online (Sandbox Code Playgroud)

注意: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(); 
}
Run Code Online (Sandbox Code Playgroud)

  • http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ (3认同)