web-dev-qa-db-fra.com

Ajouter un espace réservé HTML5 à tous les formulaires drupal

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

22
Josua Pedersen

Parce que j'utilise le module de formulaire Web, je pourrais simplement créer un thème pour le modèle de formulaire Web global (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.

14
Josua Pedersen

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 la portée foreach est un type de valeur et non une référence.


ÉDITER:

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

Vous pourriez probablement le faire avec hook_form_alter ou hook_form_FORM_ID_alter et 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 HTML du formulaire Web nommé form_id pour obtenir l'ID de formulaire correct pour le form_alter nom de la fonction.

4
David Thomas

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

Une légère amélioration de la solution de fichier de 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"]);
    } 
}
3
Steven B

Dans votre code, vous modifiez la variable $value qui ne sera plus jamais associé à la variable $form, lequel est passé 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 pour fieldset et ajouter un espace réservé aux enfants. Mais je suppose que vous pouvez le changer très facilement.

3
yvan

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

Pour toute personne utilisant une version plus ancienne ou obsolète de module Webform de Drupal , il convient de noter que le support d'espace réservé a été ajouté 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é:

Drupal Webform Component Settings showing HTML5 placeholder support

1
rjb

Dans la plupart des cas, je suppose que l'on ne voudrait ajouter que 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;
      } 
    }
  }
}
0
rosell.dk

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

0
ANDiTKO