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 |
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:
- Shopify koppeling
- WooCommerce koppeling
- Magento koppeling
- Shopware koppeling
- BigCommerce koppeling
- CCV Shop koppeling
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