Forms: Creating a check box select and setting it's defaults from a query

Last modified: January 5, 2008 - 17:30

I did not understand this right away myself so I figured I would share it to save someone else some time.
What was easy is now hard as I work with the FAPI (though it does seem overall alot better then by hand)
So the situation is this. I have a table that stores user's subscribed content types.
And I have a table that stores allowed Content Types users can subscribe to.
So by querying the Content type table I get a checkbox list of items.
But I also want to set the ones as checked that the user already has chosen.
Here is the form

function buyctsubs_user_settings() {
//$form = array();
global $user;
/**
* create the node type array with ID and nice names
*
*/
$sql = "SELECT bt.type_id as TypeID, nt.name as Proper FROM {buyctsubs_type} as bt LEFT JOIN {node_type} as nt on nt.type LIKE bt.type_name ";
$result = db_query($sql);
  while ($data = db_fetch_object($result)) {
$vars[$data->TypeID] = $data->Proper; //this builds the form from the table of allowed content types
}

/**
*Need to make a query to get and set users defauls
*This also prevents type from showing up that are not allowed
*/
$sql = "SELECT t.type_id as TypeID, nt.name as Proper
FROM {buyctsubs_type} AS t
LEFT JOIN {buyctsubs_user} AS u ON u.type_id LIKE t.type_id
LEFT JOIN {node_type} as nt on nt.type LIKE t.type_name
WHERE u.user_id = %d";
//echo $sql;
$result = db_query($sql, $user->uid);
  while ($data = db_fetch_object($result)) {
$users_vars[] = $data->TypeID; // this sets the defaults in a way that is needed for below note it differs from above
}

$form['buyctsubs_user_settings'] = array(
     '#type' => 'checkboxes',
     '#title' => t('Users may subscribe these node types'),
     '#options' => $vars, ***HERE IS ONE VARIABLE***
     '#default_value' => $users_vars,   ***HERE IS ANOTHER VARIABLE(see note below)***
     '#description' => t('Choose as many as you want'),
  );

  $form['array_filter'] = array('#type' => 'hidden');
  $form['submit'] = array(
   '#type' => 'submit',
   '#value' => t('Save')
);
if(isset($_POST[submit])){
drupal_set_message(t("Your settings have been saved"));
}
return $form;
//  return system_settings_form($form);
}

That is it, now this form minus the ***HERE IS ONE VARIABLE*** callouts, makes a check list of preselected content types so the user know what they already have chosen and can remove or add to the list. I ran into trouble because I tried using the $users_vars[] = $data->TypeID like the $vars[$data->TypeID] = $data->Proper but after removing the first part of the array and just using the values value and not the name as well it was fine.
Simple but not like I was use to before FAPI.

 
 

Drupal is a registered trademark of Dries Buytaert.