Naar de inhoud
SyncMyShop

Systemen

Pimcore koppeling met je webshop: productdata uit Pimcore in je shop

Een Pimcore koppeling haalt producten, vertalingen en afbeeldingen uit Pimcore en zet ze in je webshop, en voert artikelnummers en EAN-codes uit je ERP aan Pimcore. Pimcore heeft geen vast datamodel: elke installatie heeft eigen klassen en velden, en de Datahub geeft alleen vrij wat je in het schema zet.

Wat is Pimcore en wie gebruikt het?

Pimcore is een platform voor productinformatie, digitale bestanden en content. Het draait als PHP-applicatie op je eigen server of bij je implementatiepartner. Er zijn drie soorten elementen: Data Objects (producten, categorieën, merken), Assets (afbeeldingen, pdf's, video's) en Documents (pagina's). Fabrikanten en groothandels met een breed assortiment en meerdere talen gebruiken het als centrale bron voor productdata.

Voor een koppeling verschilt Pimcore op één punt van een PIM met een vast model: er is geen standaardklasse Product. De implementatiepartner tekent de klassen en velden zelf. De ene installatie heeft een veld ean, de andere gtin13 in een classification store. Wat in de API beschikbaar is, volgt uit die inrichting.

De licentie is de Pimcore Open Core License (POCL). Die geeft gratis productiegebruik aan organisaties met een wereldwijde omzet tot € 5 miljoen per jaar, inclusief het concern waar ze bij horen. Daarboven is een commerciële licentie nodig. Een aantal bundels die voor koppelingen relevant zijn, valt alleen onder het enterprise-abonnement:

Bundel Wat hij doet Licentie volgens Pimcore
Datahub, GraphQL lezen en schrijven via een geconfigureerd endpoint Open Core
Data Importer CSV, JSON, XML, XLSX en SQL inlezen Open Core
Datahub Simple REST alleen lezen, vanuit een OpenSearch- of Elasticsearch-index enterprise
Datahub Webhooks bericht bij toevoegen, wijzigen of verwijderen enterprise

Wat je met Pimcore koppelt

Pimcore is leidend voor wat een product is: naam, omschrijving, kenmerken, vertalingen en beelden. Het ERP is leidend voor het artikelnummer, de prijs en de voorraad. De webshop toont het resultaat.

Stroom Richting Mechanisme in Pimcore
Artikelnummers, EAN, basisgegevens ERP naar Pimcore Data Importer, bron SFTP, HTTP of push
Productteksten en kenmerken Pimcore naar webshop Datahub GraphQL, get<Klasse>Listing
Vertalingen Pimcore naar webshop localized fields, argument defaultLanguage
Afbeeldingen en documenten Pimcore naar webshop Assets met thumbnail-configuratie
Categorieën Pimcore naar webshop relaties tussen Data Objects
Productstatus Pimcore naar webshop veld published

De Data Importer leest CSV, JSON, XML, XLSX en de uitkomst van een SQL-query, uit zes soorten bronnen: een asset, een upload, HTTP, SFTP, een push-endpoint en SQL. Hij heeft een deltacontrole die ongewijzigde records overslaat en een opruimstap voor objecten die uit de bron verdwenen zijn. Die opruimstap staat het best uit tot vaststaat wat een ontbrekende regel betekent: uit het assortiment, of alleen niet in de export van vandaag. Hoe productdata in het algemeen tussen systemen loopt, staat op productdata koppelen.

Hoe Pimcore data vrijgeeft

Datahub met een GraphQL-endpoint

De standaardroute naar buiten is de Datahub. Per afnemer maak je een configuratie met een eigen endpoint: /pimcore-graphql-webservices/{configuratienaam}. De configuratie bepaalt drie dingen:

  • Schema. Per klasse kies je welke velden beschikbaar zijn. Een veld dat niet in het schema staat, bestaat voor de koppeling niet. De documentatie noemt dat nog niet alle datatypen worden ondersteund.
  • Workspaces. Per map in de objectboom zet je lezen, aanmaken, wijzigen en verwijderen aan. Zonder workspace is niets leesbaar.
  • Mutaties. Aanmaken, wijzigen en verwijderen staan per klasse aan of uit. Een verwijdering via het endpoint is definitief.

De koppeling meldt zich met een API-sleutel die in de configuratie wordt gegenereerd. De sleutel kan als header X-API-Key mee of als queryparameter apikey. Wij gebruiken de header, zodat de sleutel niet in de toegangslogs van een webserver of proxy terechtkomt.

Pagina's, filters en talen

Een lijst vraag je op met first (het aantal) en after (de offset). Een filter gebruikt de JSON-syntax van Pimcore. De taal kies je per query met defaultLanguage, of per veld:

{
  getProductListing(first: 100, after: 200, defaultLanguage: "nl") {
    totalCount
    edges {
      node {
        id
        modificationDate
        artikelnummer
        naam
        naamDe: naam(language: "de")
      }
    }
  }
}

artikelnummer en naam zijn velden van deze installatie; bij een andere installatie heten ze anders. De Datahub documenteert geen eigen rate limit. Pimcore draait op je eigen server, dus de grens is de server: geheugen, het aantal PHP-processen en de databank. Een query die per product ook relaties, vertalingen en assets ophaalt, kost veel meer dan een platte lijst.

De rekensom voor een catalogus van 20.000 producten:

Ronde Rekensom Query's
Eerste vulling, pagina's van 100 20.000 / 100 200
Delta, 340 gewijzigde producten 340 / 100, naar boven afgerond 4
Delta elk kwartier, een dag lang 4 x 4 x 24 384
Productdata van ERP via Pimcore naar de webshop Het ERP levert artikelnummers en EAN als CSV aan de Data Importer van Pimcore. De koppeling leest gewijzigde producten uit het Datahub GraphQL-endpoint in pagina's van 100 en schrijft producten, vertalingen en media naar de webshop. Een webhook van Pimcore met versionOnly true wordt genegeerd. ERP artikelnummer, EAN Pimcore Data Objects, Assets Koppeling ronde per kwartier Webshop producten en media Concept opgeslagen versionOnly: true CSV via SFTP getProductListing first: 100 titel, media webhook genegeerd De koppeling vraagt alleen producten op met een modificationDate na de vorige ronde. 20.000 producten bij de eerste vulling zijn 200 pagina's van 100.
De route van artikeldata naar de webshop: ERP naar Pimcore met de Data Importer, Pimcore naar de webshop via het Datahub-endpoint.

Webhooks en Simple REST: enterprise

De Datahub Webhooks sturen bij elk toevoegen, wijzigen of verwijderen een bericht: POST, PUT of DELETE. Het bericht bevat het veld versionOnly. Staat dat op true, dan is alleen een conceptversie opgeslagen en niet het object zelf. Een koppeling die daar niet op let, zet een half bewerkte productomschrijving in de webshop. Wij negeren die berichten.

De Simple REST API leest uit een OpenSearch- of Elasticsearch-index in plaats van de databank. Dat ontlast de server, maar een wijziging is pas zichtbaar als de index is bijgewerkt. De API is alleen-lezen.

Waar het bij Pimcore op vastloopt

Wat er misgaat Oorzaak in Pimcore Wat de koppeling doet
Leeg veld in de webshop, geen foutmelding Gekoppeld object buiten de workspace; standaard wordt het null Workspaces vooraf testen tegen een lijst verwachte relaties
Duitse shop toont Engelse tekst Ontbrekende vertaling valt terug op de fallbacktaal Per taal controleren of de waarde echt bestaat
Variant niet bijgewerkt na wijziging op het hoofdproduct Geërfde waarde staat niet op de variant zelf Bij een gewijzigd hoofdproduct alle varianten opnieuw lezen
Concepttekst live Webhook met versionOnly: true Alleen gepubliceerde versies verwerken
Query faalt na een wijziging in een klasse Veld hernoemd of niet in het schema Melding in de monitoring, mapping aanpassen

Relaties die stil verdwijnen

Verwijst een product naar een merk, een categorie of een asset buiten de workspaces van de configuratie, dan maakt de Datahub die relatie standaard null (not_allowed_policy: 2). De query slaagt, het veld is leeg. In de webshop staat dan een product zonder merk. Met waarde 1 faalt de hele query in zo'n geval. Wij leggen per relatie vast wat er verwacht wordt en melden een leeg veld dat gevuld had moeten zijn.

Overerving en varianten

Pimcore kan waarden laten erven: is een veld op een object leeg, dan neemt Pimcore de waarde van het dichtstbijzijnde bovenliggende object van dezelfde klasse. Varianten werken op die manier, als verborgen kinderen van het hoofdproduct. Een wijziging van het materiaal op het hoofdproduct verandert dus wat elke variant toont, terwijl de variant zelf niet is opgeslagen. Een ronde die alleen op de wijzigingsdatum van varianten filtert, ziet zo'n wijziging niet. Hoe varianten in de webshop landen staat op varianten.

Talen met een fallback

Localized fields kunnen terugvallen op een andere taal. Is Engels de fallback voor Duits en ontbreekt de Duitse naam, dan geeft Pimcore de Engelse. De webshop krijgt een gevulde Duitse titel die in het Engels is. De koppeling vraagt de taal per veld op en vergelijkt, of de fallback gaat in de configuratie uit. Een product zonder eigen vertaling gaat dan niet naar die taal van de shop. Meer over velden die niet een op een passen staat in wat is veldmapping.

Platformen die we aan Pimcore koppelen

De koppeling wordt gebouwd op jouw klassen en jouw webshop. Wat elk platform aan de ontvangende kant vraagt, staat op de pagina van dat platform:

Werk je met een ander PIM, zie dan Akeneo koppeling, inRiver koppeling of Salsify koppeling. Het overzicht van alle stromen staat op koppelingen.

Wij bouwen de koppeling voor een vaste prijs, en hosten, draaien en bewaken hem daarna voor een vast bedrag per maand. Voor de livegang draait hij als dry run: je ziet per product welke titel, kenmerken en beelden er in de webshop zouden komen, zonder dat er iets wijzigt. Vertel welke klassen en welke webshop je hebt, dan hoor je welke velden in de Datahub moeten en wat een volledige ronde kost.

Veelgestelde vragen

Heb ik een enterprise-abonnement van Pimcore nodig voor een koppeling?

Niet per se. De Datahub met het GraphQL-endpoint en de Data Importer vallen onder de Pimcore Open Core License. De Simple REST API en de Datahub Webhooks zijn volgens de documentatie enterprise-bundels. Zonder webhooks vraagt de koppeling op een vast interval op wat er gewijzigd is. Dat werkt, alleen met de vertraging van het interval.

Moet onze Pimcore-partner iets inrichten voordat de koppeling kan starten?

Ja. Iemand met beheerrechten maakt een Datahub-configuratie aan, kiest per klasse welke velden in het schema komen, genereert een API-sleutel en kiest de workspaces. Zonder workspace is niets leesbaar, dus dit gebeurt voordat de koppeling de eerste producten kan lezen.

Kunnen prijzen en voorraad ook via Pimcore lopen?

Technisch wel, want een klasse kan elk veld hebben. In de meeste landschappen blijft het ERP leidend voor prijs en voorraad en gaan die rechtstreeks naar de webshop. Een voorraadgetal dat eerst via een import in Pimcore landt en daarna via een ronde naar de shop gaat, loopt twee intervallen achter. Zie voorraad en beschikbaarheid.

Hoe gaan afbeeldingen uit Pimcore naar de webshop?

Een afbeelding is in Pimcore een Asset. Het GraphQL-endpoint geeft het pad terug, ook voor een thumbnail met fullpath(thumbnail: "..."), en de koppeling haalt het bestand op en uploadt het naar de webshop. Zo bepaalt Pimcore de uitsnede en het formaat, en de webshop krijgt een vast bestand in plaats van een link naar je Pimcore-server.

Wat als ons datamodel in Pimcore verandert?

Een nieuw veld in een klasse komt pas in het endpoint als het aan het schema van de Datahub-configuratie is toegevoegd. Een hernoemd veld verdwijnt uit het schema en de query van de koppeling geeft dan een fout. Wij zien die fout in de monitoring en passen de mapping aan. Spreek met je Pimcore-partner af dat wijzigingen in klassen vooraf gemeld worden.

Vertel wat je nodig hebt

Vertel welke systemen je gebruikt en wat je wilt verbeteren. Je krijgt binnen één werkdag een persoonlijk antwoord. We helpen je de werkzaamheden helder te krijgen en spreken de prijs en planning af voordat je iets toezegt.

  • Je weet de prijs en de doorlooptijd voordat je iets toezegt
  • Wij zoeken uit welke koppeling het werk uit handen neemt
  • Wij verzorgen de bouw, hosting, bewaking en het onderhoud
  • Je team krijgt minder overtypwerk en minder uitzoekwerk

Leveranciers, producten, orders per dag, een ruwe schatting is prima.

Of mail direct: carsten@syncmyshop.com