0

我正在使用 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();

它在我没有更改任何循环代码的情况下工作。

4

0 回答 0