Displaying duplicate options values in a select with CakePHP
Using the form helper in CakePHP 1.3, I'm trying to display开发者_Go百科 a list (drop-down list) which contains several duplicated value fields (in <option>
tag of course), but Cake does not seem to want to let me do it, and outputs only the first occurrence of each value.
array(
0 => 'description 0',
0 => 'description 1',
0 => 'description 2',
1 => 'description 3'
);
Which will output something like:
<select>
<option value="0">description 0</option>
<option value="1">description 3</option>
</select>
And I'm looking for this result:
<select>
<option value="0">description 0</option>
<option value="0">description 1</option>
<option value="0">description 2</option>
<option value="1">description 3</option>
</select>
Of course you cannot use the same key twice in an array in PHP.
But as stated on this article cake knows how to make multiple keys with the same value in 2.x:
$options = array(
...
array('name' => 'United states', 'value' => 'USA'),
array('name' => 'USA', 'value' => 'USA'),
);
$html = $this->Form->select('field', $options);
resulting in
<option value="USA">United states</option>
<option value="USA">USA</option>
As you can see, you got your value here twice (or more of course) now.
See the documentation of the form helper class itself (cake2.x). Not sure if 1.3 does already support it, though.
If you upgrade, you will be able to leverage all of cake's newest magic.
So as feared the problem was deeper than I first thought , and it was caused by PHP which does not (obviously) allow duplicate keys.
So here's my solution (if anyone's interested in):
- Create a new helper extending the FormHelper
- Copy the original function
__selectOptions()
from the form helper into your new helper - Just change this line:
foreach ($elements as $name => $title) {
by :foreach ($elements as $title => $name) {
- Done!
It's not the best solution as if you want to update your cakephp to the latest version after doing that, you have to copy/paste the function again, and do the same trick.
How to use it:
- Declare your
options
array the other way around :array('description' => 'key);
- In your view, instead of doing
$form->input
, just do$yourhelper->input
Nicolas.
精彩评论