Skip to content

HTML-Code nicht im PHP generieren -> Fragment? #423

@christophboecker

Description

@christophboecker

An die Addon-Leads: ich habe da mal ´ne Verständnisfrage

An mehreren Stellen wird ein "Fake-Feld" in BE-Formularen ausgegeben. Das Feld soll wohl wie ein Formularfeld aussehen, aber nur nachrichtlich sein, keine Änderungsmöglichkeit. Das HTML wird innerhalb des PHP-Codes der Klasse RexFormSupport mit den Methoden getFakeText, getFakeTextarea bzw. getFakeCheckbox generiert.

public static function getFakeText(string $label, string $value): string
{
$html = '';
$html .= '<dl class="rex-form-group form-group consent_manager-fake">';
$html .= '<dt><label class="control-label">' . $label . '</label></dt>';
$html .= '<dd><input disabled class="form-control" type="text" value="' . $value . '"></dd>';
$html .= '</dl>';
return $html;

Der Feldwert landet nicht in der Formularrückgabe, weil das name-Attribut fehlt. Deshalb wird tw. auch noch ein Hidden-Feld angehängt, aber nicht in jedem Fall.

$form->addRawField(RexFormSupport::getFakeText(rex_i18n::msg('consent_manager_uid'), (string) $form->getSql()->getValue('uid')));
$form->addHiddenField('uid', $form->getSql()->getValue('uid'));

Weil es gute Praxis ist und auch in Redaxo so gemacht wird oder werden sollte, möchte ich die Hilfsmethoden getFakeText, getFakeTextarea und getFakeCheckbox gerne umbauen oder überflüssig machen.

Dafür sehe ich zwei Varianten:

  1. Einfach die normalen RexForm-Feldtypen benutzen und auf 'disabled' setzen (per Attribut)
  2. Fragmente schaffen und die drei Methoden den Code darüber aufbauen lassen.

Im ersten Fall würde der Input wieder ein name-Attribut bekommen und immer auch in der Rückgabe landen. Er könnte aber nicht verändert werden. Falls es für die abweichende Formatierung noch einen Identifier benötigt, kann man dazu ein Attribut eintragen und per CSS auswerten. Beispiel:

$field = $form->addTextField('uid');
$field->setLabel(rex_i18n::msg('consent_manager_uid'));
$field->setValue((string) $form->getSql()->getValue('uid'));
$field->setAttribute('disabled', '');  // keine Eingabe möglich
$field->setAttribute('fake', ''); // Marker für spezielles CSS
dl:has(input[fake]) {
    opacity: .6;
} 
dl:has(input[fake]) label {
    cursor: default;
} 

Und nun zu meiner Frage: Wurde es so gelöst, weil es anders keine gezielte Formatierung gab (:has(...) kam erst später) und man so auf DL-Ebene am einfachsten eine Klasse zur Formatierung setzen konnte? Votiert ihr eher zu Lösung 1 oder Lösung 2

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions