Agregar marcadores de posición de formulario a campos de entrada de texto

22

¿Hay alguna manera de convertir un formulario normal y agregar marcadores de posición con un módulo, o debería hacerse con una plantilla de formulario o con jQuery?

chrisjlee
fuente

Respuestas:

31

Es un marcador de posición HTML5, solo puede agregarlo como un atributo a cualquier elemento y los navegadores habilitados para HTML5 reaccionarán en consecuencia:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Una función recursiva breve como esta podría ser útil si desea agregar automáticamente marcadores de posición para cada campo de texto en un formulario (basado en el título del campo en este ejemplo):

function MYMODULE_auto_placeholders(&$element) {
  if ( isset($element['#type']) && $element['#type'] == 'textfield') {
    // set placeholder
    $element['#attributes']['placeholder'] = $element['#title'];
    // hide label
    $element['#title_display'] = 'invisible';
  }
  foreach (element_children($element) as $key) {
    MYMODULE_auto_placeholders($element[$key]);
  }
}

Luego, en su formulario, alter function solo llame

MYMODULE_auto_placeholders($form);

Ese método funcionará para casi todos los campos de texto en un formulario, con la excepción de los que se agregan en #processfunciones (como los campos de texto alt y title de un campo de imagen, por ejemplo).

Clive
fuente
Resultado: Error: Llame a la función indefinida element_children () en bla_auto_placeholders () (línea 605 de themes / custom / BLA / bla.theme).
Thomas
15

Intenté la respuesta de Clive:

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['#attributes']['placeholder'] = t('Placeholder text');
  }
}

Pero para mi sorpresa, obtuve el marcador de posición en el contenedor del campo de texto, no en el campo de texto en sí. Luego probé una variación de la siguiente manera, ¡funcionó!

function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'some_form') {
    $form['some_element']['und'][0]['value']['#attributes']['placeholder'] = t('Placeholder text');
  }
}
Enrique
fuente
¡Gracias! Estaba empezando a volverme un poco loco, ni siquiera pensé en esto.
Mike Crittenden
¿Qué es el "some_element"? ¿Es la ID del elemento? ¿Cómo puedo encontrar esto?
sokratis
@sokratis puede obtener los ID de los elementos por dpm ($ form), aparecen en el primer nivel de $ form array. El siguiente es un ejemplo real de alterar la forma del comentario: <code> function MYMODULE_form_alter (& $ form, & $ form_state, $ form_id) {if ($ form_id == 'comment_node_post_form') {$ form ['subject'] ['# atributos '] [' marcador de posición '] = t (' Asunto '); $ form ['comment_body'] ['und'] [0] ['value'] ['# atributos'] ['placeholder'] = t ('Contenido'); }} </code>
Henry
15

Simplemente agregue el marcador de posición en la matriz de # atributos para el elemento del campo de formulario, como en el siguiente código.

   $form['my_textfield'] = array(
      '#type' => 'textfield',
      '#attributes' => array(
        'placeholder' => t('My placeholder text'),
      ),
    );
neelmeg
fuente
2
gracias, esto funcionó para mí en Drupal 8.
No Sssweat
funcionó muy bien en D8.
dresh
5

Tropecé con esto y pensé que la respuesta de Clive parecía agradable para agregar automáticamente marcadores de posición.

De todos modos, se necesitan algunos cambios menores para hacerlo bien en drupal 8, por lo que esta es la misma respuesta, pero adecuada para su tema de drupal 8.

/**
 * Implements hook_form_alter
 */
function THEME_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
  add_placeholders($form);
}


/**
 * Add placeholders to suitable form elements -> textfield, password, email, textarea
 */
function add_placeholders(&$element) {
  if(isset($element['#type']) && in_array($element['#type'], ['textfield', 'password', 'email', 'textarea'])) {
    $element['#attributes']['placeholder'] = $element['#title'];
  }
  foreach(\Drupal\Core\Render\Element::children($element) as $key) {
    add_placeholders($element[$key]);
  }
}
frysch
fuente
0

Si desea apuntar a una instancia de formulario directamente, use hook_form_FORM_ID_alter. Podría ser más ordenado que usar condicionales. Mi solución para orientar solo la instancia de bloque de formulario de búsqueda.

function eyecare_form_search_block_form_alter(&$form, $form_state) {
  $form['keys']['#attributes']['placeholder'] = t('Search');
}
Dr.ifle
fuente