8

I'm assigning an array named $enquiries_labels from php file to a smarty template file. If I print the array in PHP file it's output is as follows:

Array
(
    [0] => New Enquiry
    [1] => Retail Enquiry
    [2] => Feedback
    [3] => Payment Query
    [4] => Package Query
    [5] => Test Query
)

Now after assigning this array to a smarty file I want to access these values in a select HTML control. For it I need to use foreach loop construct of smarty template engine. If a pre-selected value is matching with the key from array then I'll keep that value selected. For achieving this I tried below code, but it didn't work for me. Can anyone help me in this regard please? For your reference I'm putting below the code I tried in smarty template:

<select name="contact_label" id="contact_label"> 
{if $enquiries_labels}
                  {foreach from=$enquiries_labels item=label}
                    <option value="{$label.key}" {if $data.key == $label.key} selected="selected" {/if}>{$label.value}
                    </option>
                  {/foreach}
                {/if}
      </select>

Thanks for spending some of your valuable time in understanding my issue.

1
  • In this special case (building options for a <select>) you could just use {html_options options=$enquiries_labels selected=$data.key name="contact_label" id="contact_label"}. Smarty will generate the complete <select> and <option> tags for you. Commented Sep 17, 2014 at 6:12

5 Answers 5

11

Use key in your foreach:

{foreach from=$enquiries_labels item=label key=key}
          <option value="{$key}" {if $data.key == $key} selected="selected" {/if}>{$label}
          </option>
{/foreach}

It's all there in the documentation.

Sign up to request clarification or add additional context in comments.

Comments

8

Smarty 3 foreach construction is like this

{foreach $products as $p}
    {$p@key}: {$p}
{/foreach}

2 Comments

This is so much simpler and elegant
Why not {foreach $products as $key => $p} ...?
2

Use the key attribute.

{foreach from=$enquiries_labels item="label" key="key"}
    <option value="{$key}"{if $data.key == $key} selected="selected"{/if}>{$label}</option>
{/foreach}

Comments

1

this also works

{foreach $products as $product}
    key: {$product@key} -> value: {$product@value} 
{/foreach}

{$product@value} = {$product}

Comments

0

You can do this:

{foreach $enquiries_labels as $key => $value}
  <option value="{$key}" {if $data.key == $key} selected="selected" {/if}>
    {$value}
  </option>
{/foreach}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.