how is config saved in nodeapi_example module? In this module, which hook is responsible for saving the user choice (at admin/structure/types/manage/&lt;CONTENT_TYPE&gt;) into the database?

I implemented nodeapi_example_form_alter() function exactly as it is, but it is not saving anything.

My hook_form_FORM_ID_alter() in my .module - this does NOT save the value of my radio - anything missing here?

function followbtn_form_node_type_form_alter(&amp;$form, $form_state, $form_id) {
  // First, check for the node type configuration form.
  drupal_set_message('Entered hook_form_alter ...');
  //if ($form_id == 'node_type_form') {
  if (isset ($form['type'])) {
    // Alter the node type's configuration form to add our setting. We don't
    // need to worry about saving this value back to the variable, the form
    // we're altering will do it for us.
    $form['followbtn_rating'] = array(
      '#type' =&gt; 'fieldset',
      '#title' =&gt; t('Custom Rating settings'),
      '#collapsible' =&gt; TRUE,
      '#collapsed' =&gt; TRUE,
      '#group' =&gt; 'additional_settings',
      '#weight' =&gt; -1,
    );

    $form['followbtn_rating']['followbtn_node_type'] = array(
      '#type' =&gt; 'radios',
      '#title' =&gt; t('NodeAPI Example Rating - Custom'),
      '#default_value' =&gt; variable_get('followbtn_default_mode_' . $form['#node_type']-&gt;type, FALSE),
      '#options' =&gt; array(
        FALSE =&gt; t('Disabled'),
        TRUE =&gt; t('Enabled')
      ),
      '#description' =&gt; t('Should this node have a rating attached to it?'),
    );
  }
}


I can see the "Enabled" and "Disabled" radio buttons; when I hit "save Content Type", these do not get saved.
There is no hook that needs to be implemented by the module for that purpose: Saving the value is automatically done by Drupal. In that case, the value for the nodeapi_example_node_type form element is saved in the nodeapi_example_node_type_&lt;CONTENT_TYPE&gt; Drupal variable, which is the variable the module accesses for the default value.

// Compare the following line...
$form['rating']['nodeapi_example_node_type'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating'),

  // with the following.
  '#default_value' =&gt; variable_get('nodeapi_example_node_type_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled'),
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);


Similar code is used in locale_form_node_type_form_alter().

  if (isset($form['type'])) {
    $form['workflow']['language_content_type'] = array(
      '#type' =&gt; 'radios',
      '#title' =&gt; t('Multilingual support'),

      // The variabile name is &lt;FORM_ELEMENT_NAME&gt;_&lt;CONTENT_TYPE&gt;.
      '#default_value' =&gt; variable_get('language_content_type_' . $form['#node_type']-&gt;type, 0),


      '#options' =&gt; array(t('Disabled'), t('Enabled')),
      '#description' =&gt; t('Enable multilingual support for this content type. If enabled, a language selection field will be added to the editing form, allowing you to select from one of the &lt;a href="!languages"&gt;enabled languages&lt;/a&gt;. If disabled, new posts are saved with the default language. Existing content will not be affected by changing this option.', array('!languages' =&gt; url('admin/config/regional/language'))),
    );
  }


As for the purpose of the other node hook implementations:


nodeapi_example_node_delete() is called when a node is deleted
nodeapi_example_node_insert() is called when a node is inserted in the database
nodeapi_example_node_load() is called when a node is loaded
nodeapi_example_node_update() is called when a node is updated
nodeapi_example_node_validate() is called when data entered for a node need to be validated
nodeapi_example_node_view() is called when a node is being show


Notice that hook_node_update() and hook_node_insert() are mutually exclusive: Drupal calls one or the other, but not both the hooks at the same time. The first is called when an existing node is update; the second is called when a node is created.

In your code the error is the mismatch between the form element name (followbtn_node_type) and the name of the Drupal variable you are using (followbtn_default_mode_&lt;CONTENT_TYPE&gt;). You need to change your code in one of the following ways:

$form['followbtn_rating']['followbtn_node_type'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating - Custom'),
  '#default_value' =&gt; variable_get('followbtn_node_type_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled')
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);




$form['followbtn_rating']['followbtn_default_mode'] = array(
  '#type' =&gt; 'radios',
  '#title' =&gt; t('NodeAPI Example Rating - Custom'),
  '#default_value' =&gt; variable_get('followbtn_default_mode_' . $form['#node_type']-&gt;type, FALSE),
  '#options' =&gt; array(
    FALSE =&gt; t('Disabled'),
    TRUE =&gt; t('Enabled')
  ),
  '#description' =&gt; t('Should this node have a rating attached to it?'),
);