Come posso aggiungere una classe a un'etichetta?


8

Devo aggiungere un nome di classe ad alcune etichette create dall'API del modulo di Drupal in questo modo:

$form['name'] => array(
  '#type' => 'textfield',
  '#title' => 'Prénom'
);

Se uso quanto segue, <textarea>ottiene una classe, ma non l'etichetta.

$form['name']['#attributes']['class'] = array('myClass');

Sto cercando qualcosa di simile che aggiungerà una classe al <label>.


Dovresti anche considerare se non puoi già scegliere come target quell'etichetta di campo con CSS usando la classe contenitore padre per il nome del campo, ad es..field-name-field-myfield label{ color:red; }
David Thomas

Risposte:


6

Non è possibile impostare una classe per il tag label dell'elemento form utilizzando le proprietà dell'API Form. Tuttavia, puoi impostare un prefisso e un suffisso per avvolgere l'elemento (etichetta + textarea) e utilizzare un selettore CSS nidificato per realizzare ciò che stai cercando di fare.

$form['name'] => array(
  '#type' => 'textfield',
  '#title' => 'Prénom'
  '#prefix' => '<div class="myClass">',
  '#suffix' => '</div>'
);

e nel CSS, puoi selezionare il tag label in questo modo:

.myClass label {
  text-transform: uppercase; /* just for example */
}

Non è una soluzione decente, ma è così che di solito faccio questo, e ho visto altri farlo. #attributesè per l'elemento di input stesso, quindi è corretto che il tuo codice aggiunga la myClassclasse a textarea.


7

Questo post su StackOverflow afferma che l'API del modulo Drupal non supporta l'aggiunta di classi alle etichette, ma contiene una soluzione decente:

Invece, è possibile indirizzarlo utilizzando la classe wrapper per il campo e l'etichetta:

.form-item-field-foo label {
  /* CSS here */
}

La documentazione API per theme_form_element_label () mostra perché le etichette non sono possibili (almeno non pronte all'uso ): l'array di attributi è inizializzato nella funzione tema e popolato con solo due classi opzionali ('opzione' ed 'elemento -invisibile').

Quindi è completamente impossibile? In effetti, penso che possa essere fatto, ma devo aggiungere che non ho provato questo da solo. Puoi provare a:

  • Aggiungi una nuova #label_attributesproprietà ad alcuni (o tutti) elementi del modulo usando hook_element_info_alter () in un modulo personalizzato;
  • Sostituisci theme_form_element_label () e rendilo unire l' $attributesarray con il valore di $element['#label_attributes'].

Se hai intenzione di provarlo, ti preghiamo di farci sapere se ha funzionato.


A causa dei vincoli di tempo, cercherò la soluzione più semplice proposta da Ayesh K. Questa sembra comunque una buona soluzione, può aiutare qualcun altro. +1
Shawn,

Più 1 per menzionare la funzione tema theme_form_element_label ()
Ideogram

Soluzioni alternative: se la richiesta di JS sul sito è accettabile, modificare il DOM è probabilmente più semplice. In caso contrario, un altro (medio) modo sarebbe quello di rimuovere '#title'o impostare '#title_display' => 'invisible'e poi semplicemente fare '#suffix' => '<label for="TheElementId" class="option">Display This Text</label>'. Ciò fa sì che appaia al di fuori del wrapper che <div>Drupal utilizza per i suoi elementi di input del modulo, ma una regola CSS potrebbe farla apparire diversa.
SeldomNeedy,

2

Espandendo la risposta di Ayesh ho incluso un caso d'uso di esempio per tale codice. Mentre la risposta di marvangend è molto più di Drupalesk, è molto da scavare per un risultato molto semplice. Mantenere elementi specifici del modulo e CSS in bundle con detto modulo è il caso d'uso generale, permettendoci di mirare e agire sugli elementi interni è un po 'più specifico.

http://legomenon.io/article/drupal-7-adding-form-placeholder-attributes

function mymodule_form_alter(&$form, $form_state, $form_id) {
  switch ($form_id) {
    // Waterfall.
    case 'webform_client_form_16':
    case 'webform_client_form_51':
    case 'webform_client_form_64':
    case 'webform_client_form_78':
      $exclude = array('select', 'radios', 'checkboxes', 'managed_file');
      foreach ($form['submitted'] as $name => $component) {
        if (!in_array($component['#type'], $exclude) && $name != '#tree') {
          $form['submitted'][$name]['#prefix'] = '<span class= "label-invisible">';
          $form['submitted'][$name]['#suffix'] = '</span>';
          $form['submitted'][$name]['#attributes']['placeholder'] = $component['#title'];
        }
      }
      $form['#attached']['css'] = array(
        drupal_get_path('module', 'mymodule') . '/css/mymodule.form.css',
      );
    break;
  }
}

2

Su Drupal 8, fallo semplicemente aggiungendo il tuo file your_module.module

function your_module_preprocess_form_element(&$variables) {

  $element = $variables['element'];
  if (isset($element['#label_attributes'])) {
    $variables['label']['#attributes'] = array_merge(
      $variables['attributes'],
      $element['#label_attributes']
    );
  }
}

e aggiungi #label_attributes alla creazione del modulo:

$form['some_field'] = [
  [...]
  '#label_attributes' => [
    'some_attr' => 'some_value',
  ]
]

0

Ho trovato un modo relativamente semplice per ottenere questo risultato usando il modulo Fence D7. Questo modulo include molti file modello per personalizzare i campi. Modifica il campo a cui desideri assegnare una classe unica e modifica il markup del wrapper in qualcosa di rilevante per te. Successivamente, trova il file modello corrispondente all'interno del modulo e copialo nei tuoi siti / all / themes / THEME_NAME.

Prima

<span class="field-label"<?php print $title_attributes; ?>>
  <?php print $label; ?>:
</span>

Dopo

<span class="<?php print $label; ?> field-label"<?php print $title_attributes; ?>>
  <?php print $label; ?>:
</span>

Aggiungendo <?php print $label; ?>, stampa il nome del campo come una classe, consentendo di scegliere come target tutte le etichette dei campi individualmente. Spero che questo aiuti qualcun'altro!


0

È sporco, ma puoi aggiungere HTML alla proprietà '# title':

$form['some_element'] = array(
  '#type'          => 'textfield',
  '#title'         => '<span title="HELP!">'.t($subchildlabel).'</span>',
  '#default_value' => 
) 
 
);

Sono sorpreso che funzioni. Penso che Drupal lo filtrerebbe, ma no. Quindi, puoi avvolgere l'etichetta con un'altra classe:

<label for="edit-m-vernacularname" class="inline"><span title="HELP!">Common name
</span> </label>
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.