MMISDocumentatie

MMIS-documentatie

Installatiestappen en een volledig overzicht van elk veld en elke functie in de beheeromgeving, met concrete voorbeelden — hetzelfde detailniveau dat we gebruiken om klanten te ondersteunen.

Weergeven als Markdown

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

  1. Voeg de per e-mail ontvangen gegevens toe aan auth.json in de root van je Magento-project:
    { "http-basic": { "repo.codingrow.com": { "username": "...", "password": "..." } } }
  2. composer config repositories.codingrow composer https://repo.codingrow.com
  3. composer require codingrow/module-mmis
  4. bin/magento module:enable Codingrow_Mmis
  5. bin/magento setup:upgrade && bin/magento setup:di:compile && bin/magento cache:flush
  6. Plak de licentiesleutel in Admin → Stores → Configuration → Codingrow Extensions → MMIS → License → License Key, sla op en voer daarna bin/magento cache:flush uit.

De volledige beheerinterface — elk label, elke tooltip en handleiding — is beschikbaar in 7 talen, automatisch geselecteerd per beheerder:

Italiano English Español Français Deutsch Português Nederlands

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.

MMIS global settings admin configuration in Magento

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:

BronWat je instelt
URL (standaard)Een directe HTTP/HTTPS-link. Ondersteunt transparant gecomprimeerde .zip-feeds (herkend aan de bestandshandtekening, niet aan de extensie).
Magento-bestandssysteemEen 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-serverHost + 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).

MMIS uitproberen voordat je een echte leveranciersfeed koppelt? Wijs de feed-URL van een profiel naar onze permanente voorbeeld-CSV-feed (12 voorbeeldproducten, Engels) — een veilig openbaar test-endpoint:
https://codingrow.com/sample-feed.csv
OpenAPI: https://codingrow.com/sample-api.openapi.yaml

Kolommapping

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.

Voorbeeld — een leveranciersfeed heeft een kolom 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.
MMIS profile Mapping tab: SKU and category columns, required attribute rows, image gallery columns, and the discovered feed columns available as placeholders

Transformaties en tekstfuncties

Elke mappingregel heeft een type "Transformatie":

TransformatieWat het doet
GeenDirecte kopie van de waarde van de bronkolom.
Statische waardeNegeert de bronkolom, gebruikt altijd de vaste tekst die is ingevoerd in "Waarde".
TeksttemplateVrije tekst met plaatshouder {NomeColonna} — zie de functies hieronder.
Zoeken en vervangenHoofdletterongevoelige zoekopdracht in de waarde van de bronkolom, vervangen door jouw tekst (precies zoals ingevoerd).
Strip HTML tagsVerwijdert HTML-markup en decodeert entiteiten uit de waarde van de bronkolom. Alleen voor tekstattributen.
Wiskundige formuleEen op zichzelf staande expressie — zie Wiskundige formules hieronder.

Binnen een Teksttemplate zijn er, naast de eenvoudige plaatshouder {NomeColonna}, acht functies beschikbaar (alleen voor tekstvelden):

FunctieEffectVoorbeeld
ucase{Colonna}ALLES IN HOOFDLETTERSucase{Marca} → "ACME"
lcase{Colonna}alles in kleine letterslcase{Marca} → "acme"
proper{Colonna}Hoofdletter Aan Het Begin Van Elk Woordproper{nome} → "barra rossa" → "Barra Rossa"
trim{Colonna}Verwijdert spaties aan begin/einde
left{Colonna,N}Eerste N tekensleft{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 templatereplace{nome,'Rif.','Riferimento'}
striphtml{Colonna}Verwijdert HTML-markup en decodeert entiteiten uit die waarde, te gebruiken binnen een groter templatestriphtml{omschrijving}
Gecombineerd voorbeeld — het template {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.

Voorbeeld — "Prijs" met formule {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.

Voorbeeld — kolommen "Titolo_prodotto, Descrizione_HTML" (twee velden tegelijk), zoek "CODICEFORNITORE ", vervang door niets → verwijdert in één keer een leveranciersvoorvoegsel uit beide ruwe kolommen, zodat "Productnaam" en "Beschrijving", als ze uit die kolommen worden gemapt, al schoon binnenkomen.

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:

  1. 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.
  2. 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").
  3. 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.
Voorbeeld — toegestane categorieën = "Huis en Tuin, Sportartikelen"; een Groep "Alleen stoelen" met regel "naam bevat stoel" en doelcategorie "Meubels/Stoelen". Een rij "Bureaustoel" in de feedcategorie "Huis en Tuin > Stoelen" komt door stap 1, wordt opgevangen bij stap 2 en komt terecht onder "Default Category/Meubels/Stoelen" — niet onder "Huis en Tuin/Stoelen" zoals de feed alleen zou suggereren.
Let op: zodra er een Groep bestaat, worden artikelen die door geen enkele Regel worden opgevangen volledig verworpen. Om toch "de rest" te importeren, voeg je een tweede Groep toe, met een lagere prioriteit, met een regel die de resterende rijen generiek opvangt.

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.

Praktijkvoorbeeld — een productlijn "Bocht 90°" die varieert in graden (90°/45°), buismaat (10/20/30/40) en materiaal (koper/tdm): koppel alle drie de feedkolommen aan de bijbehorende Magento-attributen, selecteer alle drie bij "Variantattributen", en het hoofdproduct toont drie onafhankelijke keuzelijsten op zijn pagina — end-to-end getest met 16 gelijktijdige variantcombinaties.
Let op: het variantattribuut moet al in Magento bestaan als een echt Dropdown-attribuut, met scope "Per website" (niet Globaal — een globaal attribuut kan nooit tussen varianten verschillen, een native Magento-vereiste), en toegewezen zijn aan de attribuutset van het product. Bundle-producten worden niet ondersteund.

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.

Voorbeeld — "Boorset"-kit bestaande uit 3 artikelen die ook los worden verkocht: op de onderliggende rijen (boormachine, accu, oplader) koppel je "Grouped: hoofd-SKU" aan een kolom met waarde "KIT-BOORMACHINE"; op de rij die de kit zelf voorstelt, koppel je "Grouped: onderliggende SKU's" (puur beschrijvend) om deze als container te markeren. Resultaat: een pagina "Boorset" die alle drie de onderdelen toont met hun eigen aantalkiezers, en elk onderdeel heeft nog steeds zijn eigen individuele productpagina.

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):

PreviewWeerspiegelt 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 downloadenGebruikt 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.