Contao-Camp 2024
Ergebnis 1 bis 21 von 21

Thema: Contao 4 Inhaltselemente erweitern

  1. #1
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard Contao 4 Inhaltselemente erweitern

    Hallo zusammen,

    ich möchte mich gerne mit der Entwicklung von Erweiterung von Contao 4 beschäftigen. Im ersten Schritt möchte ich bestehende Inhaltselemte um Felder erweitern. Später möchte ich eigene Backendmodule entwickeln. Ich habe bisher noch keine Erfahrung in diesem Bereich, auch nicht unter Contao 3. Ich habe schon mehrere Anläufe für mein Vorhaben unternommen, aber meistens scheiterte es an zu viel Verwirrung und, meiner Meinung nach, mangelnden klaren Anleitungen.

    Ich bin gerade nochmal dieses Beispiel aus der offiziellen Dokumentation durchgegangen. Leider ohne Erfolg.

    Ich habe auch schon nach YouTube Tutorials gesucht, aber besonders für Contao 4 ist das Angebot hier sehr dünn. Auch die Videos von Leo Feyer und Christian Schiffler konnten die Verwirrung bei mir nicht lösen. Habe das Gefühl diese Videos sind eher für erfahrene Entwickler geeignet.

    Wie gesagt, habe schon mehrere Anläufe unternommen und mir wirklich eine Menge Material angeschaut, aber wusste leider nie, wo ich ansetzen soll. Ihr seid meine letzte Hoffnung sozusagen


    Nun ein paar Fragen.

    1.) Wie sehr seht ihr einen Vorteil darin, wenn man Erfahrung in der Entwicklung von Erweiterungen für Contao 3 hat. Wenn ich eigentlich nur für 4 entwickeln will, sollte ich trotzdem erstmal Erweiterungen für 3 entwickeln? Der Gedanke widerstrebt mir ehrlich gesagt ziemlich.
    2.) Könnt ihr anfängerfreundliche Ressourcen empfehlen? Am schönsten sind natürlich so step by step tutorials.
    3.) Könnt ihr vielleicht ein Vorgehen empfehlen um das Entwickeln von Erweiterungen zu erlernen? Also z.B. zuerst Inhaltselemnte um Felder erweitern, dann ein nächster Step und letztendlich ein vollständiges Backendmodul.


    Freue mich auf konstruktive Antworten und wünsche einen guten Start ins Wochenende.

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.050
    Partner-ID
    10107

    Standard

    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Ich bin gerade nochmal dieses Beispiel aus der offiziellen Dokumentation durchgegangen. Leider ohne Erfolg.
    Was bedeutet das? Was genau hast du gemacht und was war dann "ohne Erfolg"?

  3. #3
    Contao-Fan Avatar von Stefko
    Registriert seit
    25.10.2012.
    Ort
    Karlsruhe
    Beiträge
    771
    User beschenken
    Wunschliste

    Standard

    Ahoi,
    vielleicht bringt Dich das HellWorldBundle-Tutorial etwas weiter.
    https://gist.github.com/joergmoldenhauer
    Grüße, Stefko

  4. #4
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Was bedeutet das? Was genau hast du gemacht und was war dann "ohne Erfolg"?

    Ich habe unter app/Resources/contao/dca eine Datei tl_news.php angelegt. Habe den Code aus dem Beispiel in diese Datei kopiert. Dann den Symfony Cache geleert. Also wie im Beispiel beschrieben. Danach heißt es im Beispiel:
    Now the field will be available when editing a news entry:
    Bin also davon ausgegangen, dass das Feld zumindest schonmal sichtbar sein sollte. Stattdessen wird dieser Code mir im Backend über dem Contao Header angezeigt

    Code:
    use Contao\CoreBundle\DataContainer\PaletteManipulator; $GLOBALS['TL_DCA']['tl_news']['fields']['location'] = [ 'label' => ['Location', 'Location of the news entry, if applicable.'], 'inputType' => 'text', 'eval' => ['tl_class' => 'w50', 'maxlength' => 255], 'sql' => ['type' => 'string', 'length' => 255, 'default' => ''], ]; PaletteManipulator::create() ->addField('location', 'title_legend', PaletteManipulator::POSITION_APPEND) ->applyToPalette('default', 'tl_news') ;

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.050
    Partner-ID
    10107

    Standard

    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Ich habe unter app/Resources/contao/dca eine Datei tl_news.php angelegt.
    Bist du noch unter Contao 4.4 unterwegs? Der Bugfix Support für Contao 4.4 endet mit Ende des Jahres, evt. solltest du aktualisieren .


    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Stattdessen wird dieser Code mir im Backend über dem Contao Header angezeigt

    Code:
    use Contao\CoreBundle\DataContainer\PaletteManipulator; $GLOBALS['TL_DCA']['tl_news']['fields']['location'] = [ 'label' => ['Location', 'Location of the news entry, if applicable.'], 'inputType' => 'text', 'eval' => ['tl_class' => 'w50', 'maxlength' => 255], 'sql' => ['type' => 'string', 'length' => 255, 'default' => ''], ]; PaletteManipulator::create() ->addField('location', 'title_legend', PaletteManipulator::POSITION_APPEND) ->applyToPalette('default', 'tl_news') ;
    Du hast "<?php" vergessen.

    - - - Aktualisiert - - -

    Zitat Zitat von Stefko Beitrag anzeigen
    Ahoi,
    vielleicht bringt Dich das HellWorldBundle-Tutorial etwas weiter.
    https://gist.github.com/joergmoldenhauer
    Ein Bundle würde ich für Applikationsanpassungen nicht machen, das ist ja unnötig kompliziert.

  6. #6
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Bist du noch unter Contao 4.4 unterwegs? Der Bugfix Support für Contao 4.4 endet mit Ende des Jahres, evt. solltest du aktualisieren .
    Nee, arbeite in einer Contao 4.10.2 Installation.


    Zitat Zitat von Spooky Beitrag anzeigen
    Du hast "<?php" vergessen.
    Uff... ????*??


    Zitat Zitat von Spooky Beitrag anzeigen
    Ein Bundle würde ich für Applikationsanpassungen nicht machen, das ist ja unnötig kompliziert.


    Ich bin jetzt auf jeden Fall ein bisschen weiter gekommen! Danke für eure Hilfe!

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.050
    Partner-ID
    10107

    Standard

    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Nee, arbeite in einer Contao 4.10.2 Installation.
    Ab Contao 4.9 ist der Richtige Ordner contao/, nicht app/Resources/contao/. app/Resources solltest du generell nicht mehr haben/benötigen.



    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Uff... ????*??
    Was willst du damit sagen?

  8. #8
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Ab Contao 4.9 ist der Richtige Ordner contao/, nicht app/Resources/contao/. app/Resources solltest du generell nicht mehr haben/benötigen.



    Was willst du damit sagen?


    Ah ok gut zu wissen.

    Oh, das war eigentlich ein Facepalm Emoji.



    Ich habe es jetzt geschafft das Feld "Locations" auszugeben. Also das aus dem Beispiel aus der Contao Dokumentation. Und ich habe mir einmal das hier angeschaut und habe es geschafft das Testelement mit "Hello World" auszugeben.

    Ich möchte jetzt im nächsten Schritt dieses Testelement um Felder erweitern. Ich denke mal mit ein bisschen Recherche, werde ich hier etwas finden, womit ich weiterkomme. Falls ihr aber irgendwelche Artikel/Tutorials habt, die genau das beschreiben, bin ich dafür natürlich sehr dankbar.

  9. #9

  10. #10
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von Niels H Beitrag anzeigen
    Ich kann das markocupic/contao-bundle-creator-bundle sehr empfehlen!
    Ich habe den Bundle Creator direkt mal installiert und ich glaube das ist genau das was ich brauche! Habe ein erstes Bundle über die Eingabemaske erstellt. Erstmal ein Inhaltselement. Standardmäßig wird dann ein normales Text-Element erstellt. Jetzt möchte ich einfach ein neues Feld hinzufügen, undzwar eine Verlinkung. Am liebsten mit dem Globus-Icon (oder was auch immer das ist), sodass man eine interne Seite auswählen kann.

    Soweit ich es verstehe, müsste ich das ja über den DCA machen. Ich verstehe aber nicht ganz wie, da ich die Syntax/den Aufbau nicht verstehe. Das sind ja nicht die tatsächlichen Felder, sondern die Gruppierungen der Felder.

    Wie kann ich ein Feld für einen Hyperlink hinzufügen?

    tl_content.php
    Code:
    $GLOBALS['TL_DCA']['tl_content']['palettes']['ensemble_element'] = '
        {type_legend},type,headline;
        {text_legend},text;
        {template_legend:hide},customTpl;
        {protected_legend:hide},protected;
        {expert_legend:hide},guests,cssID;
        {invisible_legend:hide},invisible,start,stop';

  11. #11
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Du musst erst ein Feld hinzufügen ($GLOBALS['TL_DCA']['tl_content']['fields']), das Du dann der Palette ($GLOBALS['TL_DCA']['tl_content']['palettes']) hinzufügst. Schau Dir als Referenz die Doku und Contaos Originaldefinition (siehe z.B. hier https://github.com/contao/contao/blo...tl_content.php) an. Bei tl_content musst Du zudem berücksichtigen, welches Inhaltselement (und damit welche Subpalette = im Verlinkten Bsp. Zeilen 122 bis 147) Du anpassen willst.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  12. #12
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Du musst erst ein Feld hinzufügen ($GLOBALS['TL_DCA']['tl_content']['fields']), das Du dann der Palette ($GLOBALS['TL_DCA']['tl_content']['palettes']) hinzufügst. Schau Dir als Referenz die Doku und Contaos Originaldefinition (siehe z.B. hier https://github.com/contao/contao/blo...tl_content.php) an. Bei tl_content musst Du zudem berücksichtigen, welches Inhaltselement (und damit welche Subpalette = im Verlinkten Bsp. Zeilen 122 bis 147) Du anpassen willst.

    Erstmal danke für einen weiteren Fingerzeig in die richtige Richtung! Ich habe jetzt nochmal in die Doku geschaut und mir den Code auf GitHub angesehen. So wie ich es verstehe, müsste ich also sowas in die Richtung machen?

    Code:
    $GLOBALS['TL_DCA']['tl_content'] = [
        'fields' => [
            'pageLink' => [
                'label' => &$GLOBALS['TL_LANG']['tl_content']['Link zur Seite'],
                'exclude' => true,
                'inputType' => 'pageTree',
                'eval' => ['tl_class'=>'w50', 'maxlength'=>255],
                'sql' => "varchar(255) NOT NULL default ''",
            ]
        ],
        'palettes' => [
            'pageLink' => '{type_legend},type,headline;{link_legend},url,target,linkTitle,embed,titleText,rel;{imglink_legend:hide},useImage;{template_legend:hide},customTpl;{protected_legend:hide},protected;{expert_legend:hide},guests,cssID;{invisible_legend:hide},invisible,start,stop',
        ],
    ];


    Zitat Zitat von fiedsch Beitrag anzeigen
    Bei tl_content musst Du zudem berücksichtigen, welches Inhaltselement (und damit welche Subpalette = im Verlinkten Bsp. Zeilen 122 bis 147) Du anpassen willst.
    Was genau meinst du damit? Ich möchte ja ein Feld hinzufügen und alle anderen so lassen.

  13. #13
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Mit Deinem Code überschreibst Du die bestehenden Felder. Du willst aber an sie anhängen:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields'][] = ... 
    Selbiges gilt für $GLOBALS['TL_DCA']['tl_content']['palettes'].

    Das Thema Subpaletten betrifft die Frage, ob Du Dein neues Feld bei allen Inhaltselementen hinzufügen willst, oder nur bei einigen (Inhaltselementtypen). So, wie Du es angegeben hast, geht es um ein Inhaltselement vom type pageLink und dessen Palette, aber nicht Dein neues Feld pageLink in der Oder den Paletten bereits bestehender Inhaltselemente.
    Geändert von fiedsch (14.11.2020 um 15:55 Uhr)
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  14. #14
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    Mit Deinem Code überschreibst Du die bestehenden Felder. Du willst aber an sie anhängen:
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields'][] = ... 
    Selbiges gilt für $GLOBALS['TL_DCA']['tl_content']['palettes'].

    Das Thema Subpaletten betrifft die Frage, ob Du Dein neues Feld bei allen Inhaltselementen hinzufügen willst, oder nur bei einigen (Inhaltselementtypen). So, wie Du es angegeben hast, geht es um ein Inhaltselement vom type pageLink und dessen Palette, aber nicht Dein neues Feld pageLink in der Oder den Paletten bereits bestehender Inhaltselemente.


    So, ich habe nochmal in die Doku geschaut: Hier unter "Adding fields".

    Ich habe das Beispiel übernommen und angepasst. Die Erweiterung als .zip hochgeladen und den Cache geleert. Das Feld wird leider noch nicht ausgegeben. Ist der Code so korrekt?


    Code:
    //Feld pageLink hinzufügen
    $GLOBALS['TL_DCA']['tl_content']['fields']['pageLink'] = [
        'label' => &$GLOBALS['TL_LANG']['tl_content']['Link zur Seite'],
        'exclude' => true,
        'inputType' => 'pageTree',
        'eval' => ['tl_class'=>'w50', 'maxlength'=>255],
        'sql' => "varchar(255) NOT NULL default ''",
    ];
    
    //Feld pageLink an Palette anhängen
    $GLOBALS['TL_DCA']['tl_content']['palettes']['default'] .= ';{custom_legend},pageLink';

  15. #15
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields']['pageLink'] = [ ... 
    ist etwas anderes als Dein in #12 angegebenes

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content'] = [
        
    'fields' => [ ... 
    (das ist aber PHP und nicht Contao ;-)

    Wenn Du eine Änderung am DCA machst:

    1. Symfony Cache löschen
    2. Installtool aufrufen. Wird die neue Spalte als neu anzulegen angezeigt? =>anlegen lassen
    3. Änderung an der Palette: wird die Spalte im Backend angezeigt?


    Was hast Du davon gemacht?
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  16. #16
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Zitat Zitat von fiedsch Beitrag anzeigen
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content']['fields']['pageLink'] = [ ... 
    ist etwas anderes als Dein in #12 angegebenes

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_content'] = [
        
    'fields' => [ ... 
    (das ist aber PHP und nicht Contao ;-)

    Wenn Du eine Änderung am DCA machst:

    1. Symfony Cache löschen
    2. Installtool aufrufen. Wird die neue Spalte als neu anzulegen angezeigt? =>anlegen lassen
    3. Änderung an der Palette: wird die Spalte im Backend angezeigt?


    Was hast Du davon gemacht?

    Habe deine Antwort in #13 so verstanden, dass ich mit dem Code #12 die Felder überschreibe und ich sie über
    Code:
    $GLOBALS['TL_DCA']['tl_content']['fields'][] = ...
    anhänge. Der Code in #14 ist aus der Contao Doku übernommen und angepasst. Bin hochgradig verwirrt gerade

    1. Symfony Cache habe ich gelöscht.
    2. Nach dem erfolgreichen Hochladen der Erweiterung über den Contao Manager, habe ich auf "Datenbank aktualisieren" geklickt. Dann wurde mir angezeigt, dass das Feld pageLink mit dem angeben SQL zur Datenbank hinzugefügt wird.
    3. Das Inhaltselement selber ist sichtbar, und hat die Standard-Felder eines Text-Elements, aber mein pageLink wird nicht ausgegeben.

  17. #17
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Zitat Zitat von Dennis Fink Beitrag anzeigen
    Habe deine Antwort in #13 so verstanden, dass ich mit dem Code #12 die Felder überschreibe [...]
    Genau so war es gemeint. Wenn Du es aber falsch gemacht hättest, würden Dir die anderen Felder im Installtool als „zu löschen“ angezeigt werden. Da das aber wohl nicht so war, ist alles OK.

    Du hast Deine Ergänzungen nur an die default Palette angehängt. Du musst das (glaube ich) an alle Paletten anhängen, die Du um Dein neues Feld erweitern willst. (Wenn default bei jeder anderen Palette automatisch immer dabei wäre, müsste ja nicht jedes Mal {type_legend},type, wiederholt werden).

    PS: Du musst nicht jedes Mal ein Fullquote machen, der Text steht ja sowieso einen Post darüber.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  18. #18
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Ok, heißt statt:

    Code:
    $GLOBALS['TL_DCA']['tl_content']['palettes']['default'] .= '...'
    so:

    Code:
    $GLOBALS['TL_DCA']['tl_content']['palettes']['ensemble_element']  .= '...'
    ?


    Wenn ich so kleine Änderungen mache, kann ich den neuen Code auch eigentlich einfach per FTP hochladen und die vorhandene Datei überschreiben und dann einfach den Cache leeren? Oder muss ich jedes Mal das komplette Paket entfernen und neu hinzufügen?

  19. #19
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Mit 'ensemble_element' sind wir jetzt auch bei einem neuen Inhaltselement. Bisher bin ich von einem neuen Feld ausgegangen. Das Feld wir Dir dann „natürlich“ nur in Inhaltselementen vom entsprechenden Typ ('ensemble_element') angezeigt.

    Bzgl. neu hochladen: ich würde lokal entwickeln und erst halbwegs fertige Stände hochladen. das ist aus meiner Sicht ein wesentlich schnelleres und flüssigeres Arbeiten.
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  20. #20
    Contao-Nutzer
    Registriert seit
    08.08.2018.
    Beiträge
    89

    Standard

    Ja, dazu hab ich in #10 was geschrieben. Habe über den Bundle Creator ein neues Inhaltselement erstellt. Und standardmäßig ist das so aufgebaut wie das normale Text-Element. Und für dieses neue Element wollte ich ein neues Feld hinzufügen.

    Lokal entwickeln ist noch eine weitere Baustelle. Seit Contao 4 hatte ich Probleme lokale Installationen aufzusetzen. Auf meinem MacBook habe ich es dann irgendwann ans laufen bekommen. Bin aber vor kurzem auf Windows 10 umgestiegen, und hier scheiterte es irgendwann bei der Installation daran, dass die PHP Binary nicht gefunden wurde oder so. Aber das ist ein Thema für sich. Hatte überlegt mal zu schauen, ob das mit Docker vielleicht einfacher ist, aber das ist dann noch ein zusätzliches Fass


    Aber zurück zur Frage: Grundsätzlicht geht das mit dem hochladen, du würdest es aber nicht empfehlen, richtig?

  21. #21
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.939

    Standard

    Grundsätzlicht geht das mit dem hochladen, du würdest es aber nicht empfehlen, richtig?
    Ja, grundsätzlich sollte das gehen (mir persönlich wäre es aber zu umständlich).
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •