Hi,
ich möchte gerne, dass im frontend in meinen nachrichten ein bild des jeweiligen autors und ein kurztext von ihm steht, wie kann ich das bewerkstelligen?
LG & danke
Hi,
ich möchte gerne, dass im frontend in meinen nachrichten ein bild des jeweiligen autors und ein kurztext von ihm steht, wie kann ich das bewerkstelligen?
LG & danke
Vorschlag: leg Dir einen Artikel mit den Informationen auf einer nicht veröffentlichten Seite an und arbeite in der NAchricht mit dem insert-tag {{insert_article::*}}. Mit einem eigenen HTML-Modul Modul ginge das auch ...
Grüße
drefsa
Aber ich habe ja auch unterschiedliche autoren, wie soll der autor denn dann sein bild und text auswählen?
Unterschiedliche News-kanäle (und Templates?) und der Autor weiß welchen Artikel er einbinden soll. Die Newslist erfasst alle Kanäle ....
Grüße
drefsa
Ich wieß nicht ob das die selbe Idee wie von drefsa ist.
1. Für jeden Autor ein eigenes News-Archiv anlegen mit einer eigenen News-Detailseite
2. Auf der Detailseite die Infos zum Autor als Text-Inhaltselemte anlegen und halt ein News-Details-Modul
3. In dem Modul Newsliste alle Archive einbinden.
Naja es sind so ca 6 autoren, jeder schreibt seine eingene news in die unterschiedlichen newsarchieve.
Eigentlich soll der autor, der nur recht wenig rechte besitzt seinen namen auswählen und das cms fügt automatisch den rest dazu.
Aber das CMS muss die Informationen ja eh irgendwo haben. Und mit meiner Variante wählt der Autor nur sein News-Archiv aus (per Rechteeinstellungen kann man ihn Ja auch darauf beschränken) und im News realer stehen dann seine Infos.
Gesendet von meinem Xperia Z mit Tapatalk
Ja klar, nur das problem ist, dass nicht jeder autor in nur ein newsarchiev schreibt sondern auch in mehrere.
Du könntest eine Mini-Erweiterung schreiben (lassen) die der Benutzerverwaltung ein Feld für die Kurzbeschreibung und ein Bild-Auswahl Feld hinzufügt und in der DB speichert.
Durch eine Template Anpassung oder eventuell den Gebrauch eines Hooks kannst du die neuen Felder dann ausgeben lassen.
Gruß
Nikolas
Okay, das hatte ich nicht gesehen. Da ich nicht so ein Modul wie Rundinhio gesagt hat schreiben könnte würde ich dann wie folgt vorgehen:
NewsarchivA unterteilen in
- NewsarchivA_Autor1
- NewsarchivA_Autor2
- NewsarchivA_Autor3
- NewsarchivA_Autor4
- NewsarchivA_Autor5
- NewsarchivA_Autor6
In die Newsliste alle Archive einbinden
Genauso mit den anderen Archiven verfahren und dann alle Archive von Autor1 auf die Detailseite von Autor1 usw. weiterleiten und da dann die INhaltselemente wie oben beschrieben einfügen.
Per Rechteverwaltung dann die Archive passend für die Autoren freischalten. Das hat auch noch den Vorteil, dass ein Autor nicht an die News eines anderen Autors kann.
Wie schnell brauchst du das denn? Und welche Contao Version setzt du ein?
Gruß
Nikolas
Also momentan ist es nicht so dringend. Ich habe contao 2.11.
Am kommenden Wochenende könnte ich mal kurz was machen wenn's dir bis dahin reicht.
Gesendet von meinem PadFone 2 mit Tapatalk 2
Also das wäre echt der hammer.
Hallo Nikolas,
bist du schon dazu gekommen, die Mini-Erweiterung zu schreiben? Denn genau diese Funktionen brauche ich auch, ebenfalls für Contao 2.11.
Viele Grüße
Sonja
https://contao.org/de/extension-list...000019.de.html
Mit der Avatar-Erweiterung sollte es keine Probleme geben, sowohl für FE oder BE User.
http://www.tim-gatzky.de ˙ auch schon wieder 2 Jahre alt - wie die Zeit vergeht... muss mal umbauen.
Da habe ich auch nach einer passenden Lösung gesucht....leider bisher nur Workarounds. Vor allem würde ich gerne diese Autoreninfos in der seitlichen Spalte anzeigen. Das geht aber anscheinend nicht.
Folgende Lösung via Template:
Inhaltselemente mit den Autoreninfos in einer versteckten Struktur (z.B. "Zusatzinhalte") anlegen
Template news_full.html5
Ist leider etwas hardcoded...aber bei einer überschaubaren Anzahl an Redakteuren (In meinem Beispiel 2) ist diese Abfrage OK.PHP-Code:
<?php if ($this->author == "von Max Muster"): ?>
{{insert_content::28}}
<?php elseif ($this->author == "von Manu Muster"): ?>
{{insert_content::29}}
<?php else: ?>
<?php echo $this->author; ?>
<?php endif; ?>
vg
Geändert von Kahmoon (21.08.2015 um 13:06 Uhr)
Also diese Lösung (MacGyver?) funktioniert - doch für ein CMS in der Qualität von Contao doch eher fraglich. Da baue ich im Template also eine Datenbank ein. (?????) Dass da nicht schon lang was im Core passiert ist, wundert mich sehr. Die Anfragen sind ja schon seit Jahren da.
Also das eine Datenbank Abfrage gemacht werden muss wäre mir neu ;-)
Ich habe das bei meinem Projekt wie folgt gelöst:
Dazu müsst ihr noch die Erweiterung inserttags installieren und könnt komfortabel im Backend die Inserts pflegen.PHP-Code:
<?php echo $this->replaceInsertTags('{{custom::'.str_replace(" ","_",$this->author).'}}'); ?>
Wau das ist ja ein geiler Scriptschnipsel, besten Dank Anischy. Auch für die seitlichen Spalten kein Problem. Ich habe einfach ein news_nachrichtenleser_author erstellt der nur den Code von Ainschy enthält, dann ein neues Nachrichten Leser Modul mit dem erstellten Template, und das Modul dann in die Sidebar einbauen. Falls Kommentare aktiviert sind einfach mit .back, .ce_comments {display: none;} ausblenden.
Bei mir gibt dieses Code snippet leider nichts aus.
Wenn ich hingegeben {{custom::meinplatzhalter}} einfüge, wird der zuvor angelegte Platzhalter angezeigt.
Aber ich stehe vor einem generellen Verständnisproblem:
Man hat mehrere Autoren, wie muss man das ganze aufbauen um jedem Autor einen eigenen Text zuzuweisen?
Dieser Text soll automatisch ausgegeben werden, je nachdem welcher Autor beim Nachrichtenbeitrag gewählt wird.
Dass ich dieses snippet dann in das Template newsreader einfügen muss ist mir klar. Aber das ganze Prozedere "davor" verstehe ich nicht.
Funktioniert diese Lösung überhaupt für meinen Anwendungsfall?
Vielen Dank für deine Hilfe.
Ich habe folgendes im newsreader Template hinzugefügt:
Und folgenden Platzhalter angelegt: Bezeichnung: _Max_MusterCode:<?php echo $this->replaceInsertTags('{{custom::'.str_replace(" ","_",$this->author).'}}'); ?>
Dieser Platzhalter enthält spezifischen Content. Wird nicht limitiert, wird angewendet im FE und nicht zwischengespeichert.
Weiters habe ich einen Benutzer "Max Muster" erstellt. Dieser Benutzer wird in einem Nachrichtenbeitrag als Autor ausgewählt.
Das Ergebnis ist dass an der stelle mit dem code snippet nichts ausgegeben wird.
Ich rätsle gerade an was es hier noch scheitert Hab jetzt auch noch testweise den Platzhalter umbenannt auf den Benutzernamen des Autors, hat ebenfalls nichts gebracht.
Einen Hook oder so muss ich ja nicht mehr registrieren, das nimmt mir die Erweiterung ja ab, oder?
An deiner Stelle würde ich nun verschiedenes testen.
Wird der Author korrekt ausgegeben
Wird der Custom Inserttag korrekt ausgegeben?Code:<?php echo $this->author; ?>
Daten die an das Template übergeben werden können mittelsCode:{{custom::_Vorname_Nachname}}
im Frontend ausgegeben werden.Code:<?php echo $this->showTemplateVars(); ?>
Ich hoffe du kommst deiner Fehleranalyse ein gutes Stück weiter.
Danke, habe nun folgendes getestet:
gibt aus: "von Max Muster" (also korrekt)Code:<?php echo $this->author; ?>
gibt aus: "Spezifischen Content den ich im Platzhalter definiert habe" (also auch korrekt)Code:{{custom::_Max_Muster}}
Gibt sehr langen Code aus. In Zusammenhang mit "author" u.a. folgendes:Code:<?php echo $this->showTemplateVars(); ?>
Code:[author] => von Max MusterCode:[news_metaFields] => a:2:{i:0;s:4:"date";i:1;s:6:"author";}Code:[author] => 1Code:[author] => Array ( [table] => tl_user [field] => id [type] => hasOne [load] => eager )Da die ersten beiden Ausgaben ja so stimmen, frage ich mich an was es hier scheitert.Code:[author] => Contao\UserModel Object ( [arrData:protected] => Array ( [id] => 1 [tstamp] => 1494489262 [username] => maxmuster [name] => Max Muster und viele weitere Zeilen...
Denn wenn beide stimmen müsste es doch eigentlich funktionieren
Hab jetzt auch noch alle Caches usw geleert und geprüft ob die DB aktuell ist.
Den Platzhalter hab ich zum testen auch mal als Max_Muster (also ohne dem ersten underscore - wozu wird der eig. benötigt?) benannt, ebenfalls keine Ausgabe.
Edit:
Habe mir den Kopf zerbrochen über die Logik des snippets, verstehe es jedoch noch nicht ganz.
$this->replaceInsertTags stellt sicher dass man sein eigenes Inserttag verwenden kann.Code:<?php echo $this->replaceInsertTags('{{custom::'.str_replace(" ","_",$this->author).'}}'); ?>
custom::'.str_replace(" ","_",$this->author verwandelt die Leerzeichen in underscores und greift auf den Namen des Autors zurück.
Doch welche Logik ist dafür zuständig dass dem Autor das passende custom Inserttag mit dem gleichen Namen, nur eben mit underscores, zuweist?
Passiert das hier bereits? Tut mir leid, habs mit PHP nicht so.
Geändert von gm-team (20.05.2017 um 16:41 Uhr)
Den Custom Insert Tag musst du ja selbst anlegen.
Ja das habe ich schon verstanden Wie ich geschrieben hatte wird der mittels {{custom::_Max_Muster}} auch korrekt ausgegeben.Den Custom Insert Tag musst du ja selbst anlegen.
DANKE hier lag der Hund begraben. D.h. von der Logik her bedeutet es:Dann ändere dein Custom Inserttag in "von_Max_Muster" ggf. musst du bei Mehrsprachigkeit weitere Inserttags anlegen.
[author] => von Max Muster ersetze "von Max Muster" mit dem gleichnamigen custom Inserttag und wandle Leerzeichen in underscores um.
Autoren sind Datensätze aus tl_user (Benutzer, BE-User). Du musst also in tl_user ein Feld hinzufügen tl_user.myDescription. Neue Felder anlegen findest du über Google, das ist nicht so schwer.
Jetzt kannst du im BE einem User den Text in das neue Feld eintragen.
Im Newstemplate kannst du es so holen. Zuerst holst du die ID des Autors (User in tl_user) über ein NewsModel, da die ID leider nicht in $this->arrData mit dabei ist, sondern nur ein über ein Sprachbaustein aufbereiteter Benutzer-Name. Die ID steht in tl_news.author.
Jetzt kann man über die ID des Autors ein UserModel erstellen und damit sämtliche Daten (Felder aus tl_user) des Autors (Users) abgreifen.PHP-Code:
$authorID = \NewsModel::findByPk($this->id)->author;
PHP-Code:
$author = \UserModel::findByPk($authorID);
dump($author->email);
dump($author->username);
dump($author->myDescription);
Geändert von Andreas (21.05.2017 um 22:26 Uhr)
Bitte!
Vor Anfragen im Forum HTML validieren.
Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.
Vielen Dank an alle Wunschlistenerfüller
Andreas Burg, Web Solutions
Danke Andreas für deine ausführliche Anleitung. Ich habe es zwar bereits mit der Lösung "Platzhalter" geschafft, jedoch hat es mich dennoch interessiert wie das funktioniert.
Habe mal nach folgender Anleitung versucht ein Feld zu erstellen: https://docs.contao.org/books/manual...nzufuegen.html
Leider passiert beim aktualisieren der DB nichts.
Habe eine Datei user_authordescription/dca/tl_user_authordescription.php ins Module-Verzeichnis abgelegt.
Hier der Code:
Ganz durchschaut habe ich den Abschnitt bei str_replace noch nicht, jedenfalls gibt es einen Fehler aus wenn ich weniger als 3 Argumente (?) übergebe.Code:<?php $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] = str_replace ( 'title', 'title,authordescription', $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] ); $GLOBALS['TL_DCA']['tl_user']['fields']['authordescription'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_user']['authordescription'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'rgxp'=>'digit', 'maxlength'=>8), 'sql' => "varchar(8) NOT NULL default ''" ); ?>
Hab dann noch die Systemwartung durchgeführt und den Autoload-Creator für das Modul aktiviert.
Sprachdateien sowie Templates hab ich erstmal weggelassen, sind die zwingend erforderlich?
Da die Ausgabe von Benutzerinformationen auch ohne dem neuen Feld funktioniert, habe ich auch noch folgenden Code ins newsreader Template eingefügt:
Gibt folgendes aus:Code:<?php $authorID = \NewsModel::findByPk($this->id)->author; $author = \UserModel::findByPk($authorID); dump($author->email); dump($author->username); ?>
string(12) "email@user01.com"
string(5) "user01"
Das funktioniert also soweit, nur dass es nicht nur rein den Inhalt ausgibt.
die Datei muss tl_user.php heißen
Die Sprachdateien würde ich auch anlegen, sonst hast du nur Feldnamen in der Ansicht.
Geändert von 07alex07 (21.05.2017 um 13:01 Uhr)
Danke, damit konnte ich nun die DB aktualisieren.
Man sieht nun auch die neue Spalte in der DB, jedoch noch kein neues Feld im Contao in den Benutzereinstellungen.
Das dürfte daran liegen, daß Du mit
sagst: ersetze in $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] die Zeichenkette 'title' durch die Zeichenkette 'title,authordescription' und weise das Ergebnis $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] zu. Da in $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] title nicht vorkommt wird nichts gemacht. Das resultiert darin, daß authordescription nicht in der Palette (Liste der anzuzeigenden Felder) auftaucht und daher Dein Feld nicht angezeigt wird.PHP-Code:
$GLOBALS['TL_DCA']['tl_user']['palettes']['default'] = str_replace
(
'title',
'title,authordescription',
$GLOBALS['TL_DCA']['tl_user']['palettes']['default']
);
Geändert von fiedsch (21.05.2017 um 17:20 Uhr)
Contao-Community-Treff Bayern: http://www.contao-bayern.de
Ok danke, das heißt erstens dass ich eine Zeichenkette ersetzen möchte und zweitens dass diese gar nicht existiert.
Aber ich möchte ja eigentlich nichts ersetzen, sondern hinzufügen. Oder ist das ersetzen mehr als erweitern angedacht?
Dann wäre das für mich logisch nachvollziehbar.
So wie ich das verstehe lautet meine Palette im Backend "Name und E-Mail" und beinhaltet die Felder "Benutzername", "Name" und "E-Mail".
Nach dieser Logik müsste ich diese 3 Felder um ein viertes erweitern. Stimmt das so?
Außerdem müsste ich wissen wie die Palette und die Felder im System bezeichnet werden. Bei Rechtsklick auf untersuchen sehe ich eine ID="pal_name_legend"
was ja schonmal theoretisch für Palette stehen könnte Weiters "ctrl_username", "ctrl_name" und "ctrl_email".
Haken an der Sache ist nur, dass in dem Beispiel aus dem Manual "company" steht, was eine Spalte in der DB darstellt bzw. ein Feld im BE, jedoch keine Palette.
D.h. ganz richtig kann meine bisherige Annahme also nicht sein.
ich habe deshalb testhalber mal folgendes versucht - es taucht kein Feld auf:
Code:$GLOBALS['TL_DCA']['tl_user']['palettes']['default'] = str_replace ( 'name', 'name,authordescription', $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] );
Die PHP-Funktion heißt aber str_replace, also ersetzen. Vom Ergebnis her hängst Du aber natürlich an, wenn Du X durch X,Y ersetzt.
Fie Palette ist das, was Du in der Datei system/modules/core/dca/tl_user.php unterSo wie ich das verstehe lautet meine Palette im Backend "Name und E-Mail" und beinhaltet die Felder "Benutzername", "Name" und "E-Mail".
findest. Also der Bereich ''{name_legend},username,name,email;', aber eben nicht nur dieser. Was Du mittels str_replace() ersetzt hängt davon ab, wo Du Dein neues Feld einfügen möchtest. Das kann man also nicht pauchal sagen.PHP-Code:
'palettes' => array
(
...
)
Dazu ist es m.E. am einfachsten, im Code nachzulesen. (Datei s.o.)Außerdem müsste ich wissen wie die Palette und die Felder im System bezeichnet werden.
Deine Vorstellung von Palette ist wahrscheinlich nicht korrekt. Die Palette beschreibt das gesamte Backen-Formular. Ich nehme an, Du beziehst Dich auf einen Bereich davon.Haken an der Sache ist nur, dass in dem Beispiel aus dem Manual "company" steht, was eine Spalte in der DB darstellt bzw. ein Feld im BE, jedoch keine Palette.
D.h. ganz richtig kann meine bisherige Annahme also nicht sein.
Das sollte eigentlich funktionieren. Du hast auch den Cache gelöscht? (System -> Systemwartung -> Internen Cache leeren).ich habe deshalb testhalber mal folgendes versucht - es taucht kein Feld auf:
Code:$GLOBALS['TL_DCA']['tl_user']['palettes']['default'] = str_replace ( 'name', 'name,authordescription', $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] );
Contao-Community-Treff Bayern: http://www.contao-bayern.de
Ja das hatte ich. Nun ist es mir klar, die Palette enthält einen oder mehrere Bereiche, getrennt durch Semikolon, welche jeweils ein oder mehrere Felder, getrennt durch Komma, enthalten.Deine Vorstellung von Palette ist wahrscheinlich nicht korrekt. Die Palette beschreibt das gesamte Backen-Formular. Ich nehme an, Du beziehst Dich auf einen Bereich davon.
Die Systemwartung hatte ich durchgeführt, leider taucht noch nichts auf, weder beim bearbeiten eines bestehenden Benutzers noch beim neuanlegen.
tl_user.php sieht nun so aus:
Die DB lässt sich natürlich nicht mehr aktualisieren, da der neue Eintrag ja schon drin ist. Kann es damit zusammenhängen?Code:<?php $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] = str_replace ( 'name', 'name,authordescription', $GLOBALS['TL_DCA']['tl_user']['palettes']['default'] ); $GLOBALS['TL_DCA']['tl_user']['fields']['authordescription'] = array ( 'label' => &$GLOBALS['TL_LANG']['tl_user']['authordescription'], 'exclude' => true, 'inputType' => 'text', 'eval' => array('mandatory'=>true, 'rgxp'=>'digit', 'maxlength'=>8), 'sql' => "varchar(8) NOT NULL default ''" ); ?>
Ich nehme an (=ungetestet), daß Du spezifischer sein muss mit Deiner String-Ersetzung.
In der tl_user.php von Contao steht
d.h. "ersetze name durch name,userdescription macht darausPHP-Code:
'default' => '{name_legend},username,name,email;{backend_legend:hide},language,uploader,showHelp,thumbnails,useRTE,useCE;{theme_legend:hide},backendTheme;{password_legend:hide},pwChange,password;{admin_legend},admin;{groups_legend},groups,inherit;{account_legend},disable,start,stop',
(alle Vorkommen von name werden ersetzt). Das ist aber nicht das, was Du haben willst.PHP-Code:
'default' => '{name,userdescription_legend},username,userdescription,name,userdescription,email;{backend_legend:hide},language,uploader,showHelp,thumbnails,useRTE,useCE;{theme_legend:hide},backendTheme;{password_legend:hide},pwChange,password;{admin_legend},admin;{groups_legend},groups,inherit;{account_legend},disable,start,stop',
sollte passen.PHP-Code:
str_replace
(
',name,',
',name,authordescription,',
$GLOBALS['TL_DCA']['tl_user']['palettes']['default']
);
Contao-Community-Treff Bayern: http://www.contao-bayern.de
Sorry, aber der Thread hier ist viel zu lang, für so eine einfache Aufgabe ein Feld hinzuzufügen. (Und PHP-Code hier im Forum bitte immer in den PHP-Wrapper setzen.)
system/modules/z_my_fields/dca/tl_user.php:
Ich habe mal das Feld text von tl_content als Vorlage genommen. Hilfstexte erstmal hardcodiert.PHP-Code:
<?php
// Palettes
$GLOBALS['TL_DCA']['tl_user']['palettes']['admin'] = str_replace(
',name,',
',name,authorDescription,',
$GLOBALS['TL_DCA']['tl_user']['palettes']['admin']
);
// Fields
$GLOBALS['TL_DCA']['tl_user']['fields']['authorDescription'] = array
(
'label' => array('authorDescription Kurz', 'authorDescription Lang'),
'exclude' => true,
'search' => true,
'inputType' => 'textarea',
'eval' => array('mandatory'=>false, 'rte'=>'tinyMCE', 'helpwizard'=>true, 'tl_class'=>'clr'),
'explanation' => 'insertTags',
'sql' => "mediumtext NULL"
);
Grad in tl_user gibt es zufällig nicht nur die default-Palette.
https://github.com/contao/core/blob/....php#L120-L130
Ich weiß nicht, wofür die alle da sind.
Die admin ist für BE-Benutzerverwaltung-Benutzer-Bearbeiten
Die login ist für den Benutzerlink oben in der Kopfzeile.
Wenn du es auf alle, oder mehrere aufsetzen willst, kannst du das so machen.
Tipps:PHP-Code:
// Palettes
/** all palettes */
foreach($GLOBALS['TL_DCA']['tl_user']['palettes'] as $key => $value)
{
if($key == '__selector__')
{
continue;
}
$GLOBALS['TL_DCA']['tl_user']['palettes'][$key] = str_replace(
',name,',
',name,authorDescription,',
$GLOBALS['TL_DCA']['tl_user']['palettes'][$key]
);
}
Wenn du nicht weißt wie der/die Palette-String/s ausehen. Kannst du nachsehen über eine Kopie von Template be_main.
Schaue auch in die Dateien, welche im Core in den dca/ Ordnern liegen.PHP-Code:
<?php dump($GLOBALS['TL_DCA']['tl_user']['palettes']); ?>
Lese dich in die Referenzen ein https://docs.contao.org/books/api/dca/reference.html.
Einen schnellen aber updatesicheren Vorabtest kannst du über die system/config/dcaconfig.php machen. Code einfach da rein. Anstatt system/modules/z_my_fields/dca/tl_user.php
Die Hilfeseite war die richtige. Hier ist die aktuellste Version https://docs.contao.org/books/cookbo...om-fields.html.
ctrl_username usw. war richtig (field username).
Bitte!
Vor Anfragen im Forum HTML validieren.
Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.
Vielen Dank an alle Wunschlistenerfüller
Andreas Burg, Web Solutions
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)