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.

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.


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]);
        }
    }
}

¡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.


¿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']);
   }
 }
}

+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.


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"]);
    } 
}

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.'));
}
}

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


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;
      } 
    }
  }
}

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.