Hinzufügen von HTML5-Platzhaltern zu allen Drupal-Formularen

22

Ich versuche, allen Textfeldern auf meiner Website das Platzhalterattribut hinzuzufügen, habe aber kein Glück.

Ich habe ein Modul erstellt, das überschreibt 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"]);
        }
    }
}

Ich sollte Ihnen sagen, dass ich auch das Webformular-Modul verwende.

Josua Pedersen
quelle

Antworten:

14

Da ich das Webform-Modul verwende, kann ich die globale Webform-Vorlage (webform-form.tpl.php) einfach mit einem Theme versehen und in meinen Theme-Ordner legen. Es ist nicht nötig, Dinge mit einem Modul zu komplizieren.

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

Ich habe dies oben in die Vorlagendatei eingefügt.

Josua Pedersen
quelle
3
Dies kann zu undefinierten Indexfehlern führen. Denken Sie daran, zu überprüfen, ob der Index isset ()
Matteo
10

Ändern Sie es leicht auf ....

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 In jedem Bereich ist der Werttyp keine Referenz.


BEARBEITEN:

Ich habe gerade mit folgendem Code experimentiert und es ist mir gelungen, das gesamte Formular rekursiv zu durchlaufen, damit Textfelder ihre Attribute bearbeiten können.

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
quelle
Danke für Ihre Hilfe! Hätte das selbst sehen sollen. Da es mein ursprüngliches Problem nicht löst, kann ich Ihnen keine richtige Antwort geben.
Josua Pedersen
4

Sie könnten dies wahrscheinlich mit hook_form_alteroder tun hook_form_FORM_ID_alterund das Attribut "Platzhalter" hinzufügen

zB ungetestet, aber so ähnlich:

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

Suchen Sie das ausgeblendete Formularelement im Webformular-HTML mit dem Namen form_id, um die richtige Formular-ID für den form_alterFunktionsnamen abzurufen .

David Thomas
quelle
Muss ich dafür ein Modul erstellen?
1
Sie können ein Modul erstellen oder dieses in der template.php Ihres Themas festlegen und mymodule anhand des Computernamens der Vorlage ändern.
Mariomc
Funktioniert dieser Code auch für D6?
Bala
4

Ein besserer Ansatz für Josua Pedersens Code:

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
quelle
+1, dieser Code funktioniert hervorragend, ich habe ihn gerade kopiert und in mein benutzerdefiniertes Modul mit Drupal 6 eingefügt, aber folgende Fehlermeldung erhalten: Ungültiges Argument für foreach () in C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module in Zeile 16.
Bala
1
Ich habe es gelöst, indem ich es in die if-Bedingung gestellt habe. if (isset ($ form_state ['webform'])) {oben Code geht hier ..}
Bala
3

In Ihrem Code ändern Sie die Variable $value, die der Variablen nie wieder zugeordnet wird$form , die als Referenz übergeben wird.

Im Klartext nehmen Sie einige Änderungen vor, senden diese jedoch nicht an Drupal zurück.

Sie können es auch so machen (ich habe es nicht getestet, aber theoretisch sollte es funktionieren).

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

Ich war nur faul fieldset, den Kindern einen Scheck hinzuzufügen und einen Platzhalter hinzuzufügen. Aber ich denke, Sie können es sehr einfach ändern.

yvan
quelle
3

Eine leichte Verbesserung der @ Joshua-Lösung für Vorlagendateien: Dieser Code fügt auch Platzhaltertext zu Webform-E-Mail-Feldern hinzu.

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
quelle
Um eine echte Verbesserung zu erzielen, sollten Sie zwei Dinge tun: 1) Überprüfen Sie den einzustellenden Index 2) Verwenden Sie eine bessere Syntax, um die verschiedenen Fälle zu überprüfen
Matteo
2

versuche dies mit hook_form_alter

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
quelle
1

Wenn Sie eine ältere oder veraltete Version des Drupal-Webform-Moduls verwenden , sollten Sie beachten, dass im Juni 2013 Platzhalter-Unterstützung hinzugefügt wurde7.x-4.x branch .

Daher ist die HTML5-Platzhalterfunktionalität jetzt eine systemeigene, integrierte Option, zusammen mit benutzerdefinierten CSS-Klassen für Komponenten und mehreren anderen seit langem angeforderten Funktionen.

Hier ist ein Screenshot der neuen Funktionalität:

Einstellungen der Drupal Webform-Komponente, die die Unterstützung von HTML5-Platzhaltern anzeigen

rjb
quelle
0

In den meisten Fällen würde man vermutlich nur Platzhalterattribute in einigen Formularen hinzufügen wollen.

Wenn Sie allen Webformularen Platzhalter hinzufügen möchten, können Sie dies folgendermaßen tun:

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
quelle
0

Nutzen Sie dafür einfach das Modul: Webform-Hinweise

Es ist genau das, was Sie brauchen. Es ist einfach zu verwalten und es ist kein benutzerdefinierter Code erforderlich. Dieses Modul bietet auch Unterstützung für ältere Browser, die das Platzhalterattribut nicht unterstützen.

ANDiTKO
quelle