Jump to content

ProductListingLazyArray: Wie bekomme ich die Daten heraus


Recommended Posts

Hallo ihr,

 

Neue Woche ... neue Frage ... Ich hoffe bald macht es klick und ich kann mein Wissen zurück geben und euch auch helfen :) 

DANKE für eure Geduld!


Ich arbeite gerade an einem Modul welches mir ausgewählte Produkte in das default products.tpl injecten soll. So eine Art "TOP PRODUKTE" section.

Das Backend ist fertig und ich bekomme auch mein Array an Produkt ID's zurück. 

Das Ziel ist es jetzt die Produktinfos zu bekommen und an das default template einer frischen PrestaShop Installation zu übergeben.
Hier dachte ich an

themes\classic\templates\catalog\_partials\products.tpl

Jetzt ist mein großes Problem, dass ich es nicht schaffe meine Daten in die gleiche Struktur zu bekommen wie es das Standard Template benötigt.

 

Wenn ich zB Die Suche debugge - welche auch dieses Template nutzt - sehe ich, dass ein Product vom Typ

object(PrestaShop\PrestaShop\Adapter\Presenter\Product\ProductListingLazyArray

ist, sprich ich habe dieses ProductListingLazyArray und daraus zieht er sich dann in den einzelnen Templates alle Infos wie {$product.id_product} oder {$product.url} usw.

 

Da ich "meine" Produkte mit 

$product = new Product($productId, true);

erstelle habe ich aber natürlich kein ProductListingLazyArray sondern ein Objek vom Typ Product.

 

Habt ihr vlt einen Tipp wie ich das umwandeln kann oder bin ich komplett auf dem falschen Weg?

 

 

DANKE und einen schönen Start in die Woche!

LG,

Edited by R4xx4r
solved the issue (see edit history)
Link to comment
Share on other sites

Ich beantworte meine Frage selbst, da ich es jetzt doch geschafft habe :) 

Hier meine Methode mit der ich das ganze mache.

/**
     * creates relevant product information for frontend output
     * 
     * @param array $allSelectedProductIds array with all id's of the selected products 
     * @param int $languageId language id of the shop you are in
     * 
     * @return array all product information we need for our frontend rendering
     */
    public function getFrontendProductInformation($allSelectedProductIds, $languageId)
    {
        // set default category Home
        $category = new Category((int)2);

        // create new product search proider
        $searchProvider = new CategoryProductSearchProvider(
            $this->context->getTranslator(),
            $category
        );

        // set actual context
        $context = new ProductSearchContext($this->context);
        
        // create new search query
        $query = new ProductSearchQuery();
        $query->setResultsPerPage(PHP_INT_MAX)->setPage(1);
        $query->setSortOrder(new SortOrder('product', 'position', 'asc'));
        
        $result = $searchProvider->runQuery(
            $context,
            $query
        );

        // Product handling - to get relevant data
        $assembler = new ProductAssembler($this->context);
        $presenterFactory = new ProductPresenterFactory($this->context);
        $presentationSettings = $presenterFactory->getPresentationSettings();
        $presenter = new ProductListingPresenter(
            new ImageRetriever(
                $this->context->link
            ),
            $this->context->link,
            new PriceFormatter(),
            new ProductColorsRetriever(),
            $this->context->getTranslator()
        );

        $products = array();
        foreach ($result->getProducts() as $rawProduct) {
            $productId = $rawProduct['id_product'];
            if(in_array($productId, $allSelectedProductIds)) {
                $product = $presenter->present(
                    $presentationSettings,
                    $assembler->assembleProduct($rawProduct),
                    $this->context->language
                );
                array_push($products, $product);
            }
        }

        return $products;
    }

sprich ich erzeuge mir einfach eine art "fake suche" und gleiche das Suchergebnis, dann mit den von mir gewählten Produkten ab.

 

Ich hoffe, dass hilft vlt doch dem ein oder anderen.

Wenn nicht gerne fragen und ich versuche es genauer zu erklären :)

 

LG

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...