Let users choose from pre-defined user set options for creating a node I want to provide the ability for users to make and save a set of pre-defined options when they create a node. 

They can then choose from their predefined set of options when creating future nodes.

(At the moment I allow users to create nodes with a custom form, I could possibly switch to the standard add node method but I'd prefer not to, unless it's a lot easier.)

Has anyone on here tried this before? At a high level, how did you go about trying to save user presets?
I find using a custom form always seems to be more work then just using the one Drupal provides to add nodes. Even if they are not quite what you want hook_form_alter makes it easy to modify them to suit your needs.

I would create an unpublished node for each of my 'presets'. This way it is easy for an administrator to update the preset values, but normal user won't be able to see them.

Then using hook_form_alter I would add a selectbox to the top of the node add form allowing the users to choose between any of the presets. You could add an #ajax property to the selectbox that rebuilds the whole form.

Again in hook_form_alter if $form_state['values']['yourselectbox'] is not empty then you can load the values from that node and populate the form with them.

As an example (none of this code is tested but I think should be almost right):

function mymodule_form_alter($form, &amp;$form_state, $form_id) {

    $templates = db_query("SELECT nid, title FROM node WHERE type='my_type' AND status=1")-&gt;fetchAllKeyed();
    // TODO: Should maybe add a field to control if this node is a template or not?
    $default_template = 0;

    if(!empty($form_state['values']['templates'])) {
        $default_template = $form_state['values']['templates'];

        $selected_template = node_load($default_template);

        // if your fields have multiple values you will need to loop here
        $form['other_field_1'][LANGUAGE_NONE][0]['#value'] = $selected_template['other_field_1'][LANGUAGE_NONE][0]['#value']
        $form['other_field_2'][LANGUAGE_NONE][0]['#value'] = $selected_template['other_field_2'][LANGUAGE_NONE][0]['#value']

    }

    $form['#prefix'] = '&lt;div id="whole_form_wrapper"&gt;';
    $form['#suffix'] = '&lt;/div&gt;';

    $form['templates'] = array(
        '#type' =&gt; 'select',
        '#title' =&gt; 'Template',
        '#options' =&gt; $templates,
        '#default_value' =&gt; $default_template,
        '#ajax' =&gt; array(
            'callback' =&gt; 'change_template_callback',
            'wrapper' =&gt; 'whole_form_wrapper',
            'event' =&gt; 'change',
        ),
    );

}

function change_template_callback($form, $form_state) {
    return $form;
}


See the examples module - it has loads of good stuff on forms and ajax.