尝试使用optgroups在Drupal 7表单选择框中循环遍历各个国家/地区

时间:2013-10-24 23:39:03

标签: forms loops drupal drupal-7 drop-down-menu

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

并且它在我不改变任何循环代码的情况下工作。

0 个答案:

没有答案