Ajout d'un espace réservé HTML5 à tous les formulaires Drupal

22

J'essaie d'ajouter l'attribut d'espace réservé à tous les champs de texte de mon site Web, mais je n'ai pas de chance.

J'ai créé un module qui remplace 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"]);
        }
    }
}

Je dois vous dire que j'utilise également le module de formulaire Web.

Josua Pedersen
la source

Réponses:

14

Parce que j'utilise le module webform, je pourrais simplement thèmeer le modèle global de webform (webform-form.tpl.php) et le mettre dans mon dossier de thème. Pas besoin de compliquer les choses avec un module.

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

Je mets cela en haut du fichier modèle.

Josua Pedersen
la source
3
Cela peut générer une erreur "index non défini" lors de la boucle foreach, n'oubliez pas de vérifier si l'index isset ()
Matteo
10

Modifiez-le légèrement en ....

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 dans foreach scope, le type de valeur n'est pas une référence.


MODIFIER:

Je viens d'expérimenter avec le code suivant et j'ai réussi à itérer récursivement l'ensemble du formulaire pour que les champs de texte modifient leurs attributs.

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
la source
Merci de votre aide! J'aurais dû repérer celui-là moi-même. Parce que cela ne résout pas mon problème d'origine, je ne peux pas vous attribuer une réponse correcte.
Josua Pedersen
4

Vous pourriez probablement le faire avec hook_form_alterou hook_form_FORM_ID_alteret en ajoutant l' attribut "placeholder"

par exemple, non testé, mais quelque chose comme:

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

Recherchez l'élément de formulaire masqué dans le formulaire HTML nommé form_idpour obtenir l'ID de formulaire correct pour le form_alternom de la fonction.

David Thomas
la source
devrais-je faire un module pour cela?
1
Vous pouvez faire un module ou le définir dans template.php de votre thème, en changeant mymodule par le nom de machine du modèle.
mariomc
Ce code fonctionnera-t-il également pour D6?
Bala
4

Une meilleure approche du code 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
la source
+1, ce code fonctionne très bien, je viens de copier et coller dans mon module personnalisé, avec drupal 6, mais j'ai reçu cet avertissement d'erreur: Argument non valide fourni pour foreach () dans C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module on line 16.
Bala
1
Je l'ai résolu en plaçant à l'intérieur la condition if. if (isset ($ form_state ['webform'])) {le code ci-dessus va ici ..}
Bala
3

Dans votre code, vous modifiez la variable $valuequi ne sera plus jamais associée à la variable $form, laquelle est transmise par référence.

En clair, vous apportez quelques modifications mais ne les renvoyez pas à Drupal.

De plus, vous pouvez le faire comme ça (je ne l'ai pas testé mais en théorie ça devrait marcher).

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

J'étais juste paresseux pour ajouter un chèque fieldsetet ajouter un espace réservé aux enfants. Mais je suppose que vous pouvez le changer très facilement.

yvan
la source
3

Une légère amélioration de la solution de fichier modèle de @ Josua: ce code ajoutera également du texte d'espace réservé aux feilds de messagerie 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
la source
Pour être une véritable amélioration, vous devez faire 2 choses: 1) vérifier l'index à définir 2) utiliser une meilleure syntaxe pour vérifier les différents cas
Matteo
2

en utilisant hook_form_alter essayez ceci

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
la source
1

Pour toute personne utilisant une version plus ancienne ou obsolète du module Webform de Drupal , il convient de noter que la prise en charge des espaces réservés a été ajoutée dans le 7.x-4.x branch(juin 2013).

Ainsi, la fonctionnalité d'espace réservé HTML5 est maintenant une option native intégrée, avec des classes CSS personnalisées pour les composants et plusieurs autres fonctionnalités demandées depuis longtemps.

Voici une capture d'écran de l'apparence de la nouvelle fonctionnalité:

Paramètres du composant Drupal Webform montrant la prise en charge des espaces réservés HTML5

rjb
la source
0

Dans la plupart des cas, je suppose, on ne voudrait ajouter des attributs d'espace réservé sur certains formulaires.

Si vous souhaitez ajouter un espace réservé à tous les formulaires Web, vous pouvez le faire comme ceci:

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
la source
0

Utilisez simplement le module pour cela: Webform Hints

C'est exactement ce dont vous avez besoin. C'est facile à gérer et il n'y a pas besoin de code personnalisé. Ce module prend également en charge les navigateurs hérités qui ne prennent pas en charge l'attribut d'espace réservé.

ANDiTKO
la source