Agregar marcador de posición HTML5 a todos los formularios de drupal

22

Estoy tratando de agregar el atributo de marcador de posición a todos los campos de texto en mi sitio web, pero no tengo suerte.

He creado un módulo que anula hook_form_alter

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $value['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

Debo decirle que también estoy usando el módulo de formulario web.

Josua Pedersen
fuente

Respuestas:

14

Como estoy usando el módulo de formulario web, podría crear un tema para la plantilla global de formulario web (webform-form.tpl.php) y ponerla en mi carpeta de temas. No es necesario complicar las cosas con un módulo.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}

Puse esto en la parte superior del archivo de plantilla.

Josua Pedersen
fuente
3
Esto puede generar algún error de "índice indefinido" al hacer el bucle foreach, recuerde verificar si el índice está configurado ()
Matteo
10

Cambie ligeramente a ...

function mymodule_form_alter(&$form, &$form_state, $form_id)
{
    foreach ($form as $key => $value) {
        if ("textfield" == $value["#type"]){
            $form[$key]['#attributes']["placeholder"] = t($value["#title"]);
        }
    }
}

$value en cada alcance, el tipo de valor no es una referencia.


EDITAR:

Acabo de experimentar con el siguiente código y logré iterar recursivamente todo el formulario para que los campos de texto editen sus atributos.

function add_placeholder(&$form){
    foreach($form as $key => $val){
        if(substr($key,0,1) == '#' && $form[$key] == 'textfield'){
            $form['#attributes'] = array('placeholder' => t('some text'));
        }else if(is_array($form[$key])){
            add_placeholder($form[$key]);
        }
    }
}
Shoaib Nawaz
fuente
¡Gracias por tu ayuda! Debería haberlo visto yo mismo. Debido a que no está resolviendo mi problema original, no puedo otorgarle una respuesta correcta.
Josua Pedersen
4

Probablemente podría hacer eso con hook_form_altero hook_form_FORM_ID_altery agregando el atributo "marcador de posición"

por ejemplo, no probado, pero algo como:

/**
 * Implements hook_form_FORM_ID_alter
 */
function mymodule_form_webform_client_form_12_alter(&$form, &$form_state) {
  drupal_set_message('<pre>'.print_r($form,1).'</pre>'); // debug form
  $form['submitted']['my_form_component']['#attributes'] = array('placeholder' => 'placeholder 1');
}

Busque el elemento de formulario oculto en el formulario web HTML nombrado form_idpara obtener la identificación de formulario correcta para el form_alternombre de la función.

David Thomas
fuente
¿tendré que hacer un módulo para esto?
1
Puede hacer un módulo o configurarlo en template.php de su tema, cambiando mymodule por el nombre de la máquina de la plantilla.
mariomc
¿Funcionará este código también para D6?
Bala
4

Un mejor enfoque para el código de Josua Pedersen:

foreach ($form['submitted'] as $key => $value) {
 if (isset($form['submitted'][$key])) {
   $types = array('textfield', 'webform_email', 'textarea');

   if (isset($value['#type']) && in_array($value['#type'], $types)) {
     $form['submitted'][$key]['#attributes']['placeholder'] = t($value['#title']);
   }
 }
}
Sohail
fuente
+1, este código funciona muy bien, acabo de copiar y pegar en mi módulo personalizado, con drupal 6, pero recibí esta advertencia de error: Argumento no válido proporcionado para foreach () en C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module en la línea 16.
Bala
1
Lo resolví colocando dentro de la condición if. if (isset ($ form_state ['webform'])) {el código anterior va aquí ..}
Bala
3

En su código, cambia la variable $valueque nunca cuando se asocia de nuevo a la variable $form, cuál se pasa por referencia.

En claro, haces algunos cambios pero no lo envías a Drupal.

Además, puede hacerlo así (no lo he probado, pero en teoría debería funcionar).

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $keys = element_children($form);
  foreach ($keys as $key) {
    if (in_array(array('textfield', 'textarea'), $form[$key]['#type'])) {
      if (!empty($form[$key]['#title'])) {
        $placeholder = array('placeholder' => t($form[$key]['#title']));
        if (is_array($form[$key]['#attributes'])) {
          $form[$key]['#attributes'] = array_merge($form[$key]['#attributes'], $placeholder);
        }
        else {
          $form[$key]['#attributes'] = $placeholder;
        }
      }
    }
  }
}

Era flojo agregar un cheque fieldsety agregar marcador de posición a los niños. Pero supongo que puedes cambiarlo muy fácilmente.

yvan
fuente
3

Una ligera mejora en la solución de archivo de plantilla de @ Josua: este código también agregará texto de marcador de posición a los campos de correo electrónico de formularios web.

foreach ($form["submitted"] as $key => $value) {
    if ("textfield" == $value["#type"]) {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    }
    if($value['#type'] == "webform_email") {
        $form["submitted"][$key]['#attributes']["placeholder"] = t($value["#title"]);
    } 
}
Steven B
fuente
Para ser una verdadera mejora, debe hacer 2 cosas: 1) verificar el índice que se establecerá 2) usar una sintaxis mejor para verificar los diferentes casos
Matteo
2

usando hook_form_alter intente esto

function mymodule_survey_builder_form_alter(&$form, &$form_state, $form_id) {    
 if ($form_id == 'form_builder_field_configure') {
        $form['title']['#attributes']=array('placeholder' => t('Please enter the Qustion(English) name here.'));
}
}
Mohamed Ibrahim
fuente
1

Para cualquiera que use una versión anterior u obsoleta del módulo Webform de Drupal , vale la pena señalar que se agregó soporte de marcador de posición en 7.x-4.x branch(junio de 2013).

Por lo tanto, la funcionalidad de marcador de posición HTML5 ahora es una opción nativa incorporada junto con clases CSS personalizadas para componentes y varias otras características solicitadas desde hace mucho tiempo.

Aquí hay una captura de pantalla de cómo aparece la nueva funcionalidad:

Configuración del componente de formulario web de Drupal que muestra soporte de marcador de posición HTML5

rjb
fuente
0

En la mayoría de los casos, supongo, uno solo querría agregar atributos de marcador de posición en algunos formularios.

Si desea agregar marcador de posición a todos los formularios web, puede hacerlo así:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  // If webform, add "placeholder" attributes to all textfields
  // got code here:http://drupal.stackexchange.com/questions/12706/adding-html5-placeholder-to-all-drupal-forms
  if (isset($form['#node']->type) && ($form['#node']->type == 'webform')) {
    foreach ($form["submitted"] as $key => $value) {
      switch ($value["#type"]) {
        case 'textfield':
        case 'textarea':
        case 'webform_email':
          $form["submitted"][$key]['#attributes']["placeholder"] = $value["#title"];
          break;
      } 
    }
  }
}
rosell.dk
fuente
0

Simplemente use el módulo para ello: Sugerencias de formulario web

Es exactamente lo que necesitas. Es fácil de administrar y no hay necesidad de código personalizado. Este módulo también proporciona soporte para navegadores heredados que no admiten el atributo de marcador de posición.

ANDiTKO
fuente