Wie in einem unserer Blogbeiträge schon erwähnt, gibt es einige Vorteile für mehrere Shops auch ein und die selbe Magento-Installation zu benutzen. Wenn ihr euch für diesen Weg entschieden habt, ist es sogar auf technischer Ebene easy möglich z.B. verschiedene Produktdaten pro Shop anzuzeigen. In diesem Türchen nochmal ganz einfach erklärt anhand eines Beispiels mit einem B2B und einem B2C Shop.
Die Ausgangslage
Wir haben ein ViewModel für die Verpackungseinheit (VPE) im B2C Shop eingebunden:
<!-- catalog_product_view.xml in einem Modul -->
<?xml version="1.0"?>
<page
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<body>
<referenceBlock name="product.info">
<!-- vpe.phtml mit ViewModel einbinden -->
<block name="product.vpe" template="Codex_Packaging::vpe.phtml">
<arguments>
<argument name="vpe_model">
Codex\Packaging\ViewModel\VpeModel
</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
Das eingebundene ViewModel ist relativ simpel aufgebaut und sieht so aus:
// Ausgangslage - ViewModel mit B2C Logik
<?php
namespace Codex\Packaging\ViewModel;
use Magento\Framework\View\Element\Block\ArgumentInterface;
class VpeModel implements ArgumentInterface
{
public function getUnits(): array
{
return ['Stück', 'Packung'];
}
}
Die Daten, die unser B2C ViewModel ausgibt und welches über unsere XML oben eingebunden wird, rufen wir im Template wie folgt ab:
// Ausgangslage - Daten abrufen
// view/frontend/templates/vpe.phtml
// ViewModel laden
<?php $vm = $block->getData('vpe_model'); ?>
<select name="vpe" id="vpe-select">
// Durch die Units iterieren und ausgeben
<?php foreach ($vm->getUnits() as $unit): ?>
<option value="<?= $unit ?>">
<?= $unit ?>
</option>
<?php endforeach; ?>
</select>
Anpassungen für den B2B-Shop
Bis hier hin war alles relativ einfach und kurz. Spoiler: Die nächsten Schritte werden es auch!
Als erstes passen wir die Daten-Logik an und erstellen dafür ein weiteres ViewModel für den B2B-Shop:
// Angepasstes ViewModel mit B2B Logik
<?php
namespace Codex\PackagingB2B\ViewModel;
use Magento\Framework\View\Element\Block\ArgumentInterface;
class VpeModel implements ArgumentInterface
{
public function getUnits(): array
{
// Gesonderte B2B Logik möglich
return ['VPE', 'Palette'];
}
}
Da wir hier jetzt eine ganz andere PHP-Klasse haben, die genutzt werden muss, tauschen wir das ViewModel in der passenden XML im B2B-Theme aus:
<!--
Wir überschreiben das ViewModel hier in der
catalog_product_view.xml in dem Theme für
die andere StoreView (B2B)
-->
<?xml version="1.0"?>
<page
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<body>
<referenceBlock name="product.vpe">
<arguments>
<!--
ViewModel mit dem
B2B-Model überschreiben
-->
<argument name="vpe_model">
Codex\PackagingB2B\ViewModel\VpeModel
</argument>
</arguments>
</referenceBlock>
</body>
</page>
Ihr denkt ein weiterer Schritt fehlt? Tatsächlich nicht! Das Template müssen wir weder überschreiben, noch anpassen. Die Funktionen im neuen ViewModel sollten natürlich gleich heißen, aber sonst müssen wir nichts weiter tun. Die Daten werden durch das andere Theme nun automatisch aus der anderen Quelle geladen.