Kategorie- und Property-Namen aus TWIG bekommen

Ich möchte gerne die Namen der Produktkategorien in JavaScript weiter verwenden, doch ich finde keinen Weg an sie heran zu kommen in der TWIG Umgebung.

Ich habe page.product.categoryTree gefunden - hier habe ich ein Array mit den Ids der Kategorien, wenn ich das richtig sehe. Aber wie komme ich am besten an die eigentlichen Namen der Kategorien („Bücher“, „Sport“ etc.) ran?

Das gleiche hätte ich auch gerne für die Properties, hier finde ich nur page.product.propertyIds. Wennn ich einen TWIG dump mache und nach den eigentlichen Namen / Bezeichnungen suche findet man auch nichts, aber diese Werte müssten doch eigentlich irgendwo zu finden sein, oder nicht? Oder sollte ich dazu eine eigene TWIG Funktion schreiben die das dann aus der Datenbank holt?

 

Danke und viele Grüße

1 „Gefällt mir“

Ich habe es mit einer TWIG Funktion gelöst die die Kategorie IDs bekommt und sich die Namen via DAL aus der Datenbank holt.

productRepository = $productRepository;
        $this->categoryRepository = $categoryRepository;
    }

    public function getCategoryNames($categoryIds): ?array {
        $output = array();
        $categoryNames = $this->categoryRepository->search(
            new Criteria($categoryIds),
            \Shopware\Core\Framework\Context::createDefaultContext()
        );
        foreach ($categoryNames->getElements() as $category) {
            array_push($output, $category->getName());
        }
        return $output;
    }
    public function getData($event): ?string {...}
}

Ich habe einen solchen Service registriert. In der service.xml sieht das so aus:

...

Das siehst du auch direkt die Twig extension, die dann einfach so ist:

dalDealer = $dalDealer;
    }

    public function getFunctions(): array
    {
        return [
            new TwigFunction('getCategoryNames', [$this, 'getCategoryNames'])
        ];
    }

    public function getCategoryNames($ids) {
        return $this->dalDealer->getCategoryNames($ids);
    }



}

Im Template kann ich das dann einfach so nutzen (also ich bin da innerhalb eines HTML script tags auf einer Produkt Detail Seite):

window._ti.productCategories = JSON.parse('{{ getCategoryNames(page.product.categoryTree)|json_encode|raw }}');

 

 

Ob das der beste Weg ist kann ich dir nicht sagen, aber für mich kriegt es den Job erledigt.

1 „Gefällt mir“

Ich hänge mich hier mal dran, weil fast glaube, dass das auch für mein Problem hilfreich sein könnte.

Bei mir geht es aber eher um CMS Erlebniswelten: (https://forum.shopware.com/discussion/69694/eigene-cms-bloecke-und-daten#latest)
Vielleicht kann mich jemand mal in die richtige Richtung schubbsen, ob das, was @SasMapp da macht auch für meinen Anwengunsfall benötigt wird.

@StefanSch schrieb:

Also habe ich jetzt kurzerhand einen eigenen Block erstellt, das hat mit der Doku auch ganz gut geklappt.

Aber jetzt komme ich nicht weiter. {{ dump() }} spuckt zwar alles mögliche aus, aber so essenzielle Infos wie category.name oder in der Katgeorie enthaltene Produkte sind da nicht mit dabei!
Was muss ich denn nun dafür noch tun?

Ganz wild durcheinander sind sie nicht, sie sind nach ihrer Hierarchie geordnet. Man müsste mal im categoryRepository im DalDealer schauen obdort irgendwo die Info hinterlegt ist, auf welcher Ebene die jeweilige Kategorie ist, also sprich ob es Eltern gibt, und ob die Eltern ebenfalls Eltern haben usw. Wenn man das dann weiß könnte man das auf das Array anwenden und deine Struktur erzeugen. Vielleicht gibt es aber auch einen einfacheren Weg

Gut zu wissen, danke!

Hallo, 

ich benötige so etwas ähnliches, bin aber neu in der ganzen Thematik von TWIG und Shopware Entwicklung. Ich brauche eine TWIG Funktion, die mir über eine Category ID mehrere Werte zurückgeben kann. Kategorien-Name in der aktuellen Sprache, Link zur Kategorie-Seite und die URL zum Vorschaubild der Kategorie. 

Sowas wie {{ getCategory[12342].translated.name }}, {{ getCategory[12342].media.url }} und {{ getCategory[12342].url}},

wobei die url kann ich mir glaube ich über {{ seoUrl(‘frontend.navigation.page’, { navigationId: category.id }) }} ausgeben lassen, wenn ich richtig liege. Bei dem Rest würde ich ein bisschen Unterstützung von euch Experten benötigen würde.  Grin Danke!

Hallo Alex BS,
hast du das in der Zwischenzeit gelöst. Stehe gerade vor der selben Herausforderung.
Beste Grüße
Lars