2011-10-26 28 views
1

所以我在我的形式創建我的複選框Drupal的形式API複選框的狀態

$form['existing_customer'] = array(
    '#type' => 'checkbox', 
    '#title' => t('Are you an existing customer'), 
    '#ajax' => array(
    'callback' => 'checkbox_selected', 
    'wrapper' => 'subject', 
),); 

這就需要我的功能,並在我的複選框改變值

問題是我不能讓它轉回來,如果它是未經檢查的

function checkbox_selected(&$form, &$form_state) { 
    if ($form_state['values']['existing_customer'] == 1) { 

     $my_options = array('select' => t('Select'), 'mr' => t('Mr'), 'mrs' => t('Mrs'), 'miss' => t('Miss'), 'ms' =>t('Ms'), 'sir' =>t('Sir'), 'dr' => t('Dr'), 'prof' => t('Prof')); 

    } 
    elseif ($form_state['values']['existing_customer'] == 0){ 
     $my_options = array('seconfZ' => t('jimmy'), 'mr' => t('Mr'),); 

    } 
    $form['subject'] = array(
     '#type' => 'select', 
     '#title' => t('Subject'), 
     '#options' => $my_options//$form['subject_options']['#value'] 
    ); 
    return $form['subject']; 
} 

我以爲我可以做一個開關複選框值或狀態,但沒有喜悅?

+0

你的回調是否實際上被調用?我沒有看到「回調」作爲表單API中的屬性,但我確實看到「#value_callback」 – jprofitt

+0

被調用,您是什麼意思「#value_callback」? – LeBlaireau

+0

您使用的是哪個版本?我通常用這個作爲參考,那是我沒有看到它的地方,所以我不確定你的方法是否被調用,以及它是否應該返回。 http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/7#value_callback – jprofitt

回答

1

通常情況下,當您使用表單API #ajax系統,您指定的wrapper實際上與其它元素之後drupal_html_id()已再次呼籲元素包裝所取代。所以我會在你的AJAX事件發生後檢查Firebug/Web Inspector中的「subject」元素的標記 - 我打賭現在wrapper div是「subject - 1」。

爲了解決這個問題,您需要手動爲要替換的項目設置一個包裝div,一個在重建表單時不會改變。例如,在您的表單構建器中:

$form['existing_customer'] = array(
    '#type' => 'checkbox', 
    '#title' => t('Are you an existing customer'), 
    '#ajax' => array(
    'callback' => 'checkbox_selected', 
    'wrapper' => 'subject-wrapper', 
), 
); 
$form['subject'] = array(
    '#prefix' => '<div id="subject-wrapper">', 
    ... 
    `#suffix' => '</div>', 
); 

希望有所幫助!

+0

我記得那個問題。我想我用一個非常冒險的解決辦法解決了這個問題,但這似乎是一個很可能的解決方案。將書籤作爲參考,我很快做一些形式。 – LeBlaireau