Contao-Camp 2024
Ergebnis 1 bis 24 von 24

Thema: Backend > Zugriff auf Session-Daten - ['CURRENT']['IDS']

  1. #1
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard Backend > Zugriff auf Session-Daten - ['CURRENT']['IDS']

    Hallo zusammen,

    im Rahmen eines Updates von einer 3.5 auf die 4.7 stehe ich vor dem Problem, dass ich an Daten nicht mehr dran komme. Kurz zur Erklärung:

    Unter 3.5. sah mein Aufruf so aus:

    PHP-Code:

            
    if ($this->Input->get('key') == 'export')
            {
                
    $session Session::getInstance()->getData();
                
    $arrCurrentIds $session['CURRENT']['IDS'];
                
                
    $arrSqlResult = array();
                foreach (
    $arrCurrentIds as $value)
                {
                    
    $tmpArr $this->getSqlFromCurrentId($value);
                    
    $arrSqlResult[] = $tmpArr[0];
                    
    // Mach Irgendwas....

                
    }
           } 
    Wenn ich Session::getInstance unetr 4.7 genau so aufrufe erhalte ich aber leider keinen Key mehr mir CURRENT. Hat mir jemand einen Tip, wie ich an die ID's herankomme? Das sind quasi die ID's der Einträge im Backend die z.B durch einen Filter oder eine Suche eingegrenzt dargestellt werden.

    1000 Dank schon mal für eure Hilfe
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  2. #2
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Was steht denn direkt in $_SESSION drin?

  3. #3
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Da stehen neben Symfony Dingen zwei Arrays einmal mit BE_DATA und einmal mit FE_DATA drin. Beim BE_DATA ist dann wiederum "_contao_be_attributes" als Array versorgt, dort werden z.B die gesetzten Suchfilter oder gewählten Sortierkriterien gesetzt.

    Aber eben alles ohne die quasi sich aus der Menge der angezeigten Datensätze ergebenden ID's
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  4. #4
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Wurden die Werte denn jemals im Filter ausgewählt? Die werden ja nur gesetzt, nachdem man im Mehrere Bearbeiten Modus war.

    An sich werden die IDS noch in der Session gespeichert.

    https://github.com/contao/contao/blo...Table.php#L151

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

    Standard

    Aus dem Core:
    PHP-Code:
    /** @var array $session */
    $session = \Contao\System::getContainer()->get('session')->all();
    var_dump($session['CURRENT']['IDS']); 

  6. #6
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von webstar Beitrag anzeigen
    Wurden die Werte denn jemals im Filter ausgewählt? Die werden ja nur gesetzt, nachdem man im Mehrere Bearbeiten Modus war.

    An sich werden die IDS noch in der Session gespeichert.

    https://github.com/contao/contao/blo...Table.php#L151
    Bist du sicher, dass das nur via "mehrere Bearbeiten" geht? Ich bin mir relativ sicher, dass die CurrentIDs doch auch gesetzt waren, nachdem ich eben ein bestimmtes Ergebnis via Suche oder Filter im Backend gesetzt habe. Und ja ich habe in diesem Fall z.B nach einen Namen gesucht, also habe den Filter bzw. eben die Ansicht eingeschränkt.
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  7. #7
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Aus dem Core:
    PHP-Code:
    /** @var array $session */
    $session = \Contao\System::getContainer()->get('session')->all();
    var_dump($session['CURRENT']['IDS']); 
    Also via

    PHP-Code:
    var_dump($session['CURRENT']['IDS']) 
    bekomme ich NULL - wenn ich nur $session ausgebe, dann kommt folgendes.

    Code:
    array:4 [?
      "_csrf/https-contao_referer_id" => "7gPTT43D"
      "_security.contao_backend.target_path" => "https://dev.**.test/contao/"
      "referer" => array:6 [?
        "f-RNfLEz" => array:2 [?]
        "bOUDdfLZ" => array:3 [?]
        "gvyi3fro" => array:3 [?]
        "3_mcbQ8P" => array:3 [?]
        "ZlnLayXU" => array:1 [?]
        "zikxt0PY" => array:3 [?]
      ]
      "_security_contao_backend" => "C:74:"Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken":731:{a:3:{i:0;N;i:1;s:14:"contao_backend";i:2;a:4:{i:0;C:18:"Contao\BackendUse ?"
    ]
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Soweit ich weiß stehen in CURRENT IDS nur die IDs wenn man "Mehrere bearbeiten" macht.

  9. #9
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Soweit ich weiß stehen in CURRENT IDS nur die IDs wenn man "Mehrere bearbeiten" macht.
    Ja scheint wohl so:

    Bildschirmfoto 2019-07-03 um 10.25.57.JPG

    Mist... dann ist das wohl eine Veränderung zu 3.5. Naja wird seine Gründe haben

    Hast du ne Idee wie ich dann die ID's herankommen, welche aktuell durch Suche, Filter oder Sortierung angezeigt werden?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Hm, ich glaube nicht, dass das in 3.5 anders war? Zumindest finde ich im Code keinen Hinweis darauf.

  11. #11
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von creativx Beitrag anzeigen
    Ja scheint wohl so:

    Bildschirmfoto 2019-07-03 um 10.25.57.JPG

    Mist... dann ist das wohl eine Veränderung zu 3.5. Naja wird seine Gründe haben

    Hast du ne Idee wie ich dann die ID's herankommen, welche aktuell durch Suche, Filter oder Sortierung angezeigt werden?
    Soweit ich mich erinnere, gab es das in Contao 3.5 auch nicht. Es war immer der Weg über Mehrere Bearbeiten zu gehen um eine Auswahl zu treffen.
    Vielleicht ist der Fehler nicht aufgefallen, da im Vorfeld immer eine Auswahl getroffen wurde und dann ist die SESSION-Variable ja gesetzt.

  12. #12
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Hm, ich glaube nicht, dass das in 3.5 anders war? Zumindest finde ich im Code keinen Hinweis darauf.
    Puh... da bin ich ehrlich gesagt ratlos. Mir würde zumindest kein vernünftiger Grund dafür einfallen warum das geändert werden sollte

    Ich kann nur soviel sagen, dass ich mir 1000% sicher bin, dass die Funktion so war:
    - Redakteur klickt im BE auf die Anwendung und sieht eine Liste von Einträgen.
    - Er kann, wenn er mag filtern und somit die Ergebnismenge eingrenzen
    - Danach kann er aus der angezeigten Ergebnismenge über ein eigens dafür erstelltes BE Modul einen Excel-Export starten

    PHP-Code:
        /**
         * 
         * @param object
         * @return string
         */
        
    public function exportDefault(DataContainer $dc)
        {
            
    // Wenn der Exportparameter nicht gesetzt ist
            
    if ($this->Input->get('key') != 'export')
            {
                return 
    '';
            }
            
            
    // Wenn der Exportparameter gesetzt ist
            
    if ($this->Input->get('key') == 'export')
            {
                
    // Hole die Session und extrahiere daraus die ID's der gefilterten Datenmeng
                
    $session Session::getInstance()->getData();
                
    $arrCurrentIds $session['CURRENT']['IDS'];
                
                
    // Durchlaufe die selektieren Id's
                
    $arrSqlResult = array();
                foreach (
    $arrCurrentIds as $value)
                {
                    
    $tmpArr $this->getSqlFromCurrentId($value);
                    
    $arrSqlResult[] = $tmpArr[0];
                }
                
                
    // Instanziere die neue ExcelKlasse
                
    $objPHPExcel = new PHPExcel();
                
                
    // Baue das Excelsheet zusammen
                
    $objPHPExcel $this->getExcelObjektValues($objPHPExcel);
                
    $objPHPExcel $this->getExcelObjektValuesArray($objPHPExcel$arrSqlResult);
                
    $objPHPExcel $this->getExcelObjektProperties($objPHPExcel);
                
                
    // Generiere das Excelsheet
                
    $this->generateExcelSheet($objPHPExcel);
                            
                 
            }        
        } 
    Das ganze hat garantiert ohne das Verwendung von "mehrere Bearbeiten" funktioniert:

    Bildschirmfoto 2019-07-03 um 10.38.26.JPG
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Wäre sehr praktisch, wenn das tatsächlich so funktionieren würde. Ich habe die Filterung dann immer manuell nachgebaut . Also über die Session bekommst du ja, welche Filter ausgewählt sind und kannst dir dann einen entsprechenden Query nachbauen. Ist etwas umständlich, da du teilweise Code aus dem DC Driver kopieren musst dafür ...

  14. #14
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von creativx Beitrag anzeigen
    Ich kann nur soviel sagen, dass ich mir 1000% sicher bin, dass die Funktion so war:
    Das hat mich jetzt tatsächlich interessiert. Sieht so aus, dass es dies tatäsächlich gab: https://github.com/contao/core/blob/....php#L394-L397

    Die Werte werden zwar weiterhin in DC_Table#$current gespeichert. Nur werden die Callbacks im Vorfeld ausgeführt. Da kommst du wohl nicht ohne weiteres dran.

  15. #15
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Wäre sehr praktisch, wenn das tatsächlich so funktionieren würde. Ich habe die Filterung dann immer manuell nachgebaut . Also über die Session bekommst du ja, welche Filter ausgewählt sind und kannst dir dann einen entsprechenden Query nachbauen. Ist etwas umständlich, da du teilweise Code aus dem DC Driver kopieren musst dafür ...
    Hab eben noch ne "alte" 3,5 Installation kurz hergenommen:

    Wenn ich als Beispiel in dca/tl_user einfach einen Dump wie folgt einsetze:

    PHP-Code:
    dump(Session::getInstance()->getData()); exit; 
    dann erhalte ich deutlich mehr wie unter 4.7 - (nur ein Auszug)

    PHP-Code:
    Array
    (
        [
    referer] => Array
            (
                [
    c0c92e74] => Array
                    (
                        [
    tl_page] => contao/main.php?do=page&ref=f818f930
                        
    [last] => contao/main.php?do=themes&table=tl_module&id=2
                        
    [current] => contao/main.php?do=page&ref=f818f930
                    
    )

                ....

            )

        [
    CURRENT] => Array
            (
                [
    IDS] => Array
                    (
                        [
    0] => 11
                        
    [1] => 10
                        
    [2] => 1
                    
    )

                [
    tl_layout] => Array
                    (
                        [
    0] => name
                    
    )

                [
    tl_member] => Array
                    (
                        [
    0] => username
                        
    [1] => assignDir
                        
    [2] => homeDir
                    
    )

                [
    tl_page] => Array
                    (
                        [
    0] => cssClass
                        
    [1] => fontawesomeclass
                    
    )

            )

        [
    filetree] => Array
            (
                [
    924390fc] => 1
                
    [c7583bce] => 1
                
    [110ae8d8] => 1
                
    [cd4eb530] => 0
                
    [09ba6108] => 1
                
    [b2bae28c] => 0
                
    [3592d7d6] => 0
                
    [c57c6e17] => 1
                
    [5f0fcde1] => 1
                
    [20931249] => 0
            
    )

        


    Und da sind se drin - die CURRENT IDS
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  16. #16
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von webstar Beitrag anzeigen
    Das hat mich jetzt tatsächlich interessiert. Sieht so aus, dass es dies tatäsächlich gab: https://github.com/contao/core/blob/....php#L394-L397

    Die Werte werden zwar weiterhin in DC_Table#$current gespeichert. Nur werden die Callbacks im Vorfeld ausgeführt. Da kommst du wohl nicht ohne weiteres dran.
    Ja bin eben auch drau gekommen - sieh mein Post

    Verdammt...

    Was meinst du mit "werden die Callbacks vorher ausgeführt" ?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Dann würde ich das mal auf GitHub posten - denn prinzipiell ist das ja wie gesagt eine nützliche Sache.

  18. #18
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Zitat Zitat von creativx Beitrag anzeigen
    Ja bin eben auch drau gekommen - sieh mein Post

    Verdammt...

    Was meinst du mit "werden die Callbacks vorher ausgeführt" ?
    der DC_Table schreibt die Werte weiterhin in $this->current rein. Die verfügbaren Callbacks, wie onload_callback werden auf der aktuellen Seite halt vorher ausgeführt. Daher hilt es dir auch nicht, dann in dem Callback zu überprüfen, welche Werte hier zwischengespeichert werden.

    Du könntest natürlich versuchen in einem Custom-Backend-Modul folgendes zu machen:

    PHP-Code:
    class ExportBackendModule
    {
        
    /** @var \Contao\DC_Table */
        
    private $dc;
        
        public function 
    __construct(\Contao\DC_Table $dc)
        {
            
    $this->dc $dc;
        }
        
        public function 
    generate() 
        {
            
    $this->dc->showAll();
            
            
    $getCurrentValues = function () {
                return 
    $this->current;
            };
            
            
    $getCurrentValues->bindTo($this->dc);
            
            
    $values $getCurrentValues();
        }

    Damit generierst du zwar unötigerweise die Ausgabe, wenn du mit der Einschränkung aber leben kannst....

    Hier der Commit mit dem der Code entfernt wurde: https://github.com/contao/contao/com...8942f40dceafc3
    Hier das entsprechende Ticket dazu: https://github.com/contao/core-bundle/issues/1130
    Geändert von webstar (03.07.2019 um 10:04 Uhr) Grund: Link zum Issue hinzugefügt

  19. #19
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Dann würde ich das mal auf GitHub posten - denn prinzipiell ist das ja wie gesagt eine nützliche Sache.
    Jap... seh ich schon auch so. Würdest Du das machen? Also bei GitHub das einstellen?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  20. #20
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von webstar Beitrag anzeigen
    der DC_Table schreibt die Werte weiterhin in $this->current rein. Die verfügbaren Callbacks, wie onload_callback werden auf der aktuellen Seite halt vorher ausgeführt. Daher hilt es dir auch nicht, dann in dem Callback zu überprüfen, welche Werte hier zwischengespeichert werden.

    Du könntest natürlich versuchen in einem Custom-Backend-Modul folgendes zu machen:

    PHP-Code:
    class ExportBackendModule
    {
        
    /** @var \Contao\DC_Table */
        
    private $dc;
        
        public function 
    __construct(\Contao\DC_Table $dc)
        {
            
    $this->dc $dc;
        }
        
        public function 
    generate() 
        {
            
    $this->dc->showAll();
            
            
    $getCurrentValues = function () {
                return 
    $this->current;
            };
            
            
    $getCurrentValues->bindTo($this->dc);
            
            
    $values $getCurrentValues();
        }

    Damit generierst du zwar unötigerweise die Ausgabe, wenn du mit der Einschränkung aber leben kannst....

    Hier der Commit mit dem der Code entfernt wurde: https://github.com/contao/contao/com...8942f40dceafc3
    Hier das entsprechende Ticket dazu: https://github.com/contao/core-bundle/issues/1130

    Ah okay - danke fürs nachschauen Also war es quasi an der Stelle erforderlich, das heraus zu nehmen.

    Deinen Vorschlag werde ich mal versuchen einzubauen, ich muss halt irgendwie dieses Feature wieder hinbekommen. Ich wäre so frei und würde mich darauf ggf. nochmal melden
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

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

    Standard

    Zitat Zitat von creativx Beitrag anzeigen
    Würdest Du das machen? Also bei GitHub das einstellen?
    Nein, du musst dich schon selbst daran beteiligen

  22. #22
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    Zitat Zitat von Spooky Beitrag anzeigen
    Nein, du musst dich schon selbst daran beteiligen
    Ich hatte es befürchtet Alles gut - passt, mache ich.
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  23. #23
    Contao-Fan
    Registriert seit
    21.12.2009.
    Beiträge
    445

    Standard

    So und schwups komme ich mit der ersten Frage um die Ecke

    Mir fehlt eben der Ansatz wie ich den DC_Table in meine Custom-Backend-Klasse injecten kann

    Ich habe in meiner DCA Anwendung via

    PHP-Code:
    GLOBALS['TL_DCA']['tl_tdo_kundenantrag_neu']['list']['global_operations'
    quasi einen zusätzlichen Button für den Export implementiert. Die dazugehörige Klasse hole ich mir wie folg:

    PHP-Code:
    $GLOBALS['BE_MOD']['be_mod_crm']['kundenantrag']['export'] = array('WebsiteBundle\\Backend\\Export''getExportDefault'); 
    Und hier - eben nach dem Beispiel bzw. nach dem Tip von hier - schaut die Klasse mal zunächst so aus :

    PHP-Code:
    namespace WebsiteBundle\Backend;


    use 
    Contao\DC_Table;

    class 
    Export
    {

        
    /**
         * @var DC_Table
         */
        
    private $dc;

        public function 
    __construct(DC_Table $dc)
        {
            
    $this->dc $dc;
        }

        public function 
    getExportDefault()
        {
            
    $this->dc->showAll();

            
    $getCurrentValues = function () {
                return 
    $this->current;
            };

            
    $getCurrentValues->bindTo($this->dc);

            
    $values $getCurrentValues();

            
    dump($values); exit;
        }


    Da bekomme ich aber beim Aufruf der "Export" Funktion den Fehler, dass quasi beim Constructor das Argument fehlt. Also Autowire klappt ja hier noch nicht - wie kann ich das lösen?

    Ne Idee ?
    Viele Grüße aus dem Süden
    creativx
    ---- Planung ist Ersatz des Zufalls durch den Irrtum ----

  24. #24
    Contao-Urgestein
    Registriert seit
    29.10.2009.
    Ort
    Magdeburg
    Beiträge
    2.020
    Partner-ID
    626
    User beschenken
    Wunschliste

    Standard

    Mein Beispiel basierte auf einem custom Backend Modul. Du nutzt die Möglichkeit Callbacks zu definieren. Da wird der DataContainer als Parameter übergeben:

    https://github.com/contao/core-bundl...ckend.php#L429

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
  •