我正在使用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上做了一个var_dump,我就不会得到实际记录,我会得到关于查询和执行的实际查询的一堆信息等等。也许我需要使用特定类型的获取方法。无论如何,我最终把它切换到:
$states = db_select('states', 's')
->fields('s')
->execute()
->fetchAll();
并且它在我不改变任何循环代码的情况下工作。