(Un-) Formatierung jedes Formularelements

7

Wenn wir so etwas deklarieren

$form['textfield'] = array(
  '#type' => 'textfield',
  '#title' => 'textfield title',
  '#maxlength' => 8,
  '#required' => true,
);

Die Ausgabe wird ungefähr so ​​aussehen:

<div id="edit-textfield-wrapper" class="form-item">
  <label for="edit-textfield">textfield title: <span title="This field is required." class="form-required">*</span></label>
  <input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">
</div>

Ich bin jedoch bereit, den Container divund labelvon einigen meiner Felder so etwas zu entfernen :

<input type="text" class="form-text required" value="" size="60" id="edit-textfield" name="textfield" maxlength="8">

Ist es möglich? Gibt es irgendwo Beispiele?

acm
quelle

Antworten:

4

Sie müssen nur hook_theme_registry_alter () implementieren, um die Themenfunktion zu ändern, die beim Aufrufentheme('form_element') aufgerufen wird. Normalerweise lautet die aufgerufene Themenfunktion theme_form_element () .

function theme_form_element($element, $value) {
  // This is also used in the installer, pre-database setup.
  $t = get_t();

  $output = '<div class="form-item"';
  if (!empty($element['#id'])) {
    $output .= ' id="' . $element['#id'] . '-wrapper"';
  }
  $output .= ">\n";
  $required = !empty($element['#required']) ? '<span class="form-required" title="' . $t('This field is required.') . '">*</span>' : '';

  if (!empty($element['#title'])) {
    $title = $element['#title'];
    if (!empty($element['#id'])) {
      $output .= ' <label for="' . $element['#id'] . '">' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
    else {
      $output .= ' <label>' . $t('!title: !required', array('!title' => filter_xss_admin($title), '!required' => $required)) . "</label>\n";
    }
  }

  $output .= " $value\n";

  if (!empty($element['#description'])) {
    $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
  }

  $output .= "</div>\n";

  return $output;
}
function mymodule_theme_registry_alter(&$theme_registry) {
  if (isset($theme_registry['form_element']) {
    $theme_registry['form_element']['function'] = "theme_mymodule_form_element";
  }
}

Mit dem Code von theme_form_element()können Sie Ihre eigene Themenfunktion schreiben und die nicht gewünschten HTML-Tags entfernen. Beachten Sie, dass dies theme('form_element')für jede Formularelementausgabe mit der Formular-API aufgerufen wird. Wenn Sie die HTML-Ausgabe nur eines Formularelements ändern möchten, müssen Sie den Wert #type überprüfen.
theme_textfield () ist die Themenfunktion , die ein Textfeld thematisiert, aber weder die Beschriftung noch die Umhüllung <div>ausgibt, die bereits von ausgegeben wird theme_form_element().

Alternativ kann dies in einem Thema erfolgen, das überschreibt theme_form_element().
Welchen Ansatz Sie verwenden sollten, hängt davon ab, ob Sie die Ausgabe in einem bestimmten Thema oder für alle auf Ihrer Drupal-Site aktivierten Themen ändern müssen. Im letzteren Fall müssen Sie die Hooks implementieren, die ich in einem Modul gemeldet habe.

kiamlaluno
quelle
kiamlaluno, zunächst einmal danke für die Antwort, aber ist es möglich, diese Funktionen mit einem Kernthema (zB Girlande) zu verwenden?
acm
@andre matos Für ein Drupal-Kernthema sollten Sie ein benutzerdefiniertes Modul implementieren, das die von mir beschriebenen Hook-Funktionen implementiert. Dies ist die einzige Möglichkeit, ein Modul zu ändern, ohne den Code eines Themas zu ändern. Dies sollte jedes Mal geändert werden, wenn Sie Drupal aktualisieren. Drupal zu aktualisieren, aber nicht dieses Thema, wäre keine gute Idee. Es würde Dinge geben, die im Modul geändert werden, und Sie würden diese Änderungen nicht erhalten.
Kiamlaluno
ist es drupal 7 gültig? Ich denke, es ist anders, indem Sie hook_element_info_alter
khaled_webdev
0

Soweit ich weiß, ist es nicht möglich, den <div>Wrapper zu entfernen , wenn Sie das Thema nicht ändern.

Ek Kosmos
quelle
Gibt es in Anbetracht des von mir verwendeten Themas ein Kernthema eine Möglichkeit, dies zu tun, ohne es offensichtlich zu hacken?
acm