我正在使用 Drupal 7 表单 API 创建一个表单。我的一个领域是国家和州的选择框。我只使用5个国家。目标是使选择框具有国家/地区的选项组,并在该选项下为该国家/地区的每个州/省提供选项组。在 HTML 中应该是这样的:
<select>
<optgroup label="United States">
<option value="AK">Arkansas</option>
<option value="AL">Alabama</option>
...
<optgroup label="Canada">
<option value="AB">Alberta</option>
<option value="ON">Ontario</option>
...
</select>
我有一个硬编码的国家/地区数组,并且我从 dB 中获取了包括国家名称在内的州。我正在尝试为选择框构建选项数组,但由于某种原因,它仅适用于列表中的第一个国家/地区,在本例中为美国。这是我的代码:
// get list of states from dB
$states = db_query('SELECT state_code, state_name, country_name FROM {states}');
$countries = array(
'US' => 'United States',
'CAN' => 'Canada',
'AU' => 'Australia',
'NZ' => 'New Zealand',
'BM' => 'Bermuda'
);
foreach($countries as $country_code => $country_name) {
$states_options[$country_name] = array();
foreach($states as $state) {
if($country_name == $state->country_name) {
$states_options[$country_name][$state->state_code] = $state->state_name;
}
}
}
$form['location'] = array(
'#type' => 'select',
'#options' => $states_options,
'#required' => FALSE,
);
最终产生:
<select style="width:80%;" id="edit-location" name="location" class="form-select">
<optgroup label="United States">
<option value="AK">Alaska</option>
<option value="AL">Alabama</option>
<option value="AR">Arkansas</option>
<option value="AZ">Arizona</option>
<option value="CA">California</option>
<option value="CO">Colorado</option>
<option value="CT">Connecticut</option>
<option value="DC">District Of Columbia</option>
<option value="DE">Delaware</option>
<option value="FL">Florida</option>
<option value="GA">Georgia</option>
<option value="HI">Hawaii</option>
<option value="IA">Iowa</option>
<option value="ID">Idaho</option>
<option value="IL">Illinois</option>
<option value="IN">Indiana</option>
<option value="KS">Kansas</option>
<option value="KY">Kentucky</option>
<option value="LA">Louisiana</option>
<option value="MA">Massachusetts</option>
<option value="MD">Maryland</option>
<option value="ME">Maine</option>
<option value="MI">Michigan</option>
<option value="MN">Minnesota</option>
<option value="MO">Missouri</option>
<option value="MS">Mississippi</option>
<option value="MT">Montana</option>
<option value="NC">North Carolina</option>
<option value="ND">North Dakota</option>
<option value="NE">Nebraska</option>
<option value="NH">New Hampshire</option>
<option value="NJ">New Jersey</option>
<option value="NM">New Mexico</option>
<option value="NV">Nevada</option>
<option value="NY">New York</option>
<option value="OH">Ohio</option>
<option value="OK">Oklahoma</option>
<option value="OR">Oregon</option>
<option value="PA">Pennsylvania</option>
<option value="PR">Puerto Rico</option>
<option value="RI">Rhode Island</option>
<option value="SC">South Carolina</option>
<option value="SD">South Dakota</option>
<option value="TN">Tennessee</option>
<option value="TX">Texas</option>
<option value="UT">Utah</option>
<option value="VA">Virginia</option>
<option value="VT">Vermont</option>
<option value="WA">Washington</option>
<option value="WI">Wisconsin</option>
<option value="WV">West Virginia</option>
<option value="WY">Wyoming</option>
<option value="VI">U.S. Virgin Islands</option>
<option value="GU">Guam</option>
</optgroup>
<optgroup label="Canada">
</optgroup>
<optgroup label="Australia">
</optgroup>
<optgroup label="New Zealand">
</optgroup>
<optgroup label="Bermuda">
</optgroup>
</select>
更新:
好的,所以我发现这是因为我构建查询的方式。我最初使用这个:
$states= db_query('SELECT state_code, state_name, country_name FROM {states}');
这给了我我需要的东西,我可以做一个 foreach 并循环 $states 并很好地回显这些值,但是如果我在 $states 上做了一个 var_dump,我不会得到实际的记录,我会得到一堆有关查询和执行的实际查询等的信息。也许我需要使用特定类型的 fetch 方法。无论如何,我最终将其切换为:
$states = db_select('states', 's')
->fields('s')
->execute()
->fetchAll();
它在我没有更改任何循环代码的情况下工作。