2011-03-24 39 views
3

如何將'收音機'添加到圍繞theme_table構建的表單中?帶收音機的Drupal表

使用單個'複選框'或單個'收音機'似乎工作正常,但只要我使用'收音機',根本沒有單選按鈕。

從另一個堆棧溢出的問題,我已經看到form_process_radios()提到,並使用它實際上顯示單選按鈕。但是他們不再被束縛在一起,他們都可以立即進入「開啓」狀態。

任何想法?

回答

7

答案很簡單:你不能輕易。 (Allthough你可能在定義你自己的處理器方面取得了成功,使用expand_radios,hardcore的東西!)。

較長的回答:radios使用theme_radios。正如你所看到的那樣,它使用單個DIV包裝器,這使得無法在桌子上分配無線電。

你最好做的是創建一個分層表格,每個選項有一個radio。避免radios。通過將它們分層次分組,name將是相同的,這是radios are grouped的方式。

# from install.php: 
    foreach ($names as $profile => $name) { 
    $form['profile'][$name] = array(
     '#type' => 'radio', 
     '#value' => 'default', 
     '#return_value' => $profile, 
     '#title' => $name, 
     '#description' => isset($profiles[$profile]['description']) ? $profiles[$profile]['description'] : '', 
     '#parents' => array('profile'), 
    ); 
    } 

然後,在圍繞窗體構建表格的主題函數中,將每個無線電單元渲染到適當的表格單元格中。

0

我想,比如說你應該閱讀這種形式的回調:node_admin_nodes從node.admin.inc

+0

這是無關緊要的,據我所看到的。這既不是一張桌子,也不是收音機的。 – berkes 2011-03-24 09:54:58

6

因此,要使用Berkes建議,您必須使用'#atributes'屬性,併爲同一組的所有無線電元素使用相同的名稱。

這樣的:

'#attributes' => array('name' => array('somename')) 

這是一個比較完整的例子:

for ($i = 0; $i < $num; $i++){ 
    $element[$i]['answer'] = array(
    '#type' => 'textfield', 
    '#title' => t('Answer'), 
); 
    $element[$i]['correct'] = array(
     '#type' => 'radio', 
     '#value' => 'default', 
     '#return_value' => $i, 
     '#title' => t('Correct answer'), 
     '#attributes' => array('name' => array('correct-answer')), 
); 
} 
4

這裏是我得到了一個表裏面單選按鈕,使他們易於使用一個Drupal 7例:

$form['item']['table_start'] = array(
    '#markup' => '<table><thead><tr><th>Header 1</th><th>Header 2</th></tr></thead><tbody>' 
); 
for ($i = 1; $i < 3; $i++) { 
    $form['item']['tr_start_'.$i] = array('#markup' => '<tr>'); 
    $form['item'][$i]['item'] = array(
    '#type' => 'radio', 
    '#title' => t('Title'), 
    '#return_value' => $i, 
    '#prefix' => '<td>', 
    '#suffix' => '</td>', 
); 
    $form['item']['item_'.$i] = array('#markup' => '<td>'. $i .'</td>'); 
    $form['item']['tr_end_'.$i] = array('#markup' => '</tr>'); 
} 
$form['item']['table_end'] = array('#markup' => '</tbody></table>'); 

這使我可以在我的模板文件中使用0123來渲染整個表格部分,並在驗證中獲得所選的單選按鈕值並提交處理程序$form_state['values']['item']。單選按鈕已具有相同的名稱屬性,因此無需手動指定即可鏈接在一起。

+1

@volocuga theme_table()的存在並不意味着通過其他方式構建表格會自動「拉屎」。 Drupal 7引入了一個'tableselect'FAPI元素,但它並沒有涵蓋所有的用例,我目前不知道如何通過theme_table()來實現。如果你這樣做,將其作爲答案寫在這裏會更有幫助,而不是對我的不完善但堅實的工作解決方案進行惡意攻擊。 – Dooshta 2012-11-27 17:36:55

+0

是的,我可以理解這有點麻煩,但是這種解決方案可以直接使用,並且快速簡單。謝謝 :) – 2013-09-12 13:47:58