6

So I have built an apex page as follows...

    <apex:pageBlockSection >
                <apex:inputField value="{!Tree__c.Tree_Type__c}" />
                <apex:inputField value="{!Tree__c.Diseases__c}" />
            </apex:pageBlockSection>

  <apex:outputPanel >
                    <apex:commandButton value="Search" action="{!doSearch2}"
                        reRender="block" status="status" />
                </apex:outputPanel>

And I have built a controller as follows (I am trying to get a few fields working to start with, hence the code comments...

           soql = 'Select Tree_Type__c, Tree_Surgeon__c, Diseases__c, Status__c, Date_of_Planting__c, Native_breed__c from Tree__c WHERE';
    if (!varTreeType.equals(''))
      soql += ' Tree_Type__c LIKE "+varTreeType+"';

  //  if (!lastName.equals(''))
  //    soql += ' and lastname LIKE "+lastName+"';

  //  if (!accountName.equals(''))
  //    soql += ' and account.name LIKE "+accountName+"';

  //  if (!technology.equals(''))
  //    soql += ' and interested_technologies__c includes ("+technology+")';

How do I get the values of the VisualForce form fields, and use them within the query?

2
  • Are you trying to create a search form, or a data entry form? In general to preserve data access rules you want to create either one or the other?
    – pchittum
    Nov 26, 2014 at 13:20
  • @Peter I am building a simple search form, that will display list of objects matching the criteria, the user can then select these items and go to a edit/print form. Nov 26, 2014 at 13:24

4 Answers 4

3

Assuming you are using the tree fields because they are values such as picklists, and that you are using a controller extension, this code will build the dynamic query making use of bind variables which are safe from SOQL injection attack:

private ApexPages.StandardController sc;

public MyController(ApexPages.StandardController sc) {
    this.sc = sc;
}

private void yourQueryMethod() {

    Tree__c filter = (Tree__c) sc.getRecord();

    String[] wheres = new String[] {};
    String treeTypeLike;
    String diseasesLike;
    ...
    if (filter.Tree_Type__c != null) {
        wheres.add('Tree_Type__c LIKE :treeTypeLike');
        treeTypeLike = '%' + filter.Tree_Type__c + '%';
    }
    if (filterDiseases__c != null) {
        wheres.add('Diseases__c LIKE :diseasesLike');
        diseasesLike = '%' + filter.Diseases__c + '%';
    }
    ...
    String soql = 'Select ... from Tree__c'
            + (wheres.size() > 0 ? ' WHERE ' : '')
            + String.join(wheres, ' AND ');
    ....
}
5
  • Implementing this (and deleting my old constructor) gives me an meaningless error - Unknown constructor MySecondController.MySecondController(ApexPages.StandardSetController controller) Nov 26, 2014 at 14:16
  • 1
    @buzzlightyear The constructor name has to be the same as you class name.
    – Keith C
    Nov 26, 2014 at 14:45
  • it is the same ;) Nov 26, 2014 at 14:46
  • @buzzlightyear Are you intentionally or accidentally using StandardSetController? To use that you page needs to define the recordSetVar in the apex:page.
    – Keith C
    Nov 26, 2014 at 15:01
  • With lots of modification of controllers. I have managed to resolve the issue using your solution. Nov 26, 2014 at 16:25
0

Try removing the double quotes like this :

soql = 'Select Tree_Type__c, Tree_Surgeon__c, Diseases__c, Status__c, Date_of_Planting__c, Native_breed__c from Tree__c WHERE';
    if (!varTreeType.equals(''))
      soql += ' Tree_Type__c LIKE ' + varTreeType;
6
  • As the code is in the controller class, it does not recognize the variable from the visualforce page. Nov 26, 2014 at 13:26
  • How do you get/construct the varTreeType variable in your controller ?
    – SF_user
    Nov 26, 2014 at 13:28
  • I was usingString varTreeType = Apexpages.currentPage().getParameters().get('treeType'); however this only works with URL parameters? Nov 26, 2014 at 13:30
  • Yes, it gets the value of the URL parameter treeType.
    – SF_user
    Nov 26, 2014 at 13:34
  • 1
    Passing URL parameters as search criteria opens your code to vulnerability. I suggest avoiding that.
    – pchittum
    Nov 26, 2014 at 13:42
0

You could use

<apex:inputField value="{!treeType}" />
<apex:inputField value="{!diseases}" />

in your Visualforce page. Do not forget to make properties in your controller class:

public String treeType { get; set; }
public String diseases { get; set; }

and this will change values of your properties depending on your text in your inputFields. Then you could build a query like that:

soql = 'SELECT Tree_Type__c, Tree_Surgeon__c, Diseases__c, Status__c, Date_of_Planting__c, Native_breed__c FROM Tree__c WHERE';
if (!treeType.equals(''))
  soql += ' Tree_Type__c LIKE \'' + treeType + '\'';

Note the \'. Backslash and single quote will force your string to have a single quote inside it without closing the string(for more info read about Escape Character).

0

Your form will need a few text boxes like this:

<form>
<apex:pageBlock>
 <apex:pageBlockButtons>
  <apex:commandButton action="{!doSearch}" value="Search"/>
 </apex:pageBlockButtons>
 <apex:pageBlockSection>
  <apex:pageBlockSectionItem>
    <apex:outputLabel value="Tree Type"/>
    <apex:inputText value="{!varTreeType}" />
  </apex:pageBlockSectionItem>
  <apex:pageBlockSectionItem>
    <apex:outputLabel value="Last Name"/>
    <apex:inputText value="{!lastName}" />
  </apex:pageBlockSectionItem>
  etc...
 </apex:pageBlockSection>
</apex:pageBlock>  
</form>

You will then need some properties in your controller that will bind to these:

public String varTreeType {get;set;}
public String lastName {get;set;}

The doSearch in the command button would just bind to the method you've already created that is invoking the string search. One important thing, though is that you want to make sure to prevent SOQL injection. So a safer implementation of these properties would be:

public String varTreeType {
  get;
  set {
    varTreeType = String.escapeSingleQuotes(value);
  }
}

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .