Contao-Camp 2024
Ergebnis 1 bis 14 von 14

Thema: tl_calendar_events um Checkboxen / Mehrfachauswahl erweitern

  1. #1
    Contao-Nutzer
    Registriert seit
    12.11.2012.
    Beiträge
    41

    Standard tl_calendar_events um Checkboxen / Mehrfachauswahl erweitern

    Ich möchte gern die tl_calendar_events um eine Mehrfachauswahl erweitern und bin wie folgt vorgegangen:

    Dateien angelegt:
    /contao/dca/tl_calendar_events.php
    /contao/languages/de/tl_calendar_events.xlf

    tl_calendar_events.php
    PHP-Code:
    <?php 
     
    $GLOBALS
    ['TL_DCA']['tl_calendar_events']['palettes']['default'] = str_replace('title,','title,eventTypes,'$GLOBALS['TL_DCA']['tl_calendar_events']['palettes']['default']);
     
    $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['eventTypes'] = array
    (
        
    'label'                 => &$GLOBALS['TL_LANG']['tl_calendar_events']['eventTypes'],
        
    'exclude'               => true,
        
    'inputType'             => 'radio',
        
    'options'               => &$GLOBALS['TL_LANG']['tl_calendar_events']['eventTypes']['options'],
        
    'eval'                  => ['cols'=>4'tl_class'=>'w50'],
        
    'sql'                   => "varchar(32) NOT NULL default ''" 
    );
    tl_calendar_events.xlf
    Code:
    <?xml version="1.0" ?><xliff version="1.1">
      <file datatype="php" original="src/Resources/contao/languages/en/tl_calendar_events.php" source-language="en" target-language="de">
        <body>
          <trans-unit id="tl_calendar_events.eventTypes.0">
            <source>Veranstaltungstyp</source>
            <target>Veranstaltungstyp</target>
          </trans-unit>
          <trans-unit id="tl_calendar_events.eventTypes.1">
            <source>Wählen Sie die Felder aus, die im Frontend angezeigt werden sollen</source>
            <target>Wählen Sie die Felder aus, die im Frontend angezeigt werden sollen</target>
          </trans-unit>
        </body>
      </file>
    </xliff>
    Cache gelöscht, Installtool aufgerufen, klappt soweit, das Feld wird im Backend im Event angezeigt. Jetzt fehlen noch die Checkboxen und jetzt bin ich mit meinen bescheidenen Programmierkentnissen am Ende. Wie muss die tl_calendar_events.xlf ergänzt werden?

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

    Standard

    Du hast keine options angegeben. Du hast zwar für options eine Referenz auf TL_LANG gemacht, dort befindet sich aber nichts (zumindest laut dem Code, den du gepostet hast). Außerdem legt man die options normalerweise entweder direkt im DCA fest und gibt dann eine reference für die Labels an, oder man implementiert einen options_callback.

    Außerdem solltest du den PaletteManipulator verwenden, statt str_replace.

  3. #3
    Contao-Nutzer
    Registriert seit
    12.11.2012.
    Beiträge
    41

    Standard

    etwa so?

    PHP-Code:
    <?php 
     
    $GLOBALS
    ['TL_DCA']['tl_calendar_events']['palettes']['default'] = str_replace('title,','title,eventTypes,'$GLOBALS['TL_DCA']['tl_calendar_events']['palettes']['default']);

    $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['eventTypes'] = array
    (
        
    'label'        => &$GLOBALS['TL_LANG']['tl_calendar_events']['eventTypes'],
        
    'exclude'    => true,
        
    'inputType'    => 'checkboxWizard',
        
    'options'    => array(
            
    '1' => 'foo1',
            
    '2' => 'bar2',
            
    '3' => 'foobar3',
        ),
        
    'eval'        => ['cols'=>3'tl_class'=>'w50'],
        
    'sql'        => "varchar(32) NOT NULL default ''" 
    );
    Für die Mehrfachauswahl muss es natürlich checkboxWizard sein. Jetzt werden die Optionen im Event im Backend angezeigt. Jedoch kann ich auswählen was ich will, nach dem Speichern ist immer nur Option 1 ausgewählt. Wo liegt mein Denkfehler?

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

    Standard

    • Du hast vergessen 'multiple' => true zu verwenden.
    • Du verwendest checkboxWizard statt checkbox: warum? Muss die Reihenfolge vom Benutzer eingestellt werden können?
    • Du hast 'cols' => 3 verwendet, diese Option hat aber keine Auswirkung bei einem Checkbox Widget.
    • Du hast 'tl_class' => 'w50' verwendet: das könnte im Layout zu Problemen führen.
    • Du hast einen SQL Datentyp verwendet, der potentiell zu kurz werden könnte. Üblicherweise wird in Contao für solche Mehrfachauswahlmöglichkeiten der Datentyp 'blob' verwendet. Grundsätzlich kannst du auch etwas anderes nehmen (auch varchar) - wichtig ist nur, dass das Datenbankfeld groß genug ist. Zugegebenermaßen führt aber 'sql' => ['type' => 'blob', 'notnull' => false] dazu, dass Doctrine einen MEDIUMBLOB verwendet, was wiederum eigentlich zu viel Platz ist . Sollte aber keine große Rolle spielen.


    Ich würde es so machen:
    PHP-Code:
    // contao/dca/tl_calendar_events.php
    use Contao\CoreBundle\DataContainer\PaletteManipulator;

    $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['eventTypes'] = [
        
    'inputType' => 'checkbox',
        
    'options' => [
            
    'option1',
            
    'option2',
            
    'option3',
        ],
        
    'reference' => &$GLOBALS['TL_LANG']['tl_calendar_events']['eventTypeOptions'],
        
    'eval' => ['tl_class' => 'clr''multiple' => true],
        
    'sql' => ['type' => 'blob''notnull' => false],
    ];

    PaletteManipulator::create()
        ->
    addField('eventTypes''title')
        ->
    applyToPalette('default''tl_calendar_events')

    PHP-Code:
    // contao/languages/en/tl_calendar_events.php
    $GLOBALS['TL_LANG']['tl_calendar_events']['eventTypes'] = ['Event type''Choose the event type.'];
    $GLOBALS['TL_LANG']['tl_calendar_events']['eventTypeOptions'] = [
        
    'option1' => 'Option 1 label',
        
    'option2' => 'Option 2 label',
        
    'option3' => 'Option 3 label',
    ]; 

  5. #5
    Contao-Nutzer
    Registriert seit
    12.11.2012.
    Beiträge
    41

    Standard

    Vielen Dank Spooky für die schnelle Hilfe und deine Hinweise! Damit klappt es super. CheckboxWizard ist nichtg notwendig, da hast du recht. Ich habe jetzt auch die /contao/languages/de/tl_calendar_events.php benutzt. Irgendwo hatte ich gelesen, das man in Zukunft stattdessen XLF Dateien verwenden soll. Ist dem so? Wie müssten dann dort die Optionen eingetragen werden. Ich habe nirgendwo eine entsprechende Dokumentation gefunden.

    Die Werte der Optionen schreibe ich übrigens wie folgt in die Klasse im Template:
    PHP-Code:
    $arrayDaten deserialize($this->eventTypes);  
       foreach (
    $arrayDaten as $record) {
         
    printf("typ%s ",  $record); 
        }; 

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

    Standard

    Zitat Zitat von edge Beitrag anzeigen
    Vielen Dank Spooky für die schnelle Hilfe und deine Hinweise! Damit klappt es super. CheckboxWizard ist nichtg notwendig, da hast du recht. Ich habe jetzt auch die /contao/languages/de/tl_calendar_events.php benutzt. Irgendwo hatte ich gelesen, das man in Zukunft stattdessen XLF Dateien verwenden soll. Ist dem so?
    Ich persönlich nutze immer PHP Dateien, da die einfacher zu Handhaben sind. XLF Dateien machen meiner Meinung nach nur in großen Projekten Sinn, die in mehrere Sprachen übersetzt werden müssen und daher bspw. über externe Übersetzungstools wie Transifex gemanaged werden.


    Zitat Zitat von edge Beitrag anzeigen
    Wie müssten dann dort die Optionen eingetragen werden.
    Ist doch in meinem Beispiel drin . Mit 'reference'.

  7. #7
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard tl_news - eigene Felder verschwinden mit Weiterleitungsziel

    Hallo,

    ich habe seit Contao 4.10 ein komisches Verhalten bei News, wo ich eigene Felder habe. Wenn ich unter Weiterleitungsziel von Standard auf etwas anderes umstelle und Contao die Seite neu lädt, werden meine Felder nicht mehr gezeigt.

    Hier ist mein Code in contao/dca/tl_news.php

    Weiß jemand, woran das liegen kann? Oder ist es ein Fehler von Contao?

    PHP-Code:
    <?php 
    //Anzeige im Backend
    $GLOBALS['TL_DCA']['tl_news']['palettes']['default'] = str_replace("author""author,newsSecondAuthor;"$GLOBALS['TL_DCA']['tl_news']['palettes']['default']);
    $GLOBALS['TL_DCA']['tl_news']['palettes']['default'] = str_replace("time""newsSecondAuthor;{newsMedium_legend},newsMedium,newsLanguageDE,newsLanguageEN;"$GLOBALS['TL_DCA']['tl_news']['palettes']['default']);

    // 2. Autor
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsSecondAuthor'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsSecondAuthor'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newsmedium
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsMedium'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsMedium'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr long'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache DE
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageDE'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageDE'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache EN
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageEN'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageEN'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];

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

    Standard

    Es gibt in Contao 4.10 nun mehr als nur die default Palette. Du musst deine Änderungen also bei beiden Paletten hinzufügen. Am besten mit dem PaletteManipulator, nicht mit str_replace.

  9. #9
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    danke

    Hier ist mein aktualisierter Code. Allerdings verschwinden die Felder immer noch, wenn ich ein anderes Weiterleitungsziel als Standard auswähle.


    PHP-Code:
    <?php 
    use Contao\CoreBundle\DataContainer\PaletteManipulator;
    // 2. Autor
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsSecondAuthor'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsSecondAuthor'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newsmedium
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsMedium'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsMedium'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr long'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache DE
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageDE'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageDE'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache EN
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageEN'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageEN'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];

    PaletteManipulator::create()
        ->
    addLegend('newsMedium_legend''date_legend'PaletteManipulator::POSITION_BEFORE)
        ->
    addField('newsMedium''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsLanguageDE''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsLanguageEN''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsSecondAuthor''title_legend'PaletteManipulator::POSITION_APPEND)
        ->
    applyToPalette('default''tl_news')
    ;
    Geändert von jenda (04.09.2020 um 17:42 Uhr)

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

    Standard

    Du änderst immer noch nur die default Palette. Es gibt wie gesagt mittlerweile mehr als nur die default Palette (ich weiß nicht auswendig wie die heißen).

  11. #11
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Jetzt. :-) Hier der richtige Code

    Ein Tipp - schaut euch die Contao-Dateien an. Da findet man die unterschiedlichen Palettentypen. In meinem Fall war es tl_news.php

    PHP-Code:
    <?php 
    use Contao\CoreBundle\DataContainer\PaletteManipulator;

    // 2. Autor
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsSecondAuthor'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsSecondAuthor'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newsmedium
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsMedium'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsMedium'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'clr long'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache DE
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageDE'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageDE'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    // Newssprache EN
    $GLOBALS['TL_DCA']['tl_news']['fields']['newsLanguageEN'] = [
        
    'label'                   => &$GLOBALS['TL_LANG']['tl_news']['newsLanguageEN'],
        
    'inputType'               => 'text',
        
    'eval'                    => array('maxlength'=>255'tl_class'=>'w50'),
        
    'sql'                     => "varchar(255) NOT NULL default ''",
    ];
    PaletteManipulator::create()
        ->
    addLegend('newsMedium_legend''date_legend'PaletteManipulator::POSITION_BEFORE)
        ->
    addField('newsMedium''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsLanguageDE''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsLanguageEN''newsMedium_legend'PaletteManipulator::POSITION_APPEND)
        ->
    addField('newsSecondAuthor''author'PaletteManipulator::POSITION_AFTER)
        ->
    applyToPalette('default''tl_news')
        ->
    applyToPalette('article''tl_news')
        ->
    applyToPalette('external''tl_news')
        ->
    applyToPalette('internal''tl_news')
    ;
    Geändert von jenda (04.09.2020 um 17:38 Uhr)

  12. #12
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard Felder in einem oder mehreren News- bzw. Eventarchiven ausschließen

    Ich habe noch eine Fragen zu der neuen Palettenlogik. Kann man mit ihr auch bestimmen, in welchem News- bzw. Eventsarchiv eigene Felder erscheinen können? Oder muss man noch die alte Logik verwenden, wie es in diesem Beitrag beschrieben ist?

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

    Standard

    Das machst du mit einem onload_callback, ja.

  14. #14
    Contao-Fan Avatar von jenda
    Registriert seit
    20.06.2009.
    Ort
    Berlin
    Beiträge
    490

    Standard

    Danke. Ich habe es dann auch genutzt.

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
  •