Ergebnis 1 bis 20 von 20

Thema: DCA - Palette Manipulator & custom Select

  1. #1
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard DCA - Palette Manipulator & custom Select

    Hallo,

    ich versuche gerade die Events umzuschreiben wenn eine bestimmte Kalenderart gewählt wurde. Das klappt auch allerdings fügt es das Feld "fs_location" mir nicht ein.

    1.
    PHP-Code:
    class FsCalendarEventsListener
    {
        public function 
    onLoadCallback(DataContainer $dc): void
        
    {
            
            
    $pidObj CalendarEventsModel::findOneBy("id"Input::get('id'), array());
            
    $parentConfig CalendarModel::findOneBy("id"$pidObj->pid, array());

            if(
    $parentConfig->fs_calendar_art == 'concert') {
                
    $GLOBALS['TL_DCA'][$dc->table]['fields']['title']['eval']['mandatory'] = false;

                
                
    $palette '{date_legend},startDate,endDate;{details_legend];{publish_legend},published';
                
                
    PaletteManipulator::create()
                    ->
    addField('fs_location''details_legend'PaletteManipulator::POSITION_APPEND)
                    ->
    applyToPalette('default'$dc->table);


            } else {
                
    $palette $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'];
            }

            
    $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'] = $palette;
        }


    2.

    kann man die Funktion "create_location_options" auch mit in den FsCalendarEventsListener packen? Oder wo kommt sowas jetzt hin?

    PHP-Code:
    $GLOBALS['TL_DCA']['tl_calendar_events']['fields']['fs_location'] = array(
        
    'label'                => &$GLOBALS['TL_LANG']['tl_calendar_events']['fs_location'],
        
    'exclude'            => true,
        
    'inputType'            => 'select',
        
    'options_callback'    => array('tl_calendar_events_fs_bundle','create_location_options'),
        
    'eval'                => array('mandatory'=>true,'style' => 'width:250px','includeBlankOption'=>false,'chosen'=>true,'tl_class'=>'w50'),
        
    'sql'                  => "int(4) unsigned NOT NULL default '0'",
        
    'foreignKey'        => 'tl_fs_locations.title',
        
    'relation'            => array('type'=>'hasOne''load'=>'eager')
    ); 
    Liebe Grüße
    WebRoxx


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

    Standard

    Hier ist beschrieben, wie du DCA Callbacks registrierst: https://docs.contao.org/dev/framewor...ring-callbacks

    Die Callbacks, die du verwenden möchtest sind:


  3. #3
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Hier ist beschrieben, wie du DCA Callbacks registrierst: https://docs.contao.org/dev/framewor...ring-callbacks

    Die Callbacks, die du verwenden möchtest sind:

    Der Callback funktioniert ja...

    Es geht da mehr um den Teil:

    PHP-Code:
                
                $palette 
    '{date_legend},startDate,endDate;{details_legend];{publish_legend},published';
                
                
    PaletteManipulator::create()
                    ->
    addField('fs_location''details_legend'PaletteManipulator::POSITION_APPEND)
                    ->
    applyToPalette('default'$dc->table); 
    Liebe Grüße
    WebRoxx


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

    Standard

    Das war mehr für deine zweite Frage.

    Zu deiner ersten Frage: ich verstehe deinen Code leider nicht. Benutze doch einfach nur den PaletteManipulator? Warum überschreibst du Paletten? Außerdem: wenn du Eventtypen verwendest, könntest du das dann ja generell nur über Paletten lösen, ohne Callback.

  5. #5
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Das war mehr für deine zweite Frage.

    Zu deiner ersten Frage: ich verstehe deinen Code leider nicht. Benutze doch einfach nur den PaletteManipulator? Warum überschreibst du Paletten? Außerdem: wenn du Eventtypen verwendest, könntest du das dann ja generell nur über Paletten lösen, ohne Callback.
    Naja ich will die Palette ja nur überschreiben wenn eine bestimmte Config im calendar getroffen ist... dazu muss ich mir die ja erst auslesen im event selbst

    Sehe auch grad dadurch das es only 4.9+ werden soll müsste ich es doch so machen


    PHP-Code:
    namespace WEBROXX\FansiteCore\DataContainer;

    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Contao\DataContainer;
    use 
    Terminal42\ServiceAnnotationBundle\ServiceAnnotationInterface;

    use 
    Contao\FilesModel;
    use 
    Contao\StringUtil;
    use 
    Contao\Input;
    use 
    Contao\Database;
    use 
    Symfony\Component\Finder\Finder;

    use 
    Contao\CalendarModel;
    use 
    Contao\CalendarEventsModel;

    use 
    Contao\CoreBundle\DataContainer\PaletteManipulator;

    /**
     * @Callback(table="tl_calendar_events", target="config.onload")
     */
    class FsCalendarEventsOnLoadCallbackListener implements ServiceAnnotationInterface
    {
        public function 
    __invoke(DataContainer $dc): void
        
    {
            
    $pidObj CalendarEventsModel::findOneBy("id"Input::get('id'), array());
            
    $parentConfig CalendarModel::findOneBy("id"$pidObj->pid, array());

            if(
    $parentConfig->fs_calendar_art == 'concert') {
                
    $GLOBALS['TL_DCA'][$dc->table]['fields']['title']['eval']['mandatory'] = false;

                
                
    $palette '{date_legend},startDate,endDate;{details_legend];{publish_legend},published';

                
                
    PaletteManipulator::create()
                    ->
    addField('fs_location''details_legend'PaletteManipulator::POSITION_APPEND)
                    ->
    applyToPalette('default'$dc->table);


            } else {
                
    $palette $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'];
            }

            
    $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'] = $palette;
        }

    Sehe ich das richtig das für jeden Callback eine Datei benötigt wird und diesen nicht mehr im DCA einbinden muss ?
    Liebe Grüße
    WebRoxx


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

    Standard

    Zitat Zitat von WebRoxx Beitrag anzeigen
    Sehe ich das richtig das für jeden Callback eine Datei benötigt wird und diesen nicht mehr im DCA einbinden muss ?
    Nein, wie du deine Callbacks organisierst ist dir überlassen.

  7. #7
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Okay,

    habs jetzt wohl gelöst:

    PHP-Code:


    class FsCalendarEventsListener implements ServiceAnnotationInterface
    {
        
        
    /**
         * @Callback(table="tl_calendar_events", target="config.onload")
         */
        
    public function onLoadCallback(DataContainer $dc): void
        
    {
    .....


     
    $palette '{date_legend},startDate,endDate;{details_legend};{publish_legend},published';
                
         
    $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'] = $palette;
                
                
    PaletteManipulator::create()
                    ->
    addField('fs_location''details_legend'PaletteManipulator::POSITION_APPEND)
                    ->
    applyToPalette('default'$dc->table);
    .... 

    $palette muss natürlich davor gesetzt werden.


    tl_calendar_events.php
    PHP-Code:
    use WEBROXX\FansiteCore\DataContainer\FsCalendarEventsListener;

    $GLOBALS['TL_DCA']['tl_calendar_events']['config']['onload_callback'][] = [FsCalendarEventsListener::class, 'onLoadCallback']; 


    Code:
    services:
        _defaults:
            autoconfigure: true
        WEBROXX\FansiteCore\DataContainer\FsCalendarEventsListener: ~
    Liebe Grüße
    WebRoxx


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

    Standard

    Zitat Zitat von WebRoxx Beitrag anzeigen
    tl_calendar_events.php
    PHP-Code:
    use WEBROXX\FansiteCore\DataContainer\FsCalendarEventsListener;

    $GLOBALS['TL_DCA']['tl_calendar_events']['config']['onload_callback'][] = [FsCalendarEventsListener::class, 'onLoadCallback']; 
    Mach's doch über Service Tagging (services.yml oder Annotation), du bist ja in 4.9 .

  9. #9
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Mach's doch über Service Tagging (services.yml oder Annotation), du bist ja in 4.9 .
    PHP-Code:
    use WEBROXX\FansiteCore\DataContainer\FsCalendarEventsListener;

    $GLOBALS['TL_DCA']['tl_calendar_events']['config']['onload_callback'][] = [FsCalendarEventsListener::class, 'onLoadCallback']; 
    ohne den läuft es wieder ne :/
    Liebe Grüße
    WebRoxx


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

    Standard

    Poste den Code (inkl. wie du den Service registrierst und taggst).

  11. #11
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    service.xml

    Code:
    services:
        _defaults:
            autoconfigure: true
        WEBROXX\FansiteCore\DataContainer\FsCalendarEventsListener: ~
    PHP-Code:
    <?php

    namespace WEBROXX\FansiteCore\DataContainer;

    use 
    Contao\CoreBundle\DataContainer\PaletteManipulator;
    use 
    Contao\CoreBundle\ServiceAnnotation\Callback;
    use 
    Terminal42\ServiceAnnotationBundle\ServiceAnnotationInterface;

    use 
    Contao\DataContainer;
    use 
    Contao\Input;
    use 
    Contao\Database;
    use 
    Contao\CalendarModel;
    use 
    Contao\CalendarEventsModel;

    class 
    FsCalendarEventsListener implements ServiceAnnotationInterface
    {
        
        
    /**
         * @Callback(table="tl_calendar_events", target="config.onload")
         */
        
    public function onLoadCallback(DataContainer $dc): void
        
    {
            
            
    $pidObj CalendarEventsModel::findOneBy("id"Input::get('id'), array());
            
    $parentConfig CalendarModel::findOneBy("id"$pidObj->pid, array());

            if(
    $parentConfig->fs_calendar_art == 'concert') {
                
    $GLOBALS['TL_DCA'][$dc->table]['fields']['title']['eval']['mandatory'] = false;


                
                
    $palette '{date_legend},startDate,endDate;{details_legend};{publish_legend},published';

                
                
    $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'] = $palette;
                
                
    PaletteManipulator::create()
                    ->
    addField('fs_location''details_legend'PaletteManipulator::POSITION_APPEND)
                    ->
    applyToPalette('default'$dc->table);

                    
            } else {
                
    $palette $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'];
                
    $GLOBALS['TL_DCA'][$dc->table]['palettes']['default'] = $palette;
            }
        }
    }
    Liebe Grüße
    WebRoxx


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

    Standard

    Sollte passen. Führe mal folgendes aus:
    Code:
    rm -r var/cache && vendor/bin/contao-console debug:container FsCalendarEventsListener
    und poste die Ausgabe.

  13. #13
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Sollte passen. Führe mal folgendes aus:
    Code:
    rm -r var/cache && vendor/bin/contao-console debug:container FsCalendarEventsListener
    und poste die Ausgabe.
    Da kommt

    Code:
    Parse error: syntax error, unexpected '?' in /www/htdocs/domain/vendor/contao/manager-bundle/src/HttpKernel/ContaoKernel.php on line 150
    Liebe Grüße
    WebRoxx


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

    Standard

    Du musst für vendor/bin/contao-console das richtige PHP CLI verwenden.

  15. #15
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Du musst für vendor/bin/contao-console das richtige PHP CLI verwenden.
    Ohja stimmt

    Code:
    12:08:30 ERROR     [console] Error thrown while running command "debug:container FsCalendarEventsListener". Message: "You have requested a non-existent service "security.context_listener.1"." ["exception" => Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException^ { …},"command" => "debug:container FsCalendarEventsListener","message" => "You have requested a non-existent service "security.context_listener.1"."]
    
    In ContainerBuilder.php line 1032:
    
      You have requested a non-existent service "security.context_listener.1".
    Liebe Grüße
    WebRoxx


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

    Standard

    Die Fehlermeldung ist unrelated. Mit -vvv siehst du einen Stack Trace der Fehlermeldung.

  17. #17
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Code:
    12:31:50 ERROR     [console] Error thrown while running command "debug:container FsCalendarEventsListener -vvv". Message: "No services found that match "FsCalendarEventsListener"."
    [
      "exception" => Symfony\Component\Console\Exception\InvalidArgumentException^ {
        #message: "No services found that match "FsCalendarEventsListener"."
        #code: 0
        #file: "./vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php"
        #line: 258
        trace: {
          ./vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php:258 { …}
          ./vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php:155 { …}
          ./vendor/symfony/console/Command/Command.php:255 { …}
          ./vendor/symfony/console/Application.php:1019 { …}
          ./vendor/symfony/framework-bundle/Console/Application.php:97 { …}
          ./vendor/symfony/console/Application.php:271 { …}
          ./vendor/symfony/framework-bundle/Console/Application.php:83 { …}
          ./vendor/symfony/console/Application.php:147 { …}
          ./vendor/contao/manager-bundle/bin/contao-console:38 { …}
        }
      },
      "command" => "debug:container FsCalendarEventsListener -vvv",
      "message" => "No services found that match "FsCalendarEventsListener"."
    ]
    12:31:50 DEBUG     [console] Command "debug:container FsCalendarEventsListener -vvv" exited with code "1"
    [
      "command" => "debug:container FsCalendarEventsListener -vvv",
      "code" => 1
    ]
    
    In ContainerDebugCommand.php line 258:
    
      [Symfony\Component\Console\Exception\InvalidArgumentException]
      No services found that match "FsCalendarEventsListener".
    
    
    Exception trace:
      at /www/htdocs/domain/vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php:258
     Symfony\Bundle\FrameworkBundle\Command\ContainerDebugCommand->findProperServiceName() at /www/htdocs/domain/vendor/symfony/framework-bundle/Command/ContainerDebugCommand.php:155
     Symfony\Bundle\FrameworkBundle\Command\ContainerDebugCommand->execute() at /www/htdocs/domain/vendor/symfony/console/Command/Command.php:255
     Symfony\Component\Console\Command\Command->run() at /www/htdocs/domain/vendor/symfony/console/Application.php:1019
     Symfony\Component\Console\Application->doRunCommand() at /www/htdocs/domain/vendor/symfony/framework-bundle/Console/Application.php:97
     Symfony\Bundle\FrameworkBundle\Console\Application->doRunCommand() at /www/htdocs/domain/vendor/symfony/console/Application.php:271
     Symfony\Component\Console\Application->doRun() at /www/htdocs/domain/vendor/symfony/framework-bundle/Console/Application.php:83
     Symfony\Bundle\FrameworkBundle\Console\Application->doRun() at /www/htdocs/domain/vendor/symfony/console/Application.php:147
     Symfony\Component\Console\Application->run() at /www/htdocs/domain/vendor/contao/manager-bundle/bin/contao-console:38
    Liebe Grüße
    WebRoxx


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

    Standard

    Dein Service ist also erst gar nicht registriert. Du hast vorhin services.xml statt .yml geschrieben, war das ein Typo? Bist du dir sicher, dass deine services.yml geladen wird?

  19. #19
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Dein Service ist also erst gar nicht registriert. Du hast vorhin services.xml statt .yml geschrieben, war das ein Typo? Bist du dir sicher, dass deine services.yml geladen wird?
    xml war ein Tippfehler hier im Forum.

    Ja stimmt hatte das FansiteCoreExtension ganz vergessen

    Jetzt geht es
    Liebe Grüße
    WebRoxx


  20. #20
    Alter Contao-Hase
    Registriert seit
    18.07.2012.
    Ort
    Löbau
    Beiträge
    1.140

    Standard

    Okay, bis jetzt habe ich alles zum laufen bekommen

    Der Button Callback will leider nur noch nicht klappen


    dca
    PHP-Code:
    $GLOBALS['TL_DCA']['tl_calendar_events']['list']['operations']['setlist'] = array(
        
    'label'                  => &$GLOBALS['TL_LANG']['tl_calendar_events']['setlist'],
        
    'href'                  => 'table=tl_fs_concert_setlist',

    ); 

    das "TEST" wird mir allerdings ausgegeben...

    PHP-Code:
        /**
         * @Callback(table="tl_calendar_events", target="list.operations.setlist.button")
         */
        
    public function SetlistButtonCallback($arrRow$href$label$title$icon$attributes$strTable$arrRootIds$arrChildRecordIds$blnCircularReference$strPrevious$strNextDataContainer $dc): string
        
    {    
        
            
    $parentConfig CalendarModel::findOneBy("id"Input::get('id'), array());

            if(
    $parentConfig->fs_calendar_art == 'concert') {
                        
                
    $cnt Database::getInstance()->prepare(
                    
    "SELECT COUNT(id) as cnt FROM tl_fs_event_setlist WHERE pid=?"
                
    )->execute($arrRow['id']);
                
                if(
    $cnt->cnt == 0) {
                    
    $icon 'fansitecore/backend/icons/list_no.png';    
                } else {
                    
    $icon 'fansitecore/backend/icons/list.png';    
                }
                
                return 
    '<a href="'.Controller::addToUrl($href.'&amp;id='.$arrRow['id']).'" title="'.StringUtil::specialchars($title).'"'.$attributes.'>TEST'.Image::getHtml($icon$label).'</a>';    
            }    
        } 
    EDIT: muss natürlich so lauten

    PHP-Code:
    $icon 'bundles/fansitecore/backend/icons/list_no.png'
    Geändert von WebRoxx (01.05.2020 um 14:00 Uhr)
    Liebe Grüße
    WebRoxx


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
  •