【问题标题】:commandbutton action命令按钮动作
【发布时间】:2012-07-31 02:50:50
【问题描述】:

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

我是这样做的:

//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。

请帮忙。

谢谢

【问题讨论】:

  • 我相信有很多方法可以做到这一点。似乎命令按钮不能调用两个动作,但我可以使用 javascript 调用两个动作。但是,我真的希望它整齐地包装在一种方法中。

标签: javascript salesforce visualforce


【解决方案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>

【讨论】:

  • 谢谢。这也应该有效。我最终创建了两个 url 并使用 javascript 重定向或弹出一个窗口。
【解决方案2】:

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

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;

【讨论】:

  • 问题是我想从一个方法返回两个 PageReferences。我还需要返回电话记录页面。我不确定我是否可以这样做,这就是为什么我只创建 URL 并尝试使用 javascript 打开它。在您的代码中,“其他逻辑在这里”部分,我可以在那里创建另一个页面引用吗?
【解决方案3】:

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

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

来自教程:

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

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

【讨论】:

  • 感谢您的回复。但我不想从弹出窗口传回任何东西。我只想能够单击一个按钮,然后有两个新页面,一个从当前页面重定向,另一个在新窗口中。目前,我可以做重定向或新窗口就好了。但我不能让它们都发生。谢谢大家。您展示的想法很棒,我以后一定会使用它。
猜你喜欢
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多