Jump to content
  • 0

Produkty tej samej kategorii - jak wyświetlić produkty TYLKO z głównej kategorii?


myszor

Question

Cześć!

Dla każdego produktu w moim sklepie główną kategorią jest nazwa kolekcji do której ten produkt należy. Oprócz tego produkty są oczywiście przypisane również do innych pasujących kategorii. 

Na przykładzie: "Szafa Mega 1" -> Kategoria główna: "Kolekcja Mega", dodatkowo przypisana jeszcze do kategorii "Szafy".

I teraz tak, jeśli wejdę w ten produkt w następujący sposób: Kolekcje -> Kolekcja Mega -> Szafa Mega 1, to moduł wyświetla mi pozostałe produkty tylko z kategorii "Kolekcja Mega". I chciałbym żeby zawsze tylko z tej głównej kategorii produkty były wyświetlane. 

Problem pojawia się kiedy wejdę w ten produkt w ten sposób: Szafy -> Szafa Mega 1. Wtedy moduł wyświetla mi wszystkie produkty z kategorii "Szafy". 

Czy da się coś z tym zrobić? 

Z góry bardzo dziękuję za pomoc. :)

Link to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 0

Więc tak na szybko:

Jeśli dobrze zrozumiałem to chodzi o wbudowany moduł PS do wyświetlania produktów z tej samej kategorii.

Moduł pobiera produkty do wyświetlenia na podstawie kategorii, w której aktualnie jesteś czyli jeśli będziesz w "Szafy" to pobierze id kategorii szafy, a jeśli w "Kolekcje' to w id kategorii kolekcje. Tutaj jest kod za to odpowiedzialny:

public function getWidgetVariables($hookName = null, array $configuration = array())
    {
        $params = $this->getInformationFromConfiguration($configuration);
        if ($params) {



		// Tutaj moduł wywołuje metodę pobierająca produkty. $params to zmienna, która jest ustawiana przez PS do każdego widoku.

            $products = $this->getCategoryProducts($params['id_product'], $params['id_category']);





			if (!empty($products)) {
                return array(
                    'products' => $products,
                );
            }
        }
        return false;
    }



// Metoda pobierająca produkty

private function getCategoryProducts($idProduct, $idCategory)
    {

		// Utworzenie obiektu Category na podstawie id pobranego z $params

        $category = new Category($idCategory);
        $showPrice = (bool) Configuration::get('CATEGORYPRODUCTS_DISPLAY_PRICE');

        $searchProvider = new CategoryProductSearchProvider(
            $this->getTranslator(),
            $category
        );

        $context = new ProductSearchContext($this->context);

        $query = new ProductSearchQuery();

        $nProducts = (int) Configuration::get('CATEGORYPRODUCTS_DISPLAY_PRODUCTS') + 1; // +1 If current product is found

        $query
            ->setResultsPerPage($nProducts)
            ->setPage(1)
        ;

        $query->setSortOrder(SortOrder::random());

        $result = $searchProvider->runQuery(
            $context,
            $query
        );

        $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()
        );

        $productsForTemplate = array();

        $presentationSettings->showPrices = $showPrice;

        $products = $result->getProducts();

        foreach ($products as $rawProduct) {
            // Not duplicate current product
            if ($rawProduct['id_product'] !== $idProduct && count($productsForTemplate) < (int) Configuration::get('CATEGORYPRODUCTS_DISPLAY_PRODUCTS')) {
                $productsForTemplate[] = $presenter->present(
                    $presentationSettings,
                    $assembler->assembleProduct($rawProduct),
                    $this->context->language
                );
            }
        }
        return $productsForTemplate;
    }

 

Tak, więc wydaje mi się, że jeśli chciałbyś pobierać zawsze tylko z kategorii głównej to trzeba lekko zmienić kod.

Zamiast tworzyć :

$category = new Category($idCategory);

To trzeba by spróbować sprawdzić czy w obiekcie Product atrybut id_category_default nie jest przypadkiem kategorią główną.

Czyli zmienić kod na coś takiego:

$product = new Product($id_product);
$category = new Category($product->id_category_default);

 

 

Nie dam sobie ręki uciąć ale może zadziała.

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...