Was ist der richtige Weg, um den benutzerdefinierten Optionscontainer zu überschreiben / zu ersetzen?

7

Hintergrund

Ich entwickle ein Modul, das einige benutzerdefinierte Entitäten erstellt, die die für ein bestimmtes Produkt verfügbaren Optionen in Beziehung setzen / beeinflussen. So funktioniert das:

Wenn ein Produkt geladen wird, wird eine Abfrage für meine benutzerdefinierten Entitäten unter Verwendung von zwei der Produktattribute ausgeführt.

Ich verwende das Ergebnis der Abfrage und präsentiere es in zwei Schritten wie folgt (die erste Auswahl des Kunden wirkt sich auf die verfügbaren Optionen für die zweite aus):

vorgesehene Schnittstelle

Die Herausforderung

Folgendes muss ich im Frontend erreichen:

1. Überschreiben Sie zwei Logikelemente in der Produktansicht.phtml:

--- Zuerst:

<form action="<?php echo $this->getSubmitUrl($_product) ?>" method="post" id="product_addtocart_form"<?php if($_product->getOptions()): ?> enctype="multipart/form-data"<?php endif; ?>>

... Sie werden feststellen, dass enctype="multipart/form-data"nur hinzugefügt $_product->getOptions()wird true, wenn dies der Fall ist , und meine Produkte werden sie tatsächlich nicht haben (dies würde also zurückkehren false).

--- Zweite:

 <?php if ($_product->isSaleable() && $this->hasOptions()):?>
    <?php echo $this->getChildChildHtml('container1', '', true, true) ?>
 <?php endif;?>

... auch, weil meine Produkte keine benutzerdefinierten Optionen haben, also $this->hasOptions()zurückkehren falseund das Rendern von container1 verhindern würden .

2. Ersetzen / überschreiben / überschreiben Sie 'container1' - den untergeordneten Block (ist es ein Block?), Der den HTML-Code für die benutzerdefinierten Optionen "enthält", wie hier gezeigt: was ersetzt werden muss

Ich habe einige Beiträge gelesen, in denen behauptet wird, dass das view.phtmldirekte Kopieren und Bearbeiten nicht der richtige Weg ist, aber was ist die Alternative?

Zweitens habe ich gelesen, dass ich entweder removeoder unSetdas container1Stück kann - welche Methode soll ich verwenden und wie ersetze ich dann meine eigene richtig container1?

Vielen Dank!

TriggerDan
quelle
Haben Sie dafür eine gute Lösung gefunden? Haben Sie sich angesehen, wie catalog.xmles mit den PRODUCT_TYPE_xxxxxxGriffen geht?
pspahn
Mir ist nicht klar, wie sich dies von einem konfigurierbaren Standardprodukt unterscheidet. Kannst du das erklären?
fantastischer
@fantasticrice Ich kann nicht für TriggerDan sprechen, aber in meinem Fall war keiner der Standard-Magento-Produkttypen ausreichend, um den Katalog meines Kunden zu modellieren.
pspahn
@pspahn - Inwiefern konnten sie nicht in Magento modelliert werden?
fantastischer
In meinem Fall brauchte ich (unter anderem) Preistabellen mit mehr als 4 Präzisionsstellen (denken Sie an die Preisgestaltung nach Quadratfuß).
pspahn

Antworten:

2

Ich arbeite seit einiger Zeit an einem ähnlichen Modul und bin auf fast dasselbe gestoßen. Ich habe einen benutzerdefinierten Produkttyp hinzugefügt, damit dies funktioniert.

Der Schlüssel ist der product_type_dataBlock. Auf diese Weise können Sie diesen Block überschreiben, ohne andere Vorlagendateien ändern zu müssen. In der Layout-XML-Datei meines Moduls habe ich hinzugefügt:

<PRODUCT_TYPE_myproduct translate="label" module="my_module">
    <reference name="content">
        <reference name="product.info">
            <block type="my_module/product_type_myproduct" name="product.info.myproduct" as="product_type_data" template="my_module/product/type/myproduct.phtml">

            </block>
        </reference>
    </reference>
</PRODUCT_TYPE_myproduct>

Von dort füge ich meine Formularfelder in die Vorlage ein. Die Werte werden an einen Beobachter des sales_quote_add_itemEreignisses übergeben, zu dem ich die Auswahl des Benutzers hinzufügen kann additional_options.

Mithilfe eines benutzerdefinierten Produkttyps können Sie außerdem Ihre eigene _prepareProduct()Methode verwenden, mit der Sie verschiedene Werte festlegen können, an die weitergeleitet wirdparent::_prepareProduct($buyRequest, $product, $processMode)

(Ich werde wahrscheinlich zurückkommen und dies später mit zusätzlichen Details ändern)

pspahn
quelle
2

Ich hoffe, ich bin nicht zu spät, um diese Frage zu beantworten. Sie benötigen benutzerdefinierte Optionen für das Produkt. Das Produkt enthält nur benutzerdefinierte Optionswerte, wenn diese catalog_product_optionvorhanden sind. Fügen Sie daher benutzerdefinierte Optionen im Backend mit einem benutzerdefinierten Feld hinzu, indem Sie diese in der Tabelle mit geringfügigen Änderungen in adminhtml hinzufügen.
Dies ist der einfachste Weg, um die Ausgabe zu erzielen. Andernfalls müssen Sie auch das Produkt-Rendering, den Warenkorb und den Bestellfluss bearbeiten.
Wenn Sie nun benutzerdefinierte Optionen mit einem zusätzlichen Feld benötigen, das Ihnen beim Filtern dieser benutzerdefinierten Option hilft, müssen Sie mehr Anpassungen vornehmen oder nicht im Frontend.
Schreiben Sie Ihren Code entsprechend diesem Feldwert in local/mage/catalog/Block/Productoder in. layout/view
Bitte lassen Sie mich wissen, ob Sie diesen Weg für geeignet halten. Ich werde die genauen Dateien und Änderungen herausfinden, falls dies noch erforderlich ist.

Aman Srivastava
quelle
Eine Antwort (wie spät es sein könnte) ist immer willkommen.
Julien Lachal
1

Um eine Vorlage in Magento zu überschreiben, können Sie zunächst entweder eine local.xml-Datei im Layoutordner erstellen und den Knoten überschreiben, der dem Abschnitt der Vorlage oder der Ansicht entspricht, die Sie überschreiben möchten. oder Ihre eigene Vorlage Ordner erstellen und außer Kraft setzen , dass das Layout und Template - Struktur von dort gibt es ein gutes Beispiel ist hier . Zweitens haben Sie versucht, konfigurierbare Produkte zu verwenden, um das zu tun, was Sie erreichen möchten, denn wie Sie es beschrieben haben, scheint es, dass konfigurierbare Produkte dies bereits tun

Goku
quelle