【问题标题】:Passing STATIC/hardcoded value to controller from visualforce page从visualforce页面将静态/硬编码值传递给控制器
【发布时间】:2018-05-10 18:48:54
【问题描述】:

我正在为仪表板创建 8 个 visualforce 页面 (VFP),并且由于每个 VFP 所需数据的相似性,我希望利用单个自定义控制器(而不是 8 个控制器)。

每个 VFP 之间的唯一区别是控制器中 SOQL 语句的 WHERE 子句。我的想法是让每个 VFP 将静态(不变/硬编码)字符串传递给控制器​​,以便在控制器的 SOQL WHERE 子句中使用。这是我正在寻找的示例:

控制器:

public class SalesRev_UpFrontFees {
    public String StageVal {get;set;}
    public Integer salesVal = 0;
    public Integer intTCV;

    public SalesRev_UpFrontFees(){
        getData();
        }

    public void getData() {

    //Insert code to pull the hardcoded 'StageVal' from visualforce pages

    String SoqlString = 'SELECT SUM(Total_Subscription_Fees__c) RevSum\n' +
                  'FROM Opportunity\n' +
                  'WHERE CloseDate >= 2018-01-01 AND CloseDate <= 2018-12-31\n' +
                  'AND Opportunity.RecordType.Name = \'Enterprise Opportunity\'\n' +
                  'AND StageName = \':StageVal\'';

    AggregateResult[] groupedResults = Database.query(SoqlString);

    objTCV = groupedResults[0].get('RevSum');
    intTCV = Integer.valueOf(objTCV);
    salesVal = (intTCV  == null) ? 0 : intTCV ;   
   } 
    /*public void setStageVal(String sStageVal) {
        StageVal = sStageVal;        
        } */

    public Integer getsalesVal() {
        return intTCV;
        }
}

Visualforce 页面:

    <apex:page controller="SalesRev_UpFrontFees">

        <head>
            <apex:includeScript value="{!URLFOR($Resource.VFGauge, 'VFGauge/jQuery/jquery-1.10.2.min.js')}" /> 
            <apex:includeScript value="{!URLFOR($Resource.VFGauge, 'VFGauge/jQuery/jquery-ui-1.10.2.custom.min.js')}" /> 

            <apex:includeScript value="{!URLFOR($Resource.Raphael, 'Raphael/resources/js/raphael.2.1.0.min.js')}" /> 
            <apex:includeScript value="{!URLFOR($Resource.Raphael, 'Raphael/resources/js/justgage.1.0.1.js')}" />
            <apex:stylesheet value="{!URLFOR($Resource.Raphael, 'Raphael/styles/style.css')}"/>
        </head>

        <apex:form id="myForm">

            <!--- Insert way to feed the controller a string value, e.g. String StageVal = 'Closed Won'--->

            <body>
                <apex:pageBlock id="xxx"> 
                    <div id="gauge1" style="width:320px; height:256px"></div>
                    <script type="text/javascript"> 

                    var g1 = new JustGage({      
                            id: "gauge1",
                            value: {!salesVal},
                            min: 0,
                            max: 1000000000,
                            title: "WW Sales Revenue",
                            levelColorsGradient: false,
                            gaugeWidthScale: 0.4,
                            valueFontSize: "5px"
                            });
                    </script>
                    <a id="linear-gauge" href=""></a>
                </apex:pageBlock>
            </body>
        </apex:form>
    </apex:page>

我查看了数十篇与此类似的帖子,但所有现有帖子要么 1) 处理将动态值(通常通过 JS 脚本定义)从 VFP 传递到通过按钮/selectList/等控件的控件。或者 2) 它们处理从控制器到 VFP 的传递变量;这两个都不是我需要的。我最接近解决方案的是使用此来源:https://salesforce.stackexchange.com/questions/24666/how-to-pass-javascript-value-to-controller ...但此示例需要使用 VFP 上的按钮。

不用说,我是 visualforce 的新手,但在 Python 方面有大约 4 年的编码经验(这并没有我希望的那么大)。任何如何实现这一点的示例将不胜感激!

【问题讨论】:

    标签: salesforce visualforce


    【解决方案1】:

    尝试使用 标签查看 标签,这应该可以让您到达您想去的地方。动作函数让您可以调用控制器方法,还可以让您将分配给属性的参数传递给您可以设置的值。

    <apex:actionFunction action="{!someMethod}" name="someMethodName" rerender="ifNeeded">
        <apex:param name="stageParam" assignTo="{!StageVal}" value="Closed Won" />
    </apex:actionFunction>
    

    加载后从javascript调用

    someMethodName('Closed Won')// you may be able to call without params since the value in the param is hard coded but not sure that would be something to test
    

    更新

    所以我创建了一个完整的示例页面,以便您更好地看到它的实际效果。

    VF 页面

    <apex:page controller="TestController" >
      <h1>Congratulations</h1>
          This is your new Page: Test
      <apex:form >
          <apex:actionFunction action="{!someMethod}" name="someMethodName" rerender="ifNeeded">
              <apex:param name="stageParam" assignTo="{!StageVal}" value="Closed Won" />
          </apex:actionFunction>
          <apex:outputPanel id="ifNeeded">{!StageVal} {!opps.size}
    
          </apex:outputPanel>
          <script>
              window.onload = function() {
                   someMethodName();//or someMethodName('Closed Lost'); to replace default of param variable
              }
          </script>
       </apex:form>
    </apex:page>
    

    控制器

    public class TestController {
    
        public String StageVal {get;set;}
    
        public List<Opportunity> opps {get;set;}
    
        public PageReference someMethod() {
            opps = [Select Name from Opportunity WHERE StageName = :StageVal];
            return null;
        }
    }
    

    发生了什么... actionfunction 标记声明了一个 js 函数,该函数将对控制器进行异步调用,参数按它们出现的顺序在 param 标记中列出。这会导致服务器端控制器调用的部分 postpack actionfunction标签的action属性指定的方法,actionfunction标签的name属性中js方法的名称。作为回发属性的一部分更新,因此您的参数可以在控制器中使用。

    【讨论】:

    • 感谢您的回复。这让我走上了正确的轨道,但我仍在努力完全理解。这是我添加的内容:
    • 有一个可能更简单的解决方案。您可以在 URL /apex/Page1?value=staticvalue 中传递参数,然后使用 Apexpages.CurrentPage().getParameters().get('value');或者在控制器中,只需使用 Apexpages.currentpage().getURL() 检查您在哪个 url 并根据 url 设置您的静态变量。
    • 是的,我没有提供该解决方案,因为用户可以轻松更改 URL 参数
    • @GarethJordan - 感谢您的帮助,现在一切正常!非常感谢您花时间在这方面 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2016-02-09
    相关资源
    最近更新 更多