命令按钮操作

commandbutton action

本文关键字:操作 按钮 命令      更新时间:2024-05-06

我有一个命令按钮,当单击时,我希望它保存电话呼叫记录并重定向到记录页面,然后在新窗口中打开一个新页面,显示与呼叫相关的新案例的编辑页面。

我是这样做的:

//Pseudocode
public PageReference saverecord(){
   create a new phone call record;
   insert record;
   if(createnewcase)
      create case;
      insert case;
      create editcaseURL;
   return phonerecord page;
}

在客户端,在命令按钮中,我使用<apex:param name="newcase" value="true" assignTo="{!createNewCase}"/>将createnewcase设置为true。然后完成javascript打开弹出窗口。我已经分别测试了电话记录和案件记录,并成功了。但当我把它们放在一个类中时,案例从未创建。以及在visualforce视图状态窗口中。我甚至找不到布尔createnewcase。

请帮忙。

感谢

使用Apex/JavaScript:很容易实现

顶点代码:

// Defining two variables for the both records (case and phone)
public String caseId { get; set; }
public String phoneId { get; set; }
// Defining a boolean to render the JavaScript panel after saving
punlic Boolean redirectNow { get; set; }
public PageReference saverecord(){
    // Create a new phone call record;
    insert record;
    // Now reading a phone record id
    phoneId = record.id;
    if(createnewcase){
        create case;
        insert case;
        // Now reading a case id
        caseId = case.id;
    }
    // If case and phone are OK -> set this flag to true
    redirectNow = true;
    // We do not need to return a real page reference 
    // because we will redirecting with javascript
    return null;
}

以及带有JavaScript:的Visualforce页面

<!-- A command button, that rerenders a panel with JavaScript -->
<apex:commandButton value="Save" action="{!saverecord}" reRender="doAfterSave"/>
<!-- This panel renders only after you will save the new records -->
<apex:outputPanel id="doAfterSave">
    <apex:outputPanel rendered="{!redirectNow}">
        <script>
            // First reading the id's
            var newCaseId = '{!caseId}';
            var newPhoneId = '{!phoneId}';
            if(newCaseId != '' && newPhoneId != '')
            {
                // Now opening a new window with case in edit mode
                window.open('/' + newCaseId + '/e');
                // And then redirecting the main page to the new phone record
                window.location = '/' + phoneId;
            }
        </script>
    </apex:outputPanel>
</apex:outputPanel>

如果您想在编辑模式下打开新创建的案例,请使用以下代码。

public PageReference saverecord(){
   create a new phone call record;
   insert record;
   if(createnewcase)
   {
      create case;
      insert case;
      return new PageReference('/' + case.Id + '/e');
   }
   else
     do other logic here
   return null;

尽管这篇文章已经过时了,但如果你真的需要使用JavaScript和弹出窗口来完成这项工作(而不是简单地使用Visualforce页面并在url中传递参数,或者使用共享同一控制器的VF页面,从而维护相同的上下文、成员变量值等),我来看看这个教程:教程:Visualforce中使用Yahoo!用户界面库

关键的技巧是使"弹出窗口"实际上只是同一页面的一个隐藏方面,以避免在Visualforce中使用JavaScript传递值的相关问题。

来自教程:

构建一个链接或按钮来弹出一个新的Visualforce页面实际上是很简单,让这个弹出窗口位于当前页面上方也很容易。当您想收集时出现问题弹出窗口中的信息,并将该信息传回页面启动弹出窗口。

问题是新窗口是作为一个单独的浏览器启动的请求。由于这是一个单独的请求对于服务器,新页面不共享同一个控制器上下文/会话。即使两个页面都使用相同的名称控制器!这是因为这是两个不同的事实浏览器级别的请求。