FriendsOfREDAXO / mform

Spielend einfach umfangreiche Modul-Input-Formulare erzeugen.
MIT License
77 stars 19 forks source link

setLabelColClass / setFormItemColClass => läuft ins Leere #316

Closed dpf-dd closed 7 months ago

dpf-dd commented 7 months ago

Description / Beschreibung

Affected versions / Verwendete Versionen

REDAXO: 5.17.0 PHP: 8.2.16 Database: MariaDB 10.6.16 AddOns: MForm 7.4.3

Modul-Input:

$mform->setLabelColClass('col-sm-12 text-center');
$mform->setFormItemColClass('col-sm-12 text-center');

Das funktionierte noch bei 7.4.0 oder .1 aber nicht mehr nach Update auf 7.4.3. Die Klassen werden nicht mehr übergeben...!?

Ich vermute den Fehler in der MForm-Fragment-Datei mform_default.php

ALT:

switch ($this->type) {
    case 'default':
        $this->labelColClass = 'col-sm-2 control-label';
        $this->formItemColClass = 'col-sm-10';
        break;
    case 'default_full':
    case 'default_custom_full':
        $this->labelColClass = 'col-sm-12';
        $this->formItemColClass = 'col-sm-12';
        break;
}

$labelWrapper = '<div class="' . $this->labelColClass . '">';
$labelWrapperEnd = '</div>';
$inputWrapper = '<div class="' . $this->formItemColClass . '">';
$inputWrapperEnd = '</div>';

NEU:

$labelColClass = $formItemColClass = '';
switch ($this->type) {
    case 'default':
        $labelColClass = 'col-sm-2 control-label';
        $formItemColClass = 'col-sm-10';
        break;
    case 'default_full':
    case 'default_custom_full':
        $labelColClass = 'col-sm-12';
        $formItemColClass = 'col-sm-12';
        break;
}

$labelWrapper = '<div class="' . $labelColClass . '">';
$labelWrapperEnd = '</div>';
$inputWrapper = '<div class="' . $formItemColClass . '">';
$inputWrapperEnd = '</div>';
}

Eine Ausgabe von $this->type ergibt default-custom - und dieser Case wird nicht abgefangen, weshalb die Klasse letzlich nicht geschrieben wird weil der leere Initialwert genommen wird... Leider war meine Recherche, wo das default-custom herkommt erfolglos. Evtl. muss es ja default-custom-full lauten - aber so tief stecke ich im MForm-Code nicht drin :(

skerbis commented 7 months ago

@dpf-dd

Kannst du mal testen?

// Standardwerte setzen durch die switch-Anweisung
switch ($this->type) {
    case 'default':
        $labelColClass = 'col-sm-2 control-label';
        $formItemColClass = 'col-sm-10';
        break;
    case 'default_full':
    case 'default_custom_full':
        $labelColClass = 'col-sm-12';
        $formItemColClass = 'col-sm-12';
        break;
    default:
        // Falls keine passende Option gefunden wurde, können hier Standardwerte gesetzt werden
        $labelColClass = 'col-sm-2 control-label';
        $formItemColClass = 'col-sm-10';
        break;
}

// Überschreibe die Standardwerte, wenn spezifische Werte gesetzt sind
if (isset($this->labelColClass)) {
    $labelColClass = $this->labelColClass;
}
if (isset($this->formItemColClass)) {
    $formItemColClass = $this->formItemColClass;
}

// HTML-Struktur für Label und Eingabefeld
$labelWrapper = '<div class="' . $labelColClass . '">';
$labelWrapperEnd = '</div>';
$inputWrapper = '<div class="' . $formItemColClass . '">';
$inputWrapperEnd = '</div>';

// Anpassungen für Inline-Formulare
if (true === $this->inline) {
    $labelWrapper = '';
    $labelWrapperEnd = '';
    $inputWrapper = '';
    $inputWrapperEnd = '';
}

// Ausgabe
echo '<div class="form-group ' . $this->class . '">' . $labelWrapper . $this->label . $this->infoTooltip . $this->infoCollapseButton . $labelWrapperEnd . $inputWrapper . $this->element . $inputWrapperEnd . '</div>' . $this->infoCollapse;
dpf-dd commented 7 months ago

Das löst das Problem, aber dafür zieht es den Parent-Div irgendwie zu groß auf (kein padding mehr links und rechts)... Folgende Lösung funktioniert und sollte in deinem Sinne sein...

<?php

$labelColClass = $this->labelColClass;
# oder auch: $labelColClass = ($this->labelColClass) ?? '';
$formItemColClass = $this->formItemColClass;
# oder auch: $formItemColClass = ($this->formItemColClass) ?? '';
switch ($this->type) {
    case 'default':
        $labelColClass = 'col-sm-2 control-label';
        $formItemColClass = 'col-sm-10';
        break;
    case 'default_full':
    case 'default_custom_full':
        $labelColClass = 'col-sm-12';
        $formItemColClass = 'col-sm-12';
        break;
}

$labelWrapper = '<div class="' . $labelColClass . '">';
$labelWrapperEnd = '</div>';
$inputWrapper = '<div class="' . $formItemColClass . '">';
$inputWrapperEnd = '</div>';

if (true === $this->inline) {
    $labelWrapper = '';
    $labelWrapperEnd = '';
    $inputWrapper = '';
    $inputWrapperEnd = '';
}

echo '<div class="form-group ' . $this->class . '">' . $labelWrapper . $this->label . $this->infoTooltip . $this->infoCollapseButton . $labelWrapperEnd . $inputWrapper . $this->element . $inputWrapperEnd . '</div>' . $this->infoCollapse;

Statt einen Leerwert zu initialisieren, an dieser Stelle einfach den Item-Wert abfragen un nehmen. Wenn dann in der switch-Schleife ein Case eintritt, dann wird es überschrieben...!?

skerbis commented 7 months ago

@dpf-dd https://github.com/FriendsOfREDAXO/mform/pull/317 Bitte mal testen

dpf-dd commented 7 months ago

Jo, das funktioniert auch @skerbis :)