Ga naar inhoud

Productcatalogus

De Atraxion-webshop verkoopt drie hoofdproducttypen aan professionele klanten (B2B): banden, velgen en accessoires. Daarnaast bestaat er het conceptuele type sets (band + velg gecombineerd) en diensten. Categorisatie loopt uitsluitend via ArticleCategory; het verouderde Warengruppe/ArticleGroup-veld op het artikel is een legacy-overblijfsel dat niet gebruikt wordt voor categorie-logica.

Producttypen en categorieën

De productcategorieën zijn gedefinieerd als constanten in _core/model/classes/atx/articles/ArticleCategory.php:

// _core/model/classes/atx/articles/ArticleCategory.php:14
public const ACCESSORY = 1;   // Accessoires
public const TYRE      = 2;   // Banden
public const WHEEL     = 3;   // Velgen
public const KIT       = 5;   // Sets (band+velg)
public const SERVICE   = 9;   // Diensten

Op het Article-model zit dezelfde numerieke set als CATEGORY_ACCESSORY, CATEGORY_TYRE, CATEGORY_WHEEL (_core/model/classes/atx/articles/Article.php:36–40). Het veld Artcat op het artikel slaat het categorienummer op.

ArticleCategory is een Doctrine-entiteit met een name, een odooId en koppelingen aan voertuigcategorieën (ArticleCategoryVehicle) en tags (Tag). Hulpmethoden:

Methode Bestand:regel Betekenis
isTyres() ArticleCategory.php:117 odooId === '01' → bandengroep
isWheels() ArticleCategory.php:113 odooId === '11' → velgengroep
translateId(int $id) ArticleCategory.php:121 geeft NL-label voor category-int

Het verouderde veld ArticleGroup (klasse Warengruppe) op het artikel mag genegeerd worden voor categorisatie (_core/model/classes/atx/articles/Article.php:108).

Subtypen per categorie

Banden

Banden (atx\articles\tyres\Tyre) hebben een TyreType-entiteit die eigenschappen op typeniveau vastlegt. Relevante typekenmerken staan op de basisklasse Type (_core/model/classes/atx/articles/Type.php):

Veld Betekenis
Season Seizoen (zomer / winter / allseason)
Oldtimer Oldtimer-band — op typeniveau (Type.php:65)
Offroad Offroad-type
Slick Slick

SEO-tekst-criteriarecords voor banden (TyreSearch)

TyreSearch (_core/model/classes/atx/articles/tyres/TyreSearch.php, extends AbstractArticleSearch extends atx\Generic) is geen gebruikersgerichte zoekfilter. Het zijn opgeslagen criteria-records die bandeigenschappen beschrijven en dienen als matchingsleutel voor SEO-teksten op de artikeldetailpagina. De velden op een TyreSearch-record zijn matchingscriteria:

Veld Matchingscriterium
Breedte Breedte in mm
Serie Hoogte-breedteverhouding
Inch Velgdiameter in inches
Season Seizoen
Oldtimer Oldtimer-band (type-niveau)
Runflat Runflat
Offroad Offroad
Slick Slick
Roll Rollweerstand (EU-label)
Wetgrip Natteweg-grip (EU-label)
Noise Geluidsniveau (EU-label)

Zie _core/model/classes/atx/articles/tyres/TyreSearch.php:10–65 voor de volledige lijst.

TyreFilterService (_core/model/classes/atx/articles/TyreFilterService.php) matcht het getoonde artikel via een reeks strategieën (TyreFilterService::Methodes, :16–45) aan het best passende TyreSearch-record. Vervolgens laadt TyreSeoTextDAO de bijbehorende TyreSeoText (extends AbstractSeoText) met de meertalige beschrijving en optioneel een pictogram. ArticleDetailView::_renderTyreSeoText() (:3234) rendert de tekst.

Beheer van TyreSearch-records (aanmaken/wijzigen/koppelen aan SEO-teksten) loopt via de backoffice.

Storefront-zoeken en -filteren voor banden

De werkelijke storefront-zoek- en filterlogica voor banden loopt via TyreSearchController (_core/controller/classes/atx/articles/tyres/TyreSearchController.php, extends ArticleSearchController). Gebruikersparameters (breedte, serie, inch, seizoen, merk, …) komen binnen als request-array search[...] en worden verwerkt via findArticles() en processArticles(). Facetten (beschikbare filterwaarden op de resultatenlijst) worden opgebouwd door atx\SearchFilter (_core/model/classes/atx/SearchFilter.php) via $searchFilter->add(...) (:151–152). Voertuig-fitment verfijnt de zoekopdracht via voertuigdata — zie Voertuigdata & fitment.

Velgen

Velgen (atx\articles\wheels\Wheel) worden doorzocht via WheelSearchController (_core/controller/classes/atx/articles/wheels/WheelSearchController.php, extends ArticleSearchController).

SEO-tekst-criteriarecords voor velgen (WheelSearch)

WheelSearch (_core/model/classes/atx/articles/wheels/WheelSearch.php, extends AbstractArticleSearch) zijn opgeslagen criteria-records voor het matchen van velgartikelen aan SEO-teksten op de artikeldetailpagina. Matchingscriteria:

Veld Matchingscriterium
Breedte Breedte in inch
Inch Diameter in inch
Gaten Aantal bevestigingsgaten
DiamGaten Steekdiameter (PCD)
Offset ET-waarde
CenterGat Naafgat-diameter
Kleurnr Kleur
Materiaalnr Materiaal
Homologation Homologatie

WheelFilterService (_core/model/classes/atx/articles/WheelFilterService.php) matcht het getoonde velgartikel via WheelFilterService::Methodes (:15–37) aan het best passende WheelSearch-record en laadt de bijbehorende WheelSeoText via WheelSeoTextDAO. ArticleDetailView::_renderWheelSeoText() (:3194) rendert de tekst.

Accessoires

Accessoires (atx\articles\acc\Acc) worden doorzocht via AccSearchController (_core/controller/classes/atx/articles/acc/AccSearchController.php, extends ArticleSearchController). Ze kunnen gelinkt worden aan een AccType (type accessoire).

SEO-tekst-criteriarecords voor accessoires (AccSearch)

AccSearch (_core/model/classes/atx/articles/acc/AccSearch.php, extends AbstractArticleSearch) zijn opgeslagen criteria-records voor het matchen van accessoireartikelen aan SEO-teksten op de artikeldetailpagina. Matchingscriteria zijn basisvelden (Artnr, BrandId, Typenr, CategoryId, Eancode, Fabcode). AccFilterService matcht het artikel en laadt de bijbehorende AccSeoText. ArticleDetailView::_renderAccSeoText() (:3154) rendert de tekst.

Sets

Sets zijn combinaties van banden en velgen. Ze zijn aanwezig als extra channel-optie (Channel::allowSets(), _core/model/classes/atx/channels/Channel.php:1405) en worden beheerd via SetController en SetSearchController (_core/controller/classes/atx/articles/sets/).

Zoeken en filteren

Elk producttype heeft een eigen zoek-controller die ArticleSearchController uitbreidt:

Producttype Controller
Banden TyreSearchController
Velgen WheelSearchController
Accessoires AccSearchController
Sets SetSearchController (extends TyreSearchController)

De storefront-zoeklogica verloopt via ArticleSearchController::findArticles() en per type processArticles(). Beschikbare filterwaarden (facetten) worden dynamisch opgebouwd door atx\SearchFilter (_core/model/classes/atx/SearchFilter.php) op basis van de gevonden artikelen.

Het Oldtimer-veld voor de bandenmatch wordt opgehaald via $tyre->getType()->getOldtimer() (TyreFilterService.php:136) — van het TyreType, niet van het individuele artikel.

Artikeldetailpagina's worden bediend door ArticleDetailController (_core/controller/classes/atx/articles/ArticleDetailController.php).

Prijsweergave per klantcategorie

Basisprijs (Akprijs)

Elk artikel heeft een Akprijs (nettoprijs / aankoopprijs), opgeslagen in de atx_www-database (_core/model/classes/atx/articles/Article.php:225). De Akprijs wordt per klantcategorie ingeladen vanuit de artikeltabel — de DAO kiest het juiste kolom-postfix op basis van de klantcategorie (CustomerCat, veld Customer::Klantcat) van de ingelogde klant (_core/model/dbclasses/atx/articles/ArticleDAO.php:329–384).

Prijslijsten (Pricelist)

Naast de klantspecifieke Akprijs kan een artikel meerdere Pricelist-rijen hebben (_core/model/classes/atx/articles/Pricelist.php), elk met:

Veld Betekenis
Nummer Prijslijstnummer; speciale waarden: EXPORT_PRICE = -2, GARAGE_PRICE = -4
StandardVK Standaard verkoopprijs
AktionVK Actieprijs
AktionVon / AktionBis Geldigheidsperiode actieprijs

Het EXPORT_PRICE en GARAGE_PRICE zijn vaste businessnummers die bepaalde klantgroepen aanspreken (Pricelist.php:12–13).

Mini-shop marges bovenop de prijs

Wanneer een artikel via een mini-shop wordt getoond, past CustomerMarginCalculator de basisprijs aan met de marge van de klant-eigenaar. Zie Mini-shops voor de calculatielogica.

Zichtbaarheidsregels voor SEO-teksten per kanaal

De criteria-records (TyreSearch / WheelSearch / AccSearch) bevatten doelgroepvlaggen op AbstractArticleSearch (_core/model/classes/atx/articles/AbstractArticleSearch.php:23–25):

Vlag Betekenis
hideForMiniShop SEO-tekst tonen aan mini-shop-bezoekers (isShowForMiniShop() = !hideForMiniShop)
hideForMiniShopBeerens SEO-tekst tonen aan bezoekers van de Beerens-mini-shop
hideForNotLoggedIn SEO-tekst tonen aan ingelogde gebruikers

Deze vlaggen bepalen niet of een artikel zichtbaar is in de zoekresultaten. Ze sturen uitsluitend welke doelgroep de bijbehorende SEO-tekst te zien krijgt op de artikeldetailpagina. Als geen van de drie vlaggen actief is, wordt de tekst aan iedereen getoond (ArticleDetailView::_renderAccSeoText()/:_renderWheelSeoText()/:_renderTyreSeoText(), ArticleDetailView.php:3174–3188).

Categorie-voertuigkoppeling

ArticleCategory heeft een collectie vehicleCategories van het type ArticleCategoryVehicle, waarmee een productcategorie aan een of meer voertuigcategorieën gekoppeld kan worden (_core/model/classes/atx/articles/ArticleCategory.php:75). Hierdoor weet het systeem welke producttypen relevant zijn voor welk voertuigtype.

Diagram

flowchart TD
    AC[ArticleCategory\nACCESSORY / TYRE / WHEEL / KIT / SERVICE] --> A[Article\nArtcat veld]
    A --> T[Tyre\nTyreType: Season, Oldtimer, Runflat…]
    A --> W[Wheel\nBreedte, Inch, Gaten…]
    A --> ACC[Acc\nAccType…]
    A --> PL[Pricelist\nStandardVK / AktionVK\nNummer = prijslijstnummer]
    A --> AK[Akprijs\nper klantcategorie-kolom]
    PL -->|mini-shop| CM[CustomerMarginCalculator\nmarge + toeslag]

    T -->|TyreFilterService\nmatching| TS[TyreSearch\ncriteria-record]
    W -->|WheelFilterService\nmatching| WS[WheelSearch\ncriteria-record]
    ACC -->|AccFilterService\nmatching| AS[AccSearch\ncriteria-record]
    TS --> ST[TyreSeoText\nDescriptionNl/Fr/En/Du + Icon]
    WS --> SW[WheelSeoText\nDescriptionNl/Fr/En/Du + Icon]
    AS --> SA[AccSeoText\nDescriptionNl/Fr/En/Du + Icon]
    ST & SW & SA -->|ArticleDetailView\n:3154 / :3194 / :3234| DP[Artikeldetailpagina\nSEO-tekst blok]

Zie ook