The link posted by Linda is a gem! Unfortunately, its broken now. Just retrieved the content of that through time back machine:
Step 1: Register the form elements (The widget Control)
function kk_in_widget_form($t,$return,$instance){
$instance = wp_parse_args( (array) $instance, array( 'title' => '', 'text' => '', 'float' => 'none') );
if ( !isset($instance['float']) )
$instance['float'] = null;
if ( !isset($instance['texttest']) )
$instance['texttest'] = null;
?>
<p>
<input id="<?php echo $t->get_field_id('width'); ?>" name="<?php echo $t->get_field_name('width'); ?>" type="checkbox" <?php checked(isset($instance['width']) ? $instance['width'] : 0); ?> />
<label for="<?php echo $t->get_field_id('width'); ?>"><?php _e('halbe Breite'); ?></label>
</p>
<p>
<label for="<?php echo $t->get_field_id('float'); ?>">Float:</label>
<select id="<?php echo $t->get_field_id('float'); ?>" name="<?php echo $t->get_field_name('float'); ?>">
<option <?php selected($instance['float'], 'none');?> value="none">none</option>
<option <?php selected($instance['float'], 'left');?>value="left">left</option>
<option <?php selected($instance['float'], 'right');?> value="right">right</option>
</select>
</p>
<input type="text" name="<?php echo $t->get_field_name('texttest'); ?>" id="<?php echo $t->get_field_id('texttest'); ?>" value="<?php echo $instance['texttest'];?>" />
<?php
$retrun = null;
return array($t,$return,$instance);
}
Step 2: Save the Widget input data:
function kk_in_widget_form_update($instance, $new_instance, $old_instance){
$instance['width'] = isset($new_instance['width']);
$instance['float'] = $new_instance['float'];
$instance['texttest'] = strip_tags($new_instance['texttest']);
return $instance;
}
Step 3: Display the value in widget output:
function kk_dynamic_sidebar_params($params){
global $wp_registered_widgets;
$widget_id = $params[0]['widget_id'];
$widget_obj = $wp_registered_widgets[$widget_id];
$widget_opt = get_option($widget_obj['callback'][0]->option_name);
$widget_num = $widget_obj['params'][0]['number'];
if (isset($widget_opt[$widget_num]['width'])){
if(isset($widget_opt[$widget_num]['float']))
$float = $widget_opt[$widget_num]['float'];
else
$float = '';
$params[0]['before_widget'] = preg_replace('/class="/', 'class="'.$float.' half ', $params[0]['before_widget'], 1);
}
return $params;
}
Step 4: Now call your functions above with wordpress action hooks:
//Add input fields(priority 5, 3 parameters)
add_action('in_widget_form', 'kk_in_widget_form',5,3);
//Callback function for options update (priorität 5, 3 parameters)
add_filter('widget_update_callback', 'kk_in_widget_form_update',5,3);
//add class names (default priority, one parameter)
add_filter('dynamic_sidebar_params', 'kk_dynamic_sidebar_params');
Source