Installatie
Vereisten
Magento 2.4.x — getest op 2.4.9, compatibel met eerdere 2.4.*-versies. PHP 8.1–8.5. Compatibel met zowel het standaard Luma-thema als het Hyvä-thema.
Setupstappen
- Voeg de per e-mail ontvangen gegevens toe aan
auth.jsonin de root van je Magento-project:{ "http-basic": { "repo.codingrow.com": { "username": "...", "password": "..." } } } composer config repositories.codingrow composer https://repo.codingrow.comcomposer require codingrow/module-mmisbin/magento module:enable Codingrow_Mmisbin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush- Plak de licentiesleutel in Admin → Stores → Configuration → Codingrow Extensions → MMIS → License → License Key, sla op en voer daarna
bin/magento cache:flushuit.
De volledige beheerinterface — elk label, elke tooltip en handleiding — is beschikbaar in 7 talen, automatisch geselecteerd per beheerder:
Admin-configuratie
De profieloverstijgende gedeelde instellingen staan in Stores → Configuration → Codingrow Extensions → MMIS (Global Settings): module aan/uit, menuzichtbaarheid, gedeelde afbeeldingswachtrij/watchdog. Elk importprofiel heeft eigen tabbladen Instellingen / Mapping / Meldingen / Log in de MMIS-profielenlijst.
Deïnstallatie
composer remove codingrow/module-mmis, daarna
bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush.
Al geïmporteerde producten worden nooit automatisch aangeraakt — gebruik eerst de
rollback-tool als je ze ook wilt verwijderen.
Gebruikershandleiding
Importprofielen
Elke leverancier/feed waaruit je importeert is een eigen Profiel: eigen feed, eigen mapping, eigen planning, eigen instellingen — volledig onafhankelijk van elk ander profiel. Je kunt net zoveel profielen tegelijk uitvoeren als je leveranciers hebt, parallel, op dezelfde catalogus, en elk profiel raakt alleen de producten aan die het zelf heeft aangemaakt (nooit een product dat handmatig door een medewerker is aangemaakt, zelfs niet als het hetzelfde SKU-voorvoegsel deelt).
Feedbron en -formaat
Een profiel leest zijn feed uit één van drie bronnen:
| Bron | Wat je instelt |
|---|---|
| URL (standaard) | Een directe HTTP/HTTPS-link. Ondersteunt transparant gecomprimeerde .zip-feeds (herkend aan de bestandshandtekening, niet aan de extensie). |
| Magento-bestandssysteem | Een pad binnen de Magento-installatie (bijv. var/import/feed.csv) — handig als de leverancier bestanden via SFTP plaatst in een map die jij beheert. |
| FTP-server | Host + gebruiker + wachtwoord (versleuteld opgeslagen) — de module maakt zelf verbinding en downloadt het bestand. |
Er worden drie feedformaten ondersteund: CSV (instelbaar scheidingsteken: komma, puntkomma of tab), XML (je geeft aan welk herhaald element een product vertegenwoordigt) en JSON (array van objecten).
https://codingrow.com/sample-feed.csvOpenAPI:
https://codingrow.com/sample-api.openapi.yamlKolommapping
Zes velden zijn altijd verplicht (Productnaam, Prijs, Hoeveelheid/Voorraad, Gewicht, EAN, Merk) — elk heeft zijn eigen rij met bronkolom, standaardwaarde en transformatie. Naast deze zes kun je zoveel vrije mappingregels toevoegen als je wilt, naar elk willekeurig echt Magento-attribuut (niet alleen een vaste lijst met historische velden) — inclusief je eigen aangepaste attributen.
prezzo_base
voor de prijs en peso_kg voor het gewicht: koppel "Prijs" → bronkolom
prezzo_base, "Gewicht" → bronkolom peso_kg. De naam van de
kolom is nooit van belang, alleen naar welke kolom elke rij verwijst.
Transformaties en tekstfuncties
Elke mappingregel heeft een type "Transformatie":
| Transformatie | Wat het doet |
|---|---|
| Geen | Directe kopie van de waarde van de bronkolom. |
| Statische waarde | Negeert de bronkolom, gebruikt altijd de vaste tekst die is ingevoerd in "Waarde". |
| Teksttemplate | Vrije tekst met plaatshouder {NomeColonna} — zie de functies hieronder. |
| Zoeken en vervangen | Hoofdletterongevoelige zoekopdracht in de waarde van de bronkolom, vervangen door jouw tekst (precies zoals ingevoerd). |
| Strip HTML tags | Verwijdert HTML-markup en decodeert entiteiten uit de waarde van de bronkolom. Alleen voor tekstattributen. |
| Wiskundige formule | Een op zichzelf staande expressie — zie Wiskundige formules hieronder. |
Binnen een Teksttemplate zijn er, naast de eenvoudige plaatshouder
{NomeColonna}, acht functies beschikbaar (alleen voor tekstvelden):
| Functie | Effect | Voorbeeld |
|---|---|---|
ucase{Colonna} | ALLES IN HOOFDLETTERS | ucase{Marca} → "ACME" |
lcase{Colonna} | alles in kleine letters | lcase{Marca} → "acme" |
proper{Colonna} | Hoofdletter Aan Het Begin Van Elk Woord | proper{nome} → "barra rossa" → "Barra Rossa" |
trim{Colonna} | Verwijdert spaties aan begin/einde | — |
left{Colonna,N} | Eerste N tekens | left{SKU,5} |
val{Colonna} | Normaliseert een getal in Europees formaat ("1.234,56") naar het standaardformaat ("1234.56"), zonder decimalen af te ronden | — |
replace{Colonna,'zoeken','nieuw'} | Zoekt/vervangt alleen binnen die waarde (hoofdletterongevoelig), te gebruiken binnen een groter template | replace{nome,'Rif.','Riferimento'} |
striphtml{Colonna} | Verwijdert HTML-markup en decodeert entiteiten uit die waarde, te gebruiken binnen een groter template | striphtml{omschrijving} |
{ucase{Marca}} - {proper{nome}}
op een rij waar Marca="acme" en nome="barra rossa" is, produceert "ACME -
Barra Rossa". Een verkeerd gespelde functienaam blijft ongewijzigd zichtbaar in
de output in plaats van stilletjes te verdwijnen, zodat een tikfout altijd opvalt.
Wiskundige formules
Alleen voor numerieke velden (Prijs, Gewicht, Hoeveelheid, of een aangepast numeriek
attribuut): een op zichzelf staande expressie met plaatshouder {NomeColonna},
de vier basisoperatoren (+ - * /) en haakjes — verder niets (geen functies,
geen vergelijkingen). Het resultaat wordt altijd afgerond op maximaal 2 decimalen.
{Prezzo B2B} * 1.30
past een marge van 30% toe op de groothandelsprijs van de leverancier.
({prezzo} + {costo_spedizione}) / 1.22 telt de verzendkosten op en trekt
vervolgens 22% btw af om een nettoprijs te krijgen.
Tekstvervanging over meerdere velden
Een zoek-en-vervangregel die tegelijk op meerdere ruwe feedkolommen kan werken, uitgevoerd nog vóórdat de mapping begint. Een kolom aan de bron opschonen werkt door naar elke mappingregel die deze leest — in plaats van dezelfde correctie apart op elk afgeleid veld te herhalen.
Importfilters (Groepen/Regels)
Elke feedregel doorloopt drie filters, altijd in deze volgorde — een volgend filter ziet alleen de rijen die het vorige filter hebben overleefd:
- Toegestane feedcategorieën — altijd als eerste. Een categorie die niet in de lijst staat, verwerpt de rij hier al, nog vóór een Groep wordt overwogen.
- Groepen/Regels — optioneel. Als er geen Groep is ingesteld, gaat elke rij die stap 1 heeft overleefd ongewijzigd door. Zodra er minstens één Groep bestaat, gaan alleen de rijen door die door een Groep zijn opgevangen — rijen die door geen enkele Groep worden opgevangen, worden verworpen (anders dan "geen filter").
- Doelcategorie van de Groep — indien ingesteld binnen de Groep die de rij heeft opgevangen, vervangt deze het volledige categoriepad; indien leeg gelaten, wordt het categoriepad van de feed zoals het is gebruikt.
Categorieën
De categorieboom wordt automatisch aangemaakt op basis van het categoriepad van elk product in de feed — categorieën hoeven niet vooraf in Magento te worden aangemaakt. Met de instelling "Bovenliggende categorie" kun je de volledige categorieboom van een profiel onder een gedeelde root nesten, handig wanneer meerdere profielen dezelfde catalogus delen en je hun categoriebomen visueel gescheiden wilt houden. Categorieën die leeg blijven (bijv. nadat een leverancier een hele productlijn stopt) worden met één klik of via CLI opgeschoond.
Afbeeldingengalerij
Koppel een willekeurig aantal feedkolommen aan de afbeeldingsrollen (base / small / thumbnail / gallery) — één kolom kan tegelijk meerdere rollen vervullen. Gedownloade afbeeldingen worden optioneel gecomprimeerd (verkleind als ze breder zijn dan 1200px, opnieuw gecomprimeerd naar JPEG-kwaliteit 85, alleen behouden als het resultaat daadwerkelijk lichter is) met instelbare gelijktijdigheid en een schijfruimte-watchdog die de downloads — nooit de productgegevens — pauzeert als de vrije ruimte schaars wordt.
Configurable producten (varianten)
Feedrijen die dezelfde waarde delen in een "groep/hoofdkolom" worden varianten van één configurable product. Een willekeurig aantal attributen kan tegelijk variëren — bijvoorbeeld maat, kleur en een derde attribuut samen — elk heeft slechts zijn eigen mappingregel nodig met een kolom die voor elke variant een andere waarde geeft.
Grouped producten
Conceptueel anders dan configurable: geen variantattribuut, geen groepskolom — alleen een directe koppeling tussen een "container"-hoofdproduct en een willekeurig aantal simpele producten die volledig onafhankelijk blijven (eigen prijs, voorraad en navigeerbare pagina), handig wanneer een leverancier zowel de losse onderdelen apart verkoopt als een kit die ze samen toont met een aantalkiezer voor elk onderdeel.
Voorraadbeheer
Voorraadupdates kunnen absoluut zijn (vervangen de waarde) of relatief (tellen op/trekken af van de huidige hoeveelheid) — handig voor leveranciers wier feed mutaties in plaats van totalen rapporteert. Backorders en "voorraad beheren" volgen de configuratie van het profiel, niet één enkele globale instelling.
Preview en outputbestand
Twee manieren om te zien wat een sync daadwerkelijk naar de catalogus zou schrijven — alleen de gemapte velden, nooit de categorie-/verkoopbaarheids-/Groepsfilters (het voorbeeld is bewust gedeeltelijk):
| Preview | Weerspiegelt de huidige waarden van het formulier, ook niet-opgeslagen — klik erop terwijl je bewerkt om direct het effect te zien, zonder het profiel aan te raken. |
|---|---|
| Outputbestand downloaden | Gebruikt de laatst opgeslagen configuratie en genereert een downloadbaar JSON-bestand. |
Planning en meldingen
Elk profiel heeft zijn eigen cronplanning (van elke 15 minuten tot eenmaal per dag, of een aangepaste cron-expressie), zowel voor de volledige catalogussync als voor een lichtere sync die alleen voorraad/prijzen betreft. E-mailmeldingen (succes/waarschuwing/kritieke fout) worden per profiel geconfigureerd, zodat verschillende leveranciers verschillend waarschuwingsbeleid kunnen hebben binnen dezelfde webshop.
Levenscyclus van het product: niets verdwijnt onverwacht
Een product dat uit de feed verdwijnt, of door een filter wordt uitgesloten, wordt altijd eerst uitgeschakeld — nooit verwijderd — en schakelt zichzelf automatisch weer in als het in een volgende sync opnieuw verschijnt. Definitief verwijderen is een aparte, optionele instelling (standaard uitgeschakeld): pas een product dat langer dan een instelbaar aantal dagen uitgeschakeld is gebleven, wordt daadwerkelijk verwijderd, en alleen dan.
CLI-commando's
Elke actie is ook beschikbaar vanaf de commandoregel (handig voor cron, of voor een eerste zeer grote import via SSH): een profielsync uitvoeren, de configuratie van een profiel exporteren/importeren, alles wat een profiel ooit heeft geïmporteerd terugdraaien, verweesde categorieën opschonen en meer — elk met een dry-run-preview als standaard waar het destructief is.