0

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

我这样做是这样的:

//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。和oncomplete javascript打开弹出窗口。我已经分别测试了电话记录和案例记录并成功了。但是当我把它们放在一个班级时,这个案例从未创建过。并在 visualforce 视图状态窗口中。我什至找不到布尔 createnewcase。

请帮忙。

谢谢

4

3 回答 3

1

使用 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>
于 2012-08-10T13:52:41.567 回答
0

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

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;
于 2012-07-31T10:13:43.783 回答
0

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

基本技巧是使“弹出”实际上只是同一页面的隐藏方面,以规避与在 Visualforce 中使用 JavaScript 传递值相关的问题。

从教程:

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

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

于 2012-07-31T16:58:03.347 回答