Liste der Anhänge anzeigen (Anzahl: 2)
tl_member.php - Mitglieder zusätzliche Felder hinzufügen scheitert bei Darstellung
Hallo
Problembeschreibung:
Über /contao/dca/tl_member.php kann ich zusätzliche Felder in die Datenbank schreiben und im Backend auch anzeigen, aber nicht richtig beschreiben.
Der Fehler verbirgt sich möglicherweise in der PHP-Anweisung in meiner tl_member.php:
PHP-Code:
// Neue Datenbankfelder einreihen im Backend nach dem Feld 'gender'
// customer_number_my,customer_start_my,customer_stop_my,customer_memo_my',
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] = str_replace
(
'gender',
'gender,customer_number_my,customer_start_my,customer_stop_my,customer_memo_my',
$GLOBALS['TL_DCA']['tl_member']['palettes']['default']
);
Im Backend werden (nach Prod.-Cache erneuern) im Abschnitt Personendaten nun korrekt angezeigt:
Vorname, Nachname, Geburtsdatum, Geschlecht, customber_number_my, customer_start_my, customer_stop_my, customer_memo_my.
In folgenden Feldern ist KEINE Dateneingabe mehr möglich:
Vorname, Nachname, Geburtsdatum, Geschlecht, customer_start_my, customer_stop_my.
In folgenden Feldern IST eine Dateneingabemöglich:
customber_number_my, customer_memo_my.
Was mich wundert:
Die Dateneingabe im Abschnitt Adressdaten in allen anderen Feldern Firma, Strasse etc. funktioniert einwandfrei
Was habe ich getan?
[1] Per FTP die Datei tl_member.php ins Verzeichnis /contao/dca/ hochgeladen
(Neue Verzeichnisstruktur ab 4.8 https://contao-academy.de/blog/conta...und-langconfig)
[2] über www.meine-url/contao-manager.phar.php/ den Prod.-Cache erneuert
[3] über www.meine-url/contao/install die Datenbank aktualisiert
Im Anhang befindet sich meine tl_member.php als txt-Datei Anhang 23452
sowie ein Screenshot vom Backend > Mitglieder Anhang 23453
Danke für Hinweise - ich weiss nicht mehr weiter.
Gruss von Marcel aus Basel
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Zitat von
Spooky
Hallo Spooky
Danke für den Link. Mit PaletteManipulator hat es bei mir mit 4.8 (vorerst) noch nicht funktioniert. Muss ich PaletteManipulator erst installieren? Ich sehe kein Verzeichnis Contao\CoreBundle\DataContainer\PaletteManipulator auf dem Webserver und auch nicht als Paket zum installieren.
So funktionieren die Datenbankfelder schon mal (mit str_replace):
PHP-Code:
// Neue Datenbankfelder einreihen im Backend nach dem Feld 'gender'
// 'customer_number_my,customer_start_my,customer_stop_my,customer_memo_my',
// Hilfe: https://docs.contao.org/dev/framework/dca/palettemanipulator/
// contao/dca/tl_member.php
// appending custom_field to the palette
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] .= ';{Mitgliedernummer},customer_number_my';
// using str_replace() to insert the field after the "gender"
str_replace('gender', 'gender,customer_number_my', $GLOBALS['TL_DCA']['tl_member']['palettes']['default']);
// appending custom_field to the palette
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] .= ';{Eintritt},customer_start_my';
// using str_replace() to insert the field after the "customer_number_my"
str_replace('customer_number_my', 'customer_number_my,customer_start_my', $GLOBALS['TL_DCA']['tl_member']['palettes']['default']);
// appending custom_field to the palette
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] .= ';{Austritt},customer_stop_my';
// using str_replace() to insert the field after the "customer_start_my"
str_replace('customer_start_my', 'customer_start_my,customer_stop_my', $GLOBALS['TL_DCA']['tl_member']['palettes']['default']);
// appending custom_field to the palette
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] .= ';{Notiz},customer_memo_my';
// using str_replace() to insert the field after the "customer_stop_my"
str_replace('customer_stop_my', 'customer_stop_my,customer_memo_my', $GLOBALS['TL_DCA']['tl_member']['palettes']['default']);
Die Felder tauchen jedoch im Backend erst am Ende - und nicht nach dem Feld 'gender' auf. Anhang 23454
Was nicht funktioniert, alle Felder in einem Rutsch in $GLOBALS['TL_DCA']['tl_member']['palettes']['default'] schreiben wie bsp.:
PHP-Code:
$GLOBALS['TL_DCA']['tl_member']['palettes']['default'] .= ';{Mitgliederdaten},customer_number_my,customer_start_my,customer_stop_my,customer_memo_my';
// using str_replace() to insert the field after the "gender"
str_replace('gender', 'gender,customer_number_my,customer_start_my,customer_stop_my,customer_memo_my', $GLOBALS['TL_DCA']['tl_member']['palettes']['default']);
Die Felder tauchen zwar nun in einem gemeinsamem Ausklappmenü Mitgliederdaten auf, aber die Dateneingabe in customer_start_my und customer_stop_my funktionieren nicht mehr.
Mit PaletteManipulator die Installation zerschossen
Zitat:
Zitat von
Spooky
Der PaletteManipulator ist ein FQCN (Fully Qualified Class Name).
Ich hab grad das Problem, dass ich mir dem Code unter https://docs.contao.org/dev/framewor...temanipulator/ > Another method is by using the PaletteManipulator die Installation zerschossen habe. Ich erhalte nach der Cache-Aktualiserung nur noch die Fehlermeldung:
ERROR 500 Malformed UTF-8 characters, possibly incorrectly encoded
... und nichts geht mehr. Auch die tl_member löschen hilft nicht.
Frage: Soll/muss die tl_member im UTF8-Format oder in ANSI 1252 gespeichert werden?
PaletteManipulator funktioniert
[QUOTE=Spooky;524297]Das siehst du direkt in der Originaldatei: https://github.com/contao/contao/blo...member.php#L99
Danke für deine grosse Hilfe. Jetzt hat es geklappt
PHP-Code:
PaletteManipulator::create()
// apply the field "custom_field" after the field "gender"
->addField('custom_field', 'gender')
// now the field is registered in the PaletteManipulator
// but it still has to be registered in the globals array:
// https://github.com/contao/contao/blob/c9e195891d08bdb26504c394775cf956f23bf719/core-bundle/src/Resources/contao/dca/tl_member.php#L99
->applyToPalette('default', 'tl_member')
;
Was nicht funktioniert hat, ist nach Anleitung https://docs.contao.org/dev/reference/dca/fields/ eine neues Datenbankfeld anzulegen:
PHP-Code:
$GLOBALS['TL_DCA']['fields']['tl_member'] = [
'custom_field' => [
'label' => &$GLOBALS['TL_LANG']['tl_member']['custom_field'],
'exclude' => true,
'inputType' => 'text',
'eval' => ['tl_class'=>'w50', 'maxlength'=>128],
'sql' => "varchar(128) NOT NULL default ''",
]
];
Ich verwende deshalb wie bisher:
PHP-Code:
$GLOBALS['TL_DCA']['tl_member']['fields']['custom_field'] = array
(
'label' => &$GLOBALS['TL_LANG']['tl_member']['custom_field'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('mandatory'=>false, 'rgxp'=>'text', 'maxlength'=>128, 'placeholder'=>'Zusätzliches Feld', 'feEditable'=>true, 'feViewable'=>true, 'feGroup'=>'personal', 'tl_class'=>'w50'),
'sql' => "varchar(128) NOT NULL"
);
Mir ist aufgefallen, dass in der ersten Anweisung [tl_member] an einer anderen Stelle steht als im der funktionierenden zweiten Anweisung.
Liste der Anhänge anzeigen (Anzahl: 1)
Problem mit mehreren Datumsfeldern
Die zusätzlichen Datumsfelder schaffen erneut das Problem, dass einige Mitgliederfelder nicht mehr funktionieren.
PHP-Code:
$GLOBALS['TL_DCA']['tl_member']['fields']['mitglied_start_my'] = [
//'label' => &$GLOBALS['TL_LANG']['tl_member']['mitglied_start_my'],
'exclude' => true,
'inputType' => 'text',
'eval' => ['rgxp'=>'date', 'datepicker'=>true, 'feEditable'=>true, 'feViewable'=>true, 'feGroup'=>'personal', 'tl_class'=>'w50 wizard'],
'sql' => "varchar(11) NOT NULL"
];
$GLOBALS['TL_DCA']['tl_member']['fields']['mitglied_stop_my'] = [
//'label' => &$GLOBALS['TL_LANG']['tl_member']['mitglied_stop_my'],
'exclude' => true,
'inputType' => 'text',
'eval' => ['rgxp'=>'date', 'datepicker'=>true, 'feEditable'=>true, 'feViewable'=>true, 'feGroup'=>'personal', 'tl_class'=>'w50 wizard'],
'sql' => "varchar(11) NOT NULL"
];
PaletteManipulator::create()
// apply the field "privat_email_my" after the field "gender" etc, etc ...
->addField('mitglied_memo_my', 'gender')
->addField('mitglied_stop_my', 'gender')
->addField('mitglied_start_my', 'gender')
->addField('mitglied_number_my', 'gender')
->addField('privat_email_my', 'gender')
// now the field is registered in the PaletteManipulator
// but it still has to be registered in the globals array:
// https://github.com/contao/contao/blob/c9e195891d08bdb26504c394775cf956f23bf719/core-bundle/src/Resources/contao/dca/tl_member.php#L99
->applyToPalette('default', 'tl_member')
Der HTML-Code sieht wie folgt aus:
HTML-Code:
<fieldset id="pal_personal_legend" class="tl_tbox">
<legend onclick="AjaxRequest.toggleFieldset(this,'personal_legend','tl_member')">Personendaten</legend>
<div class="w50 widget">
<h3><label for="ctrl_firstname"><span class="invisible">Pflichtfeld </span>Vorname<span class="mandatory">*</span></label></h3>
<input type="text" name="firstname" id="ctrl_firstname" class="tl_text" value="Mario" required="" maxlength="255" onfocus="Backend.getScrollOffset()">
<p class="tl_help tl_tip" title="">Bitte geben Sie den Vornamen ein.</p>
</div>
<div class="w50 widget">
<h3><label for="ctrl_lastname"><span class="invisible">Pflichtfeld </span>Nachname<span class="mandatory">*</span></label></h3>
<input type="text" name="lastname" id="ctrl_lastname" class="tl_text" value="Borsetti" required="" maxlength="255" onfocus="Backend.getScrollOffset()">
<p class="tl_help tl_tip" title="">Bitte geben Sie den Nachnamen ein.</p>
</div>
<div class="w50 wizard widget">
<h3><label for="ctrl_dateOfBirth">Geburtsdatum</label></h3>
<input type="text" name="dateOfBirth" id="ctrl_dateOfBirth" class="tl_text" value="1956-04-22" onfocus="Backend.getScrollOffset()"> <img src="assets/datepicker/images/icon.svg" alt="" title="" id="toggle_dateOfBirth" style="cursor:pointer" width="20" height="20">
<script>
window.addEvent("domready", function() {
new Picker.Date($("ctrl_dateOfBirth"), {
draggable: false,
toggle: $("toggle_dateOfBirth"),
format: "%Y-%m-%d",
positionOffset: {x:-211,y:-209},
pickerClass: "datepicker_bootstrap",
useFadeInOut: !Browser.ie,
startDay: 1,
titleFormat: "%d. %B %Y"
});
});
</script>
<p class="tl_help tl_tip" title="">Bitte geben Sie das Geburtsdatum ein.</p>
</div>
<div class="w50 widget">
<h3><label>Geschlecht</label></h3>
<select name="gender" id="ctrl_gender" class="tl_select" onfocus="Backend.getScrollOffset()"><option value="">-</option><option value="male" selected="">Männlich</option><option value="female">Weiblich</option><option value="other">Divers</option></select>
<p class="tl_help tl_tip" title="">Bitte wählen Sie das Geschlecht.</p>
</div>
<div class="w50 widget">
<h3><label for="ctrl_privat_email_my">privat_email_my</label></h3>
<input type="text" name="privat_email_my" id="ctrl_privat_email_my" class="tl_text" value="" maxlength="128" placeholder="E-Mail Privat" onfocus="Backend.getScrollOffset()">
</div>
<div class="ctr widget">
<h3><label for="ctrl_mitglied_number_my"><span class="invisible">Pflichtfeld </span>mitglied_number_my<span class="mandatory">*</span></label></h3>
<input type="text" name="mitglied_number_my" id="ctrl_mitglied_number_my" class="tl_text" value="0" required="" maxlength="8" placeholder="Mitgliedernummer" style="width:128px;" onfocus="Backend.getScrollOffset()">
</div>
<div class="w50 wizard widget">
<h3><label for="ctrl_mitglied_start_my">mitglied_start_my</label></h3>
<input type="text" name="mitglied_start_my" id="ctrl_mitglied_start_my" class="tl_text" value="" onfocus="Backend.getScrollOffset()"> <img src="assets/datepicker/images/icon.svg" alt="" title="" id="toggle_mitglied_start_my" style="cursor:pointer" width="20" height="20">
<script>
window.addEvent("domready", function() {
new Picker.Date($("ctrl_mitglied_start_my"), {
draggable: false,
toggle: $("toggle_mitglied_start_my"),
format: "%Y-%m-%d",
positionOffset: {x:-211,y:-209},
pickerClass: "datepicker_bootstrap",
useFadeInOut: !Browser.ie,
startDay: 1,
titleFormat: "%d. %B %Y"
});
});
</script>
</div>
<div class="w50 wizard widget">
<h3><label for="ctrl_mitglied_stop_my">mitglied_stop_my</label></h3>
<input type="text" name="mitglied_stop_my" id="ctrl_mitglied_stop_my" class="tl_text" value="" onfocus="Backend.getScrollOffset()"> <img src="assets/datepicker/images/icon.svg" alt="" title="" id="toggle_mitglied_stop_my" style="cursor:pointer" width="20" height="20">
<script>
window.addEvent("domready", function() {
new Picker.Date($("ctrl_mitglied_stop_my"), {
draggable: false,
toggle: $("toggle_mitglied_stop_my"),
format: "%Y-%m-%d",
positionOffset: {x:-211,y:-209},
pickerClass: "datepicker_bootstrap",
useFadeInOut: !Browser.ie,
startDay: 1,
titleFormat: "%d. %B %Y"
});
});
</script>
</div>
<div class="ctr widget">
<h3><label for="ctrl_mitglied_memo_my">mitglied_memo_my</label> <img src="system/themes/flexible/icons/wrap.svg" alt="Zeilenumbruch" title="" class="toggleWrap" onclick="Backend.toggleWrap('ctrl_mitglied_memo_my')" width="14" height="14"></h3>
<textarea name="mitglied_memo_my" id="ctrl_mitglied_memo_my" class="tl_textarea" rows="1" cols="1" maxlength="1023" placeholder="Bemerkungen" style="width: 100%; min-height: 64px; height: 30px;" onfocus="Backend.getScrollOffset()"></textarea>
</div>
</fieldset>
Hier die Eingabemaske als Screenshot. Ich vermute, es handelt sich um eine Problem mit dem Widget Datumspicker: Anhang 23460