Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

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.

app/code/Mironsoft/Loyalty/etc/product_types.xml
<?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 Konstante PointsPackage::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 bei simple/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 bei simple/virtual.
  • canUseQtyDecimals - bewusst false: 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.