it-swarm.com.de

Wie werden Webform-Elemente (Optionsfelder usw.) thematisiert?

Ich würde gerne wissen , wie man Drupal 7 Webform Elemente? ich thematisieren möchte Ändern Sie die HTML-Struktur jedes Elements, und schließen Sie das Formular nicht nur mit div oder ähnlichem. Und ich möchte die Elemente des Themas so lassen, wie sie waren.

BEARBEITEN: Ich möchte dem Optionsfeld Beschriftung und Eingabetyp eine Klasse hinzufügen.

3
gregab

Jedes Webform-Element verfügt über eine eigene Datei im Unterverzeichnis "Komponenten" des Webform-Modulordners.

Wenn Sie in diesen Dateien suchen, gibt es eine _webform_theme_COMPONENTTYPE () -Funktion, zum Beispiel _ webform_theme_date () für die Datumsfelder.

Diese Funktion definiert die Themenfunktionen für diesen Feldtyp.

Mit diesen Themenfunktionen können Sie die Themen der Felder überschreiben.

Zum Beispiel theme_webform_date () kann als THEMENAME_webform_date (& $ variables) überschrieben werden und Sie können die Ausgabe ändern.

Wenn es sich um Dinge wie die gewünschten Feldumbrüche oder Beschriftungen handelt, sollten Sie die Funktion theme_webform_element () überschreiben.

Auf diese Weise können Sie beispielsweise ändern, wo das Etikett in Bezug auf das Feld gedruckt wird.

Mit $element['#type'] Können Sie bestimmte Feldtypen in dieser Designfunktion auswählen.

Hinweis: Webform-Komponenten sind ein Sonderfall. Normalerweise finden Sie themenbezogene Dinge in der Funktion MODULENAME_theme (). In diesem Fall webform_theme () .

Um Klassen für Optionsfeldfelder festzulegen:

Die Anforderung, die Klasse einem Optionsfeld hinzuzufügen, ist leider etwas anders. Dies liegt daran, dass das Webformular kein eigenes Design verwendet, sondern drupal Core's)

Was Sie also wollen, ist theme_radios () und/oder theme_radio () und/oder theme_form_element_label () .

So etwas (es gibt Kommentare, die Ihnen sagen, was sich geändert hat):

/**
 * Theme a set of radio buttons.
 */
function THEMENAME_radios($variables) {
  $element = $variables['element'];
  $attributes = array();
  if (isset($element['#id'])) {
    $attributes['id'] = $element['#id'];
  }
  $attributes['class'] = 'form-radios';
  if (!empty($element['#attributes']['class'])) {
    $attributes['class'] .= ' ' . implode(' ', $element['#attributes']['class']);
  }
  if (isset($element['#attributes']['title'])) {
    $attributes['title'] = $element['#attributes']['title'];
  }

  // Add custom classes.
  // To target specific elements you can use the $element variable.
  // You can target the label using:
  // .your-custom-class label
  $attributes['class'] .= 'your-custom-class another-custom-class';

  return '<div' . drupal_attributes($attributes) . '>' . (!empty($element['#children']) ? $element['#children'] : '') . '</div>';
}

/**
 * Theme a single radio button.
 */
function THEMENAME_radio($variables) {
  $element = $variables['element'];
  $element['#attributes']['type'] = 'radio';
  element_set_attributes($element, array('id', 'name','#return_value' => 'value'));

  if (isset($element['#return_value']) && $element['#value'] !== FALSE && $element['#value'] == $element['#return_value']) {
    $element['#attributes']['checked'] = 'checked';
  }
  _form_set_class($element, array('form-radio'));

  // Set custom classes.
  // Use $element to target specific fields.
  $element['#attributes']['class'][] = 'your-custom-class';
  $element['#attributes']['class'][] = 'another-custom-class';

  return '<input' . drupal_attributes($element['#attributes']) . ' />';
}

Leider ist es aufgrund von dieser Fehler nicht möglich, Klassen zu einem Label hinzuzufügen, außer zum Überschreiben von theme_form_element_label ().

Es gibt zwei Möglichkeiten, dies in der Themenebene zu beheben.

Eine besteht darin, die Klasse zum Feld-Wrapper hinzuzufügen und dann die Beschriftungen über diese in Ihrem CSS oder JS anzuvisieren.

Die andere Möglichkeit besteht darin, theme_form_element_label () wie folgt zu überschreiben:

/**
 * Theme a form element label.
 */
function THEMENAME_form_element_label($variables) {
  $element = $variables['element'];
  // This is also used in the installer, pre-database setup.
  $t = get_t();

  // If title and required marker are both empty, output no label.
  if ((!isset($element['#title']) || $element['#title'] === '') && empty($element['#required'])) {
    return '';
  }

  // If the element is required, a required marker is appended to the label.
  $required = !empty($element['#required']) ? theme('form_required_marker', array('element' => $element)) : '';

  $title = filter_xss_admin($element['#title']);

  $attributes = array();
  // Style the label as class option to display inline with the element.
  if ($element['#title_display'] == 'after') {
    // Changed to make class an array.
    $attributes['class'][] = 'option';
  }
  // Show label only to screen readers to avoid disruption in visual flows.
  elseif ($element['#title_display'] == 'invisible') {
    // Changed to make class an array.
    $attributes['class'][] = 'element-invisible';
  }

  if (!empty($element['#id'])) {
    $attributes['for'] = $element['#id'];
  }

  // Add your classes here.
  // If you are using variables to make the class use the drupal_html_class()
  // function.
  // To target specific elements you can use the $element variable.
  // For example, based on field type:
  if ($element['#type'] == '') {
    $attributes['class'][] = 'your-custom-class';
    $attributes['class'][] = 'another-custom-class';
  }

  // The leading whitespace helps visually separate fields from inline labels.
  return ' <label' . drupal_attributes($attributes) . '>' . $t('!title !required', array('!title' => $title, '!required' => $required)) . "</label>\n";
}
18
rooby