Undesired toggle effect with #states and checkboxes I'm working on a patch for the Login Disable module, and on the settings page, I want to have two mutually exclusive options so that when one is checked, the other is unchecked. Using the FAPI #states value, I have the following code:

function login_disable_settings_form($form, &amp;$form_state) {
  $form = array();

  $form['all_users'] = array(
    '#type' =&gt; 'fieldset',
    '#title' =&gt; t('All Users'),
    '#collapsible' =&gt; TRUE,
    '#collapsed' =&gt; FALSE,
  );

  $form['all_users']['login_disable_is_active'] = array(
    '#type' =&gt; 'checkbox',
    '#title' =&gt; 'Prevent user log in',
    '#description' =&gt; t('When active the user login form will be disabled for everyone. For roles granted bypass rights they must use the access key defined below.'),
    '#default_value' =&gt; (bool)variable_get('login_disable_is_active', FALSE),
    '#states' =&gt; array(
      'unchecked' =&gt; array(
        ':input[name="login_disable_individual"]' =&gt; array('checked' =&gt; TRUE),
      ),
    ),
  );

  $form['all_users']['login_disable_key'] = array(
    '#title' =&gt; t('Access key (optional)'),
    '#description' =&gt; t('For added security, a word can be required to be added to the URL.'),
    '#type' =&gt; 'textfield',
    '#size' =&gt; 10,
    '#default_value' =&gt; variable_get('login_disable_key', 'admin'),
  );
  if (!empty($form['login_disable_key']['#default_value'])) {
    $form['login_disable_key']['#description'] .= '&lt;br /&gt;' . t('The URL to use to log in is: @url', array('@url' =&gt; url('user/login') . '?' . $form['login_disable_key']['#default_value']));
  }

  $form['all_users']['login_disable_message'] = array(
    '#title' =&gt; t('End-user message when login is disabled'),
    '#description' =&gt; t('The message to display to users when login has been disabled.'),
    '#type' =&gt; 'textfield',
    '#size' =&gt; 80,
    '#default_value' =&gt; variable_get('login_disable_message', t('Member access has been temporarily disabled. Please try again later.')),
  );

  $form['individual'] = array(
    '#type' =&gt; 'fieldset',
    '#title' =&gt; t('Indivdual'),
    '#collapsible' =&gt; TRUE,
    '#collapsed' =&gt; FALSE,
  );

  $form['individual']['login_disable_individual'] = array(
    '#type' =&gt; 'checkbox',
    '#title' =&gt; t('Disable on user profile'),
    '#description' =&gt; t('Checking this box allows disabling individual logins on user profile pages.'),
    '#states' =&gt; array(
      'unchecked' =&gt; array(
        ':input[name="login_disable_is_active"]' =&gt; array('checked' =&gt; TRUE),
      ),
    ),
  );

  $form = system_settings_form($form);

  return $form;
}


So as I see it, my code should just uncheck a checkbox when the other checkbox is checked. I also want the option that neither is checked.  However, what's happening is that they are working as a toggle, in that if I uncheck one, the other one is being checked, which is prohibiting the third option of neither of them being checked. Can anyone tell me why I'm getting this effect?

Thanks.
Form API states act in both directions. Suppose you set an element to be unchecked if a condition X is true. Then it gets unchecked when X becomes true, and gets non unchecked (i.e. checked) when X becomes false. See the example code and its demo at drupal.org.

You need some custom jQuery in the case.