Liste der Anhänge anzeigen (Anzahl: 2)
Klasse zum leichteren Bearbeiten des Fontend Editing Templates
Hallo Zusammen,
Ich hatte ein paar Probleme mit dem anpassen des Formulars im Frontend Editing. Und zwar findet sich das ganze Formlar in einem Array Feld "field" wodurch die Änderung sehr schwer ist. Erstens passte für mein Vorhaben die Tabellenstruktur nicht so ganz und zweitens wolle ich einzelne Felder mit einem Fieldset Gruppieren können, was allerdings auch schwer ist wenn alles in einem Array Feld steht...
Deswegen hat mein Kollege Jens Bernhardt eine Klasse programmiert die mir viel Arbeit abnimmt.
Dadurch kann ich das Template aufbauen wie ich möchte und mit der Funktion einzelne Felder einfügen.
Beispiel: (catalog_edit.tpl)
PHP-Code:
<?php
require_once('tpl_lib_mix.php');
$tag_hiding_obj = new tag_hiding_class();
$tag_hiding_obj->hiding_prepare( $this->field );
?>
<fieldset>
<legend>Angaben zur Person</legend>
<div class="formrow">
<div class="formfield">
<div class="formlabel"><?php echo $tag_hiding_obj->get_param_tags( 'family', 0 ); ?> </div><div class="formvalue"><?php echo $tag_hiding_obj->get_param_tags( 'family' ); ?></div>
</div>
<div class="formfield">
<div class="formlabel"><?php echo $tag_hiding_obj->get_param_tags( 'childreen', 0 ); ?> </div><div class="formvalue"><?php echo $tag_hiding_obj->get_param_tags( 'childreen' ); ?></div>
</div>
</div>
</fieldset>
mit <?php echo $tag_hiding_obj->get_param_tags( 'family', 0 ); ?> holt er das Label
und mit <?php echo $tag_hiding_obj->get_param_tags( 'family' ); ?> das Formularfeld inklusive dem derzeitigen Value.
"family" ersetzt man einfach mit dem jeweiligen Tabellenfeld und schon kann man sich ein richtig schönes Formular basteln.
Die Klasse kann auch noch die bestehende Tabellenstruktur in eine Div Struktur umwandeln...
Alle Dateien und eine kleine Doku findet Ihr im Anhang.
Wer es gebrauchen kann, darf es gerne verwenden.
Achja, das ganze war eine echte Nacht und Nebel Aktion, weswegen noch viele Kommentare im Quelltext fehlen... Aber es funktioniert. :D
Gruß
Timo
*EDIT*
Ich habe mal eine neue Version hochgeladen... Am besten zukünftig diese verwenden, da dort einige "Fehler" behoben wurden! Dateiname: tpl_lib_mix - Auszug #4-2.zip
Liste der Anhänge anzeigen (Anzahl: 1)
Neue Version + Antworten auf ältere Fragen
Hallo alle miteinander.
Generell ein wenig zur Klarstellung bezüglich der Lib, die "Tim29" euch vorgestellt hat.
1. Sie lässt sich für "Catalog Edit", aber z.B. auch "Benutzer → Persönliche Daten" verwenden.
2. Sie diente eigentlich / ursprünglich dem Zweck, einzelne Spalten auszublenden indem sie in input type="hidden" Felder umgewandelt werden.
3. Sie diente eigentlich / ursprünglich dem Zweck, an die Werte der Felder / Attribute zu gelangen, um z.B. Abfragen durchführen zu können.
@jared:
Das "Sicherheitscaptcha" kannst Du ebenso auslesen wie andere Felder auch, musst nur den gegenwärtig verwendeten Namen in Erfahrung bringen. Da diese Klasse für eher generelle Verwendung gedacht ist, gibt es dazu keine gesonderte Methode. Da zumindest die Struktur dieses Feldnamen immer gleich scheint, gibt es jedoch einen recht simplen Trick:
PHP-Code:
$tag_hiding_obj = new tag_hiding_class();
$tag_hiding_obj->hiding_prepare( $this->field );
$protect_name = "";
$field_array = $tag_hiding_obj->get_param_list();
foreach( $field_array as $fieldname )
if( preg_match( "/^[a-f0-9]{33}$/" , $fieldname ) ) // Struktur = Captcha-Name ?
{
$protect_name = $fieldname;
break; // foreach abbrechen da Ergebnis gefunden.
};
...
if ( $protect_name ) echo $tag_hiding_obj->get_param_tags( $protect_name );
else echo "Nada!"; // ... sofern ein "else"-Zweig benötigt wird.
@jared und @scribble:
Was weitere Felder betrifft, so z.B. die Fehlermeldung, Bilder, etc:
Diese müssten über eine Anpassung des "Zeilen Index" in "string get_param_tags( [Feldname], [Zeilen Index]=1 )" adressierbar sein ( z.B. index "2" ? ).
Unerwünschte Tags kann man auch recht einfach mittels "preg_replace" entfernen, oder aber mittels einem "explode" über das Label-Tag auch in ein Array zerlegen um es schließlich über den Index zu adressieren.
Für Fortgeschrittene: Die Lib liefert ebenso die Klasse "tag_class" mit, welche es erlaubt, html/xhtml-Strukturen in ein Array zu zerlegen sowie wieder zusammenzubasteln; eine Manipulation dieses Arrays ist immerhin einiges leichter als hier "zu Fuß" zu arbeiten - leider kann ich euch aber derzeit keine Doku dazu anbieten.
Die aktuelle Version der Lib/Klasse "tpl_lib_mix" findet sich hier: Anhang 2605
Ergänzt / Geändert wurde ...
1. Lesen der Attribute von u.A. input type="text" oder "select".
2. Ändern der Attribute von u.A. input type="text" oder "select" um z.B. Styles bzw. Klassen oder z.B. onclick-Ereignisse einzufügen.
3. Einige neue Beispiele für Dokumentation.
4. Stand-Alone ausführbarer Beispielcode.
5. Ein Beispiel für Sicherheitsabfrage ( captcha ) in Doku ( siehe oben ).
Ansonsten ... frohes Schaffen ! :-)
Liste der Anhänge anzeigen (Anzahl: 1)
Neue Version + Ansatz für das Anzeigen und Löschen von Bildern
Hallo erneut !
Bezüglich der alten Threads von @jared und @scribble sowie des Neuen von @niqo:
Das Extrahieren des Zeileninhalts von Bild und "Löschen-Link" einer Foto-Upload Funktion ist ab Version 2 möglich und mit dieser aktuellen Version sogar in ein paar wenigen Zeilen.
Beispiel ( aus Doku ):
Code:
<?php
$tag_hiding_obj = new tag_hiding_class ();
$tag_hiding_obj->hiding_prepare( $this->field );
$protect_name = "";
$field_array = $tag_hiding_obj->get_param_list( "_passport_pic_" );
$protect_name = $field_array[0]; // Sofern es nicht mehrere Treffer zu diesem Ausdruck gibt ...
echo "<div><span>";
echo $tag_hiding_obj->get_param_tags( "passport_pic" , 0 ); // Feld- / Spaltenbezeichnung
echo "</span>:<span>";
echo $tag_hiding_obj->get_param_tags( "passport_pic" ); // Eingabefeld
echo "</span></div>";
echo $tag_hiding_obj->get_param_tags( $protect_name , 0 ); // DIV Element mit Bild und Löschen-Button / Checkbox.
?>
Neu seit Version 2:
1. Vereinfacht: Ermitteln des Sicherheits-captcha.
2. Vereinfacht: Suchen von Namen über u.A. relative Ausdrücke.
3. Neu: Das Ersetzen von Tabellenfeldern durch Text oder neuen Quellcode.
4. Neu: Die Eingabe eines Tabllenfeldes in reinen Text umwandeln; ändern verhindern.
Generelle Fähigkeiten ( da scheint es ja noch Fragen zu geben ):
5. Ausblenden einzelner Zeilen einer Tabelle.
6. Ermitteln des angezeigten Wertes einer Eingabe für z.B. eine Abfrage.
7. Das Ändern / Setzen von Eigenschaften eines Eingabefeldes für z.B. onclick.
8. Extrahieren des Quellcodes einzelner Felder spezifischer Tabellenzeilen.
9. Das Umwandeln einer Tabelle in z.B. Div-Blöcke.
Fröhliches Austoben ! ;-)
Evtl. für Splittung eines Katalog-FE-Formular zu gebrauchen?
Hallo Blue Thunder,
kann ich das ebenfalls für die Splittung eines Katalog FE-Formulars gebrauchen, oder habe ich da etwas falsch verstanden? Und wenn ja, wohin lade ich dann "tpl_lib_mix.php und die anderen *.php"
Ich habe nämlich folgendes Problem:
Katalog FE-Formular stückeln und das soll dem vorhandenen Eintrag des Mitgliedes zugefügt werden.
Damit das FrontEnd-Formular vom Katalog nicht unendlich lang wird, möchte ich es stückeln. (da so viele Abfragen ausgefüllt werden müssen).
Mein Gedanke: Links kommen dann Buttons hin, die jedes gestückelte Formular aufrufen sollen. (mehrere Frontend-Formulare als Modul erstellt - Felder darin ausgewählt)
Aufgrund des Benutzer ID Feldes werden nach jedem speichern die Einträge dem Mitglied zugeschrieben - soweit ok - nun wird jedoch immer ein neuer Eintrag angelegt, sie gehören nicht mehr zusammen. Wie kann man das FE-Formular trennen/stückeln und doch alle Einträge der einzelnen Stücke zusammenfassen?
Beispiel: Ein Mitglied erstellt im Formular1 "Name des Shops1, dazu Adresse, Tel etc." - im Formular2 "im Shop vertretene Labels, Öffnungszeiten etc." -> diese Angaben im Formular2 werden nun jedoch nicht mehr dem Formular1 zugeschrieben (dem Shop1), wie bekommt man den 2.Formulareintrag dem 1. zugeordnet. Das ist wichtig, da das Mitglied auch einen 2. Shop und mehr anlegen soll.
Gibt es eine Möglichkeit mit tpl_lib_mix?
Gruß, WebCMS
Antwort: Splitting eines Catalog-FE-Formulars
@WebCMS
Ich werde versuchen Deine Frage in seine einzelne Bestandteile zu zerlegen, denn wenn ich Dich richtig verstanden habe, sollte die Klasse Dir tatsächlich helfen können.
1. Welchem Zweck dient die Klasse ?
Dem Zugriff auf und der Manipulations von Felderern und Eingabe-Element-Werten ausgabefertiger Tabellenstrukturen, die Contao geparst / erstellt hat und deren Datenbasis in einem Template nicht direkt erreichbar ist.
2. Welcher Art mmüssen diese Tabellenstrukturen sein ?
"<tr><td>[Labels, Input-Element,...]</td>[beliebig viele weitere Felder/Spalten]</tr>" ohne Tabellen-Rumpf ( <table /> ). In jeder Zeile, in der ein Feld oder die Zeile selbst angesprochen können werden soll, muss sich ein Eingabe-Element mit eindeutigem Namen befinden - es darf nicht fehlen, aber auch keine 2 unterschiedlichen Namen / Eingabefelder aufweisen.
Gültige Eingabe-Elemente sind <input type="radio/checkbox/text/password" />, <select /> und <textarea />.
3. Welche 2 grundsätzlichen Möglichkeiten ergeben sich ?
A. Attribute für Eingabe-Elemente Ergänzen, Zeilen Ausblenden, den Quellcode eines Feldes austauschen oder die gesamte Struktur in z.B. verschachtelte <div />-Blöcke umwandeln um das Ergebnis schließlich mit der Methode hide_tags(...); auszugeben.
B. Einzelne Felder der Tabelle wie ein Huhn das Korn aus der Tabelle zu picken um diese auf / in einer gänzlich anders strukturierten Seite portionsweise auszugeben / platzieren ( Siehe Ausgangs-Thread ).
4. Wohin gehören die Dateien und wie werden diese eingebunden ?
Die benötigten Dateien sind: "string_class.php" (Parsen von Text) , "tag_class.php" (Zerlegen einer HTML/XML strukturierten Datein in ein Daten-Array) und "tpl_lib_mix.php" (Daten-Arrays für Methoden nutzen). Die Datei "beispiel.php" zeigt nur ein paar Verwendungsmöglichkeiten.
Diese drei ersten Dateien sollten am besten im Ordner "[root/]templates/" abgelegt werden.
Zur Einbindung genügt ein "include_once", oder besser "require_once", für das/ein Template.
5. Zerteilen einer Katalog-Seite in mehrere Einzelseiten.
Entsprecheng Punkt "3" (siehe oben) gibt es hier 2 verschiedene Ansätze, die Dir möglich sind.
A. Du blendest jeweils die Zeilen der Tabelle aus, die Du für die gegenwärtige Ansicht nicht wünschst / benötigt. Dazu wird eine Liste der Namen der Eingabe-Elemente benötigt, die nicht dargestellt werden sollen. Diese wird als Array der Methode "hide_tags([Namen Array]);" als erster Parameter übergeben. Alle ausgeblendeten Zeilen erscheinen als <input type="hidden" /> in der Ausgabe und tragen entweder ihre definierte Ausprägung, oder fehlt diese, als Standard den Wert "0".
Mit jedem Speichern oder Blättern ( erkennbar über z.B. einen zusätzlichen Übergabeparameter in der URL / der Form ) müssen dann schlicht lediglich andere Zeilen versteckt werden - fertig !
B. Du löst die Tabellenstruktur auf indem Du für jede Teildarstellung eine eigene Ausgabe / Darstellung festlegst in die Du mittels der Methode get_param_tags([Name des gesuchten Eingabe-Elements der Zeile], [TR-Index] ); Eingabe-Element und evt. auch Titel als Feld extrahierst und hier platzierst.
Blättern kannst Du wie bei Ansatz "A", aber es gibt ein Problem mit definierten Pflichtfeldern, die auf dieser virtuellen Seite nicht dargestellt werden: Während Ansatz "A" sie über <input type="hidden" value="[0/Wert]" ... /> zum schweigen bringt, muss dies für diesen Ansatz händisch über die Methode get_param_value([Feldname]); für jede Darstellung getrennt gelöst werden - machbar, mehr Möglichkeiten der Darstellung, aber mühselig.
WICHTIG: Bitte mit min. der Version 4-2 arbeiten ( siehe ein wenig höher ).
Ebenso wichtig: Mit jedem Seitenwechsel muss entweder die Seite auch gespeichert oder aber die übergebenen Parameter müssen gerettet werden - zweiteres ist absolut nicht zu empfehlen da mit dem Catalog schwierig. Gleichzeitig ist dies aber mit Pflichtfeldern ziemlich schwierig umzusetzen, weil bei Fehlschlag der Prüfung kein Speichern erfolgt. Daher empfehle ich eine händische Prüfung; das Abfragen der gegenwärtigen Werte mittels der Methode get_param_raw( [Feldname] ); um eine Fehlermeldung auszugeben oder evt. den Seitenwechsel zu unterbinden, oder / und mittels der Methode set_patam_attributes(...); vielleicht eine Echtzeitprüfung mittels Java-Script ( onchange / onclick ) zu programmieren damit die Seite z.B. erst garnicht abgeschickt werden kann wenn etwas nicht okay ist.
Beispiel für 5A:
PHP-Code:
<?php
$tag_hiding_obj = new tag_hiding_class();
$tag_hiding_obj->hiding_prepare( $this->field );
$hide_array = array();
switch( $_GET["selectedPage"] )
{
case "main":
$hide_array[] = "email";
$hide_array[] = "company";
$hide_array[] = "website";
break;
case "form2":
$hide_array[] = "gender";
$hide_array[] = "firstname";
$hide_array[] = "lastname";
$hide_array[] = "company";
$hide_array[] = "website";
break;
case "form3":
$hide_array[] = "gender";
$hide_array[] = "firstname";
$hide_array[] = "lastname";
break;
};
echo $tag_hiding_obj->hide_tags( $hide_array );
?>
Beispiel für 5B ( gleiche Felder je Seite wie 5A ):
PHP-Code:
<?php
$tag_hiding_obj = new tag_hiding_class();
$tag_hiding_obj->hiding_prepare( $this->field );
if( $_GET["selectedPage"]=="main" ): ?>
<tr>
<td><?php echo $tag_hiding_obj->get_param_tags( "gender" ); ?></td>
<td><?php echo $tag_hiding_obj->get_param_tags( "firstname" ); ?></td>
<td><?php echo $tag_hiding_obj->get_param_tags( "lastname" ); ?></td>
</tr>
<input type="hidden" name="email" value="<?php echo $tag_hiding_obj->get_param_value( "email" ); ?>" />
<input type="hidden" name="company" value="<?php echo $tag_hiding_obj->get_param_value( "company" ); ?>" />
<input type="hidden" name="website" value="<?php echo $tag_hiding_obj->get_param_value( "website" ); ?>" />
<?php elseif ( $_GET["selectedPage"]=="form2" ): ?>
<tr>
<td><?php echo $tag_hiding_obj->get_param_tags( "email" , 0 ); ?></td>
<td><?php echo $tag_hiding_obj->get_param_tags( "email" ); ?></td>
</tr>
<input type="hidden" name="gender" value="<?php echo $tag_hiding_obj->get_param_value( "gender" ); ?>" />
<input type="hidden" name="firstname" value="<?php echo $tag_hiding_obj->get_param_value( "firstname" ); ?>" />
<input type="hidden" name="lastname" value="<?php echo $tag_hiding_obj->get_param_value( "lastname" ); ?>" />
<input type="hidden" name="company" value="<?php echo $tag_hiding_obj->get_param_value( "company" ); ?>" />
<input type="hidden" name="website" value="<?php echo $tag_hiding_obj->get_param_value( "website" ); ?>" />
<?php else: // $_GET["selectedPage"]=="form3" ?>
<tr>
<td>Mail: <?php echo $tag_hiding_obj->get_param_tags( "email" ); ?>, </td>
<td>Firma: <?php echo $tag_hiding_obj->get_param_tags( "company" ); ?></td>
</tr>
<tr>
<td colspan="2"><?php echo $tag_hiding_obj->get_param_tags( "website" ); ?></td>
</tr>
<input type="hidden" name="gender" value="<?php echo $tag_hiding_obj->get_param_value( "gender" ); ?>" />
<input type="hidden" name="firstname" value="<?php echo $tag_hiding_obj->get_param_value( "firstname" ); ?>" />
<input type="hidden" name="lastname" value="<?php echo $tag_hiding_obj->get_param_value( "lastname" ); ?>" />
<?php endif; ?>
Ich hoffe, ich konnte helfen ! ;)
Liste der Anhänge anzeigen (Anzahl: 2)
Vielen Dank für deine schnelle und ausführliche Antworten.
In meinem Fall kommt sicherlich deine genannte Variante "3B" zur Anwendung.
Es ist wie verhext, ich habe deine Lösungsansatz übernommen und auf meine Felder angepasst, jedoch wird weiterhin das heutige Datum, in der Bearbeitung und beim Erstellen eines neuen Eintrags, angezeigt.
Code:
if( strlen( $tag_hiding_obj->get_param_raw( 'data_entry' ) ) )
Die Überprüfung ob bereits ein Datum hinterlegt ist, wirft immer ein "true" und kapselt somit auch immer die Ausgabe in einen String, der nicht bearbeitet werden kann aber auch mit dem heutigen Datum dargestellt wird.
Mein konkreter Code:
Code:
<?php echo $this->rteConfig; ?>
<?php
require_once('tpl_lib_mix.php');
$tag_hiding_obj = new tag_hiding_class();
$tag_hiding_obj->hiding_prepare( $this->field );
?>
<form action="<?php echo $this->action; ?>" method="post" enctype="<?php echo $this->enctype; ?>">
<div class="formbody">
<input type="hidden" name="FORM_SUBMIT" value="<?php echo $this->formId; ?>" />
<table>
<tr>
<td width='250'>
<fieldset>
<legend>Angaben zur Route</legend>
<div class="formrow">
<div class="formfield">
<div class="formlabel"><?php echo $tag_hiding_obj->get_param_tags( 'bericht_titel', 0 ); ?> </div><div class="formvalue"><?php echo $tag_hiding_obj->get_param_tags( 'bericht_titel' ); ?></div>
</div>
<div class="formfield">
<div class="formlabel">
<?php echo $tag_hiding_obj->get_param_tags( 'bericht_startdatum', 0 ); ?>
</div>
<div class="formvalue">
<?php
if( strlen( $tag_hiding_obj->get_param_raw( 'bericht_startdatum' ) ) )
{
echo $tag_hiding_obj->get_param_value( 'bericht_startdatum' );
echo '<input type="hidden" name="bericht_startdatum" value="' . $tag_hiding_obj->get_param_value( 'bericht_startdatum' ) . '" />';
} else echo $tag_hiding_obj->get_param_tags( 'bericht_startdatum' );
?>
</div>
</div>
</fieldset>
</td>
</table>
<div class="submit_container">
<input type="submit" name="save" id="save" class="tl_submit" accesskey="s" value="<?php echo specialchars($GLOBALS['TL_LANG']['MSC']['save']); ?>" />
<input type="submit" name="saveNclose" id="saveNclose" class="tl_submit" accesskey="c" value="<?php echo specialchars($GLOBALS['TL_LANG']['MSC']['saveNclose']); ?>" />
<input type="submit" name="saveNcreate" id="saveNcreate" class="tl_submit" accesskey="n" value="<?php echo specialchars($GLOBALS['TL_LANG']['MSC']['saveNcreate']); ?>" />
</div>
</td>
</tr>
</table>
</div>
</form>
Evtl. siehst du hier den Fehler. Möchte dich aber auch mit diesem Problem nicht weiterhin stören bzw. aufhalten. Ich versuch weiterhin mal ein paar Alternativen.
Grüße
Gibt es das auch für Dummies
[QUOTE=Timo29;79971]Hallo Zusammen,
Ich hatte ein paar Probleme mit dem anpassen des Formulars im Frontend Editing. Und zwar findet sich das ganze Formlar in einem Array Feld "field" wodurch die Änderung sehr schwer ist. Erstens passte für mein Vorhaben die Tabellenstruktur nicht so ganz und zweitens wolle ich einzelne Felder mit einem Fieldset Gruppieren können, was allerdings auch schwer ist wenn alles in einem Array Feld steht...
Deswegen hat mein Kollege Jens Bernhardt eine Klasse programmiert die mir viel Arbeit abnimmt.
Dadurch kann ich das Template aufbauen wie ich möchte und mit der Funktion einzelne Felder einfügen.
..........
Tolle Sache, sowas suche ich auch. Wäre nett wenn jemand posten würde wohin die Dateien kopiert werden sollen bzw. wie das template anpassen. Eine kleine Anleitung für Dummies halt!!!!