Den "Punkte-Paket"-Produkttyp registrieren: etc/product_types.xml
Den "Punkte-Paket"-Produkttyp registrieren: etc/product_types.xml
~5 Min. Lesezeit Zuletzt aktualisiert am 9. August 2026
Kapitel 71 hat die Entscheidung begründet, Kapitel 73-76 bauen die eigentliche Logik - dieses Kapitel dazwischen erledigt die reine Registrierung: die eine Deklaration, die Magento überhaupt erst wissen lässt, dass der Typ-Code loyalty_points_package existiert.
product_types.xml als Configuration Type
etc/product_types.xml ist technisch selbst ein Beispiel für das, was Kapitel 88 (Block 11) allgemein als Configuration Type einführt: eine modulübergreifend gemergte, einmal eingelesene und danach gecachte XML-Struktur - kein Datenbank-Wert wie bei System/Config/Setting (Kapitel 7). Für dieses Kapitel heißt das praktisch vor allem eines: Änderungen an dieser Datei brauchen einen expliziten Cache-Leerlauf, dazu gleich mehr.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="loyalty_points_package"
label="Punkte-Paket"
modelInstance="Mironsoft\Loyalty\Model\Product\Type\PointsPackage"
indexPriceModel="Magento\Catalog\Model\ResourceModel\Product\Indexer\Price\DefaultPrice"
priceModel="Mironsoft\Loyalty\Model\Product\Type\PointsPackage\Price"
isQty="true"
canUseQtyDecimals="false"
sortOrder="110"/>
</config>
Die Attribute im Detail
name- der Typ-Code selbst, ab hier die KonstantePointsPackage::TYPE_CODE(Kapitel 73) wert für wert identisch mit diesem String.modelInstance- die Type-Model-Klasse, die Kapitel 73 als Nächstes implementiert; ohne sie bricht jede Aktion mit diesem Typ-Code sofort mit einer Exception ab.priceModel- die für Preisberechnung zuständige Klasse, ebenfalls Kapitel 73.indexPriceModel- bewusst dieselbe Standard-Klasse wie beisimple/virtual(DefaultPrice), da ein Punkte-Paket keine tier- oder konfigurationsabhängige Preislogik braucht, die einen eigenen Preis-Indexer rechtfertigen würde - relevant für Kapitel 77.isQty- Mengenfeld im Warenkorb sichtbar ("3 Punkte-Pakete kaufen"), wie beisimple/virtual.canUseQtyDecimals- bewusstfalse: eine gebrochene Menge "1,5 Punkte-Pakete" ergibt kein sinnvolles Business-Konzept.sortOrder-110, bewusst deutlich oberhalb der Core-Typen (simple= 10,virtual= 20 u. Ä.), damit "Punkte-Paket" im "Neues Produkt"-Dropdown erkennbar am Ende der Liste steht statt sich zwischen die Core-Typen zu schieben.
Achtung: Nach jeder Änderung an product_types.xml ist bin/cache-clean config Pflicht (derselbe config-Cache-Tag, den auch etc/config.xml-Änderungen aus Kapitel 62 brauchen) - ohne Cache-Leerung bleibt der neue Typ im Admin schlicht unsichtbar. In production-Mode kommt zusätzlich bin/magento setup:di:compile hinzu, da die generierte Interception- und Objektmanager-Konfiguration den neuen Typ-Code sonst nicht kennt.
Noch nicht funktionsfähig
Mit dieser einen Datei taucht "Punkte-Paket" bereits im "Neues Produkt"-Dropdown auf - ein Klick darauf endet aber sofort in einer PHP-Exception, weil Mironsoft\Loyalty\Model\Product\Type\PointsPackage und ...\PointsPackage\Price noch nicht existieren. Genau diese beiden Klassen liefert Kapitel 73.