Ergebnis 1 bis 15 von 15

Thema: SessionBag registrieren

  1. #1
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Frage SessionBag registrieren

    Hi,

    ich möchte für meine kleine Shop-Extension gerne einen SessionBag registrieren.

    Ich habe etwas von Contao adaptiert und eigentlich sollte das gehen. Tut es aber nicht.

    Contao registriert seine SessionBags so:

    Code:
    contao.session.factory:
            class: Contao\CoreBundle\Session\SessionFactory
            decorates: session.factory
            arguments:
                - '@contao.session.factory.inner'
                - '@contao.session.contao_backend'
                - '@contao.session.contao_frontend'
    Ich wollte mich nun an Contao dran hängen und habe das programmiert:

    Code:
    Bits\MmShopBundle\Session\CartSessionBag:
            public: true
            
        
        Bits\MmShopBundle\Session\SessionFactory:
            decorates: contao.session.factory
            arguments:
                - '@contao.session.factory.inner'
                - '@Bits\MmShopBundle\Session\CartSessionBag'
    Die Konsole wirfst keinen Fehler:

    Code:
    Information for Service "Bits\MmShopBundle\Session\SessionFactory"
    ==================================================================
    
     ---------------- ---------------------------------------------------------------------------------------------------------
      Option           Value                                                                                                
     ---------------- ---------------------------------------------------------------------------------------------------------
      Service ID       Bits\MmShopBundle\Session\SessionFactory                                                             
      Class            Bits\MmShopBundle\Session\SessionFactory                                                             
      Tags             container.decorator (id: contao.session.factory, inner: Bits\MmShopBundle\Session\SessionFactory.inner)
      Public           yes                                                                                                  
      Synthetic        no                                                                                                   
      Lazy             no                                                                                                   
      Shared           yes                                                                                                  
      Abstract         no                                                                                                   
      Autowired        yes                                                                                                  
      Autoconfigured   yes                                                                                                  
      Usages           contao.session.factory                                                                               
                       ContaoCommunityAlliance\DcGeneral\SymfonyBridge\SessionFactory.inner                                 
                       ContaoCommunityAlliance\DcGeneral\SymfonyBridge\SessionFactory
    Trotzdem bekomme ich im Frontend, die Nachricht das meine SessionBag nicht registriert ist.

    Vielleicht ist es noch notwendig zu erwähnen das ich einen eigenen Controller nutze?
    PHP-Code:
    <?php

    namespace Bits\MmShopBundle\Controller;

    use 
    Contao\CoreBundle\Framework\ContaoFramework;
    use 
    Contao\CoreBundle\Controller\AbstractController;
    use 
    Contao\PageModel;
    use 
    Contao\PageRegular;
    use 
    Contao\System;
    use 
    Symfony\Component\HttpFoundation\Response;
    use 
    Symfony\Component\HttpFoundation\Request;
    use 
    Symfony\Component\Routing\Annotation\Route;
    use 
    Psr\Container\ContainerInterface;
    use 
    Symfony\Component\DependencyInjection\Container;
    use 
    Bits\MmShopBundle\Service\ResourceResolver;
    use 
    Doctrine\DBAL\Connection;

    #[Route(defaults: ['_scope' => 'frontend'])]
    class ProductDetailController extends AbstractController
    {
        
        public function 
    __construct(
            private 
    Connection $db,
            private 
    ResourceResolver $resourceResolver,
            private 
    readonly ContaoFramework $framework
        
    ) {
            
    $this->resourceResolver $resourceResolver;
            }
        
        public function 
    __invoke(Request $requeststring $aliasstring $category): Response
        
    {
            
    $this->framework->initialize();
          
            if (!
    $this->resourceResolver->isProduct($category,$alias) || !$this->resourceResolver->isProductCategory($category)) {
                throw new \
    Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
            }
     
            global 
    $objPage;
            
    $objPage PageModel::findPublishedById('195');
            
    $request->attributes->set('pageModel'$objPage);

            if (!
    $objPage) {
                throw new \
    RuntimeException('Detailseite nicht gefunden.');
            }

            
    // Übergib die Seite an Contao's regulären Renderer
            
    $controller = new PageRegular();
            return 
    $controller->getResponse($objPagefalse);
        }
    }
    Das Framework wird ja initialisiert.

    Woran kann das liegen?
    Curiosity killed the cat

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

    Standard

    Du musst wenn dann session.factory decoraten, nicht contao.session.factory.

    Aber warum willst du deinen eigenen Session Bag? Ist dein Shop nicht im Contao Frontend?
    » sponsor me via GitHub or Revolut

  3. #3
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Naja ich finde es sinnvoll für den Cart einen eigenen SessionBag zu verwenden
    Curiosity killed the cat

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

    Standard

    Aber dein Cart ist doch wahrscheinlich nur eine einzige Session Variable, oder nicht? Dafür würde ich nicht extra einen Bag registrieren.
    » sponsor me via GitHub or Revolut

  5. #5
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Ich wollte gerne Methoden nutzen zum updaten und so weiter. Habe zum beispiel ja ein Array pro Eintrag. Und es wäre schick gewesen, hätte ich so Methoden has, get, und sowas auf das Innnere nutzen könnte.
    Curiosity killed the cat

  6. #6
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Habe das jetzt mal probiert:

    Code:
     Bits\MmShopBundle\Session\SessionFactory:
            decorates: session.factory
            arguments:
                - '@Bits\MmShopBundle\Session\SessionFactory.inner'
                - '@Bits\MmShopBundle\Session\CartSessionBag'
    Aber symfony scheint die Decoration raus zzu werfen
    Code:
    Information for Service "Bits\MmShopBundle\Session\SessionFactory"
    ==================================================================
    
     ---------------- ------------------------------------------
      Option           Value
     ---------------- ------------------------------------------
      Service ID       Bits\MmShopBundle\Session\SessionFactory
      Class            Bits\MmShopBundle\Session\SessionFactory
      Tags             -
      Public           yes
      Synthetic        no
      Lazy             no
      Shared           yes
      Abstract         no
      Autowired        yes
      Autoconfigured   yes
      Usages           contao.session.factory.inner
                       contao.session.factory
    - - - Aktualisiert - - -

    Naja ich glaube ich gebs auf. Muss ich mich halt mit Arrays rumplagen =)
    Curiosity killed the cat

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

    Standard

    Du musst genauer beschreiben, was du überhaupt versuchst - oder den Code posten. Und auch welches Konsolenkommando du da überhaupt aufrufst.
    » sponsor me via GitHub or Revolut

  8. #8
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Computer

    Ok, mach ich dann mal. Muss erstmal Pause machen...
    Hier ist das Konsolen-Komanado:
    Code:
    bin/console debug:container Bits\\MmShopBundle\\Session\\SessionFactory
    Curiosity killed the cat

  9. #9
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Also hier ein bischen Code von meinem Modul:

    PHP-Code:
    public function __construct($module$column 'main')
        {
            
            
    $this->container System::getContainer();
            
    $this->request $this->container->get('request_stack')->getCurrentRequest();
            
    $this->session $this->request->getSession();
            
    $this->connection $this->container->get('database_connection');
            
    $this->twig $this->container->get('twig');
            
    $this->metamodelsFactory $this->container->get('metamodels.factory');
            
            if(!
    is_array($this->session->getBag('contao_frontend')->get('cart')))
            { 
    var_dump('test1');
                  
    $this->session->getBag('contao_frontend')->set('cart',[]);
                
    $this->sessionCart $this->session->getBag('contao_frontend')->get('cart');
            }else{
                
    var_dump(get_class_methods$this->session->getBag('contao_frontend')),'test2');
                    
    $this->session->getBag('contao_frontend')->set('cart',$this->session->getBag('contao_frontend')->get('cart'));
                   
    $this->sessionCart $this->session->getBag('contao_frontend')->get('cart');//$this->session->getBag('card');
          
            
    }   
            
           

        }
        
        public function 
    generate(){
            
            
            if (
    $this->request && $this->container->get('contao.routing.scope_matcher')->isBackendRequest($this->request))
            {
                 return 
    $this->twig->render('@Contao/backend/be_wildcard.html.twig', [
                    
    'wildcard' => '### ' $GLOBALS['TL_LANG']['FMD']['cart'][0] . ' ###',
                    
    'title' => $this->name,
                    
    'id' => $this->id
                
    ]);
                
            }
            
                
    //add to card
                
    $addId Input::get('add');
                if(
    $addId !== Null){
                    
    $count 0;
                    if(isset(
    $this->sessionCart[$addId][$addId.'_count'])){
                        
    $count =  $this->sessionCart[$addId][$addId.'_count']+1;
                    }
                    
    $this->sessionCart[$addId] = [$addId.'_count' => $count];
                    
    $this->session->save();
                   
                    return new 
    RedirectResponse($this->request->getSchemeAndHttpHost() . $this->request->getPathInfo());
                }
                
    var_dump($this->session->getBag('contao_frontend')->get('cart')); 
    Geändert von Monique Hahnefeld (18.05.2025 um 21:14 Uhr)
    Curiosity killed the cat

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

    Standard

    • Du musst auch den Code deiner Session Factory posten.
    • Verwende nicht System::getContainer() sondern Dependency Injection.
    • Dein ProductDetailController und ProductListController sollten wahrscheinlich eher Page Controller sein, nachdem du dort das globale Page Objekt setzt.
    » sponsor me via GitHub or Revolut

  11. #11
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Dein ProductDetailController und ProductListController sollten wahrscheinlich eher Page Controller sein, nachdem du dort das globale Page Objekt setzt.
    Du meinst ich sollte die Klassen anders benennen?

    Ich habe es jetzt ohne SessionBag gelöst. Es geht auch so, aber ich hätte es halt schick gefunden mit.

    Meine SessionFactory:
    PHP-Code:
    <?php

    namespace Bits\MmShopBundle\Session;

    use 
    Symfony\Component\HttpFoundation\Session\SessionBagInterface;
    use 
    Symfony\Component\HttpFoundation\Session\SessionFactoryInterface;
    use 
    Symfony\Component\HttpFoundation\Session\SessionInterface;

    class 
    SessionFactory implements SessionFactoryInterface
    {
        public function 
    __construct(
            private 
    readonly SessionFactoryInterface $inner,
            private 
    readonly SessionBagInterface $cartBag
        
    ) {}

        public function 
    createSession(): SessionInterface
        
    {
            
    $session $this->inner->createSession();
            
    $session->registerBag($this->cartBag);
            return 
    $session;
        }
    }
    Curiosity killed the cat

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

    Standard

    Zitat Zitat von Monique Hahnefeld Beitrag anzeigen
    Du meinst ich sollte die Klassen anders benennen?
    Nein, du solltest sie wahrscheinlich wie gesagt als Page Controller umsetzen.



    Zitat Zitat von Monique Hahnefeld Beitrag anzeigen
    Meine SessionFactory:
    PHP-Code:
    <?php

    namespace Bits\MmShopBundle\Session;

    use 
    Symfony\Component\HttpFoundation\Session\SessionBagInterface;
    use 
    Symfony\Component\HttpFoundation\Session\SessionFactoryInterface;
    use 
    Symfony\Component\HttpFoundation\Session\SessionInterface;

    class 
    SessionFactory implements SessionFactoryInterface
    {
        public function 
    __construct(
            private 
    readonly SessionFactoryInterface $inner,
            private 
    readonly SessionBagInterface $cartBag
        
    ) {}

        public function 
    createSession(): SessionInterface
        
    {
            
    $session $this->inner->createSession();
            
    $session->registerBag($this->cartBag);
            return 
    $session;
        }
    }
    Was ist $this->cartBag? Hast du den Bag als Service registriert? Wenn ja wie sieht die Service Definition davon aus?

    Es fehlt auch noch der (korrigierte) Code, wo du genau diesen Session Bag holst.
    » sponsor me via GitHub or Revolut

  13. #13
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Das ist der SessionBag:

    PHP-Code:
    <?php

    namespace Bits\MmShopBundle\Session;

    use 
    Symfony\Component\HttpFoundation\Session\SessionBagInterface;

    class 
    CartSessionBag implements SessionBagInterface
    {
        private 
    string $name 'cart';
        private array 
    $data = [];

        public function 
    getName(): string
        
    {
            return 
    $this->name;
        }

        public function 
    initialize(array &$array): void
        
    {
            
    $this->data = &$array;
        }

        public function 
    getStorageKey(): string
        
    {
            return 
    '_cart'
        }

        public function 
    clear(): array
        {
            
    $cleared $this->data;
            
    $this->data = [];

            return 
    $cleared;
        }

        
    // Convenience methods
        
    public function set(string $keymixed $value): void
        
    {
            
    $this->data[$key] = $value;
        }

        public function 
    get(string $keymixed $default null): mixed
        
    {
            return 
    $this->data[$key] ?? $default;
        }

        public function 
    has(string $key): bool
        
    {
            return 
    array_key_exists($key$this->data);
        }

        public function 
    all(): array
        {
            return 
    $this->data;
        }

        public function 
    remove(string $key): void
        
    {
            unset(
    $this->data[$key]);
        }
    }
    Hier wird er als Argument übergeben:

    Code:
    Bits\MmShopBundle\Session\SessionFactory:
            decorates: session.factory
            arguments:
                - '@Bits\MmShopBundle\Session\SessionFactory.inner'
                - '@Bits\MmShopBundle\Session\CartSessionBag'
    Curiosity killed the cat

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

    Standard

    »
    Zitat Zitat von Spooky Beitrag anzeigen
    Es fehlt auch noch der (korrigierte) Code, wo du genau diesen Session Bag holst.
    Und der genaue Fehler.
    » sponsor me via GitHub or Revolut

  15. #15
    Contao-Fan Avatar von Monique Hahnefeld
    Registriert seit
    22.11.2011.
    Ort
    Berlin
    Beiträge
    283

    Standard

    Verstehe ich nicht
    Curiosity killed the cat

Aktive Benutzer

Aktive Benutzer

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

Berechtigungen

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