Add placeholder to all input fields in Drupal

Although this blog is wordpress I’d typically choose Drupal for doing any proper content-based website as it’s so easily flexible and supports multiple languages really easily out of the box. I was doing a site recently where we wanted to have mostly placeholders everywhere rather than form labels. This was unfortunately a bit tricky so I wrote the following code for the theme’s template.php to automatically put labels into the placeholders of input elements:

function THEME_form_alter(&$form, &$form_state, $form_id) {
    if( $form_id == 'user_register_form' ) {
        $form['account']['mail']['#title'] = t('Your Email Address');
    }
    if( $form_id == 'views_exposed_form' ) {
        foreach( $form as $key => &$config ) {
            if( !is_array($config) )
                continue;
            if( array_key_exists('#attributes', $config) )
                $config['#attributes']['placeholder'] = $config['#attributes']['title'];
        }

        $form['keys']['#attributes']['placeholder'] = $form['#info']['filter-keys']['label'];
        $form['#action'] = '';
    }

    //error_log( print_r( $form, TRUE ) . ' ' . $form_id );
    add_placeholder_check($form);
}

function add_placeholder_check(&$array) {
    if( !is_array($array) )
        return;

    foreach( $array as $key => &$config ) {
        if( !is_array($config) )
            continue;
        add_placeholder_check( $config );
        if( substr($key, 0, 1) != '#' && array_key_exists( '#title', $config ) ) {
            if( !array_key_exists('#attributes', $config) )
                $config['#attributes'] = array();
            $config['#attributes']['placeholder'] = $config['#title'];
        }
    }
}

Leave a Reply

Your email address will not be published. Required fields are marked *