Friday, April 22, 2022

[FIXED] How to retrieve a value from a query string that stems from a <select> form input?

Issue

I simply need to get the selected value from a query string. Currently I just get the index of the list and not the actual value. I cant use Post as I need the value for a pagination search.

I dont get an error but just the number of the index of the list returned. The answer must be simple and I have tried many combinations. I have tried ['Student'] in front of the query as well.

I just couldnt see the answer in the docs and previous posts on this topic didnt work for me either. I am stuck.

The query string has a number {url}students/myindex5?address_suburb=1 //suburb should be a string and it appears as a string in the drop down list

public function myindex5() {

    $this->set('filterSuburb', $this->Student->find('list', array(
        'fields' => array('Student.address_suburb')
    )));

    $havefilter = false;        
    $tsub = $this->request->query['address_suburb'];  
    // $tsub = array_combine($tsub, $tsub);//didnt work
    debug($tsub); //I just get the index value of the list

    if (!empty($tsub)) {
        // ...

View

echo $this->Form->create('Student', array(
    'type' => 'get',
    'url' => array('controller' => 'students', 'action' => 'myindex5')
));
echo $this->Form->input('address_suburb', array(
    'options' => $filterSuburb,
    'empty' => '(choose one)')
);
echo $this->Form->end('Search'); 

For reference


Solution

When you use a select input, the value send is the value of the option tag:

<select>
    <option value="1">Option 1</option>
</select>

If I choose "Option 1", you will get 1, not "Option 1".

If you want to change the value attribute, you need to set something else to the FormHelper::input method options parameter, something like:

array(
    'value1' => 'Text 1',
    /** etc. **/
);

If you want your value to be ids of Student, just change your find call to:

$this->set('filterSuburb', $this->Student->find('list', array(
    'fields' => array('Student.id', 'Student.address_suburb')
)));

If you look at find('list') documentation, you'll see this:

When calling find('list'), the fields passed are used to determine what should be used as the array key and value, and optionally what to group the results by.

So passing Student.id and Student.address_suburb will output a select with Student.id as option value and Student.address_suburb as option text.

If you want something else than Student.id, just change it in the find('list') call, you can even change it to have option like <option value="redcliff">redcliff</option> (same value and text), by doing:

$this->set('filterSuburb', $this->Student->find('list', array(
    'fields' => array('Student.address_suburb', 'Student.address_suburb')
)));


Answered By - Holt
Answer Checked By - Gilberto Lyons (PHPFixing Admin)

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.