Aggiunta di segnaposto HTML5 a tutti i moduli drupal


22

Sto cercando di aggiungere l'attributo segnaposto a tutti i campi di testo nel mio sito Web, ma non ho fortuna.

Ho creato un modulo che ha la precedenza 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"]);
        }
    }
}

Dovrei dirti che sto usando anche il modulo webform.

Risposte:


14

Dato che sto usando il modulo webform, potrei semplicemente creare un tema per il modello webform globale (webform-form.tpl.php) e inserirlo nella mia cartella dei temi. Non c'è bisogno di complicare le cose con un modulo.

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

L'ho inserito all'inizio del file modello.


3
Questo può generare un errore "indice indefinito" quando si esegue il ciclo foreach, ricordarsi di verificare se l'indice isset ()
Matteo,

10

Modificalo leggermente in ....

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 foreach scope è tipo di valore non un riferimento.


MODIFICARE:

Ho appena sperimentato il seguente codice e sono riuscito a iterare ricorsivamente l'intero modulo affinché i campi di testo possano modificare i loro attributi.

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

Grazie per l'aiuto! Avrei dovuto individuarlo da solo. Perché non risolve il mio problema originale, non posso assegnarti una risposta corretta.
Josua Pedersen,

4

Probabilmente potresti farlo con hook_form_altero hook_form_FORM_ID_altere aggiungendo l' attributo "segnaposto"

ad esempio, non testato, ma qualcosa di simile:

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

Trova l'elemento del modulo nascosto nell'HTML del modulo web denominato form_idper ottenere l'id modulo corretto per il form_alternome della funzione.


dovrò creare un modulo per questo?

1
Puoi creare un modulo o impostarlo nel template.php del tuo tema, cambiando mymodule dal nome della macchina del template.
mariomc,

Questo codice funzionerà anche per D6?
Bala,

4

Un approccio migliore al codice di 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, questo codice funziona alla grande, ho appena copiato e incollato nel mio modulo personalizzato, con drupal 6, ma ho ricevuto questo avviso di errore: Argomento non valido fornito per foreach () in C: \ wamp \ www \ r4launch \ sites \ all \ modules \ advanced \ advanced.module alla riga 16.
Bala

1
L'ho risolto inserendo la condizione if. if (isset ($ form_state ['webform'])) {sopra il codice va qui ..}
Bala

3

Nel tuo codice, cambi la variabile $valueche non si associa mai più alla variabile $form, che viene passata per riferimento.

Chiaramente, fai alcune modifiche ma non le rispedisci a Drupal.

Inoltre, puoi farlo in quel modo (non l'ho provato ma in teoria dovrebbe funzionare).

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

Ero solo pigro per aggiungere un controllo fieldsete aggiungere segnaposto ai bambini. Ma credo che tu possa cambiarlo molto facilmente.


3

Un leggero miglioramento alla soluzione di file modello di @ Josua: questo codice aggiungerà anche il testo segnaposto alle pagine di posta elettronica del modulo 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"]);
    } 
}

Per essere un vero miglioramento, dovresti fare 2 cose: 1) controlla l'indice da impostare 2) usa una sintassi migliore per controllare i diversi casi
Matteo

2

usando hook_form_alter prova questo

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

Per chiunque utilizzi una versione precedente o obsoleta del modulo Webform di Drupal , vale la pena notare che il supporto segnaposto è stato aggiunto nel 7.x-4.x branch(giugno 2013).

Pertanto, la funzionalità segnaposto HTML5 è ora un'opzione nativa incorporata insieme a classi CSS personalizzate per i componenti e molte altre funzionalità richieste da tempo.

Ecco uno screenshot di come appare la nuova funzionalità:

Drupal Webform Component Settings mostra il supporto segnaposto HTML5


0

Nella maggior parte dei casi, immagino, si vorrebbe solo aggiungere attributi segnaposto su alcuni moduli.

Se vuoi aggiungere un segnaposto a tutti i moduli web, puoi farlo in questo modo:

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

Basta usare il modulo per esso: Suggerimenti per i webform

È esattamente quello che ti serve. È facile da gestire e non è necessario un codice personalizzato. Questo modulo fornisce anche supporto per i browser legacy che non supportano l'attributo segnaposto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.