Dies ist eine Frage zu guten Programmierpraktiken in Magento.
Ich muss (in der Kategorie Produktliste) das Produkt mit den zugehörigen Produkten in Miniaturansichten anzeigen. Also habe ich so mypackage/mytheme/template/catalog/product/list.phtml
etwas bearbeitet
<?php
$related=$_product->getRelatedProductIds();
if(count($related)>0){
echo '<div class="a'.$ap.'"></div>';
echo '<div class="li_p"><ul>';
foreach($related as $rela){
$rela_nom=Mage::getModel('catalog/product')->load($rela);
echo '<li><a href="'.$rela_nom->getProductUrl().'"> <img src="'.$this->helper('catalog/image')->init($rela_nom, 'small_image')->resize(20).'" width="20" height="20"> </a><li>';
}
echo '</ul></div>';
}
?>
Und es funktioniert sehr gut.
Aber meine Frage ist: Ist dies richtig, um eine Modellklasse für die HTML-Dateien zu instanziieren?
Wenn nicht, wie lässt sich diese Funktionalität am besten erreichen? Ich meine, welche Datei ist besser zu bearbeiten oder welche Klasse ist besser hinzuzufügen, wo? Ein Helfer?
Können Sie mir ein kleines Beispiel geben oder einen Blick darauf werfen, welche Dateien besser zu bearbeiten sind?
quelle
Es ist nichts falsch daran, ein Modell in eine
phtml
Datei zu laden . Aber es hängt davon ab, warum Sie es tun.Wenn Sie das gesamte Modell und alle damit verbundenen Daten benötigen, können Sie auch das gesamte Modell laden.
Wenn Sie jedoch nur die Produkt-URL (aus Ihrem Beispiel) benötigen, können Sie einfach die richtige Sammlung laden
Wiederholen Sie dies nach Bedarf
quelle
Willst du meine 5 Cent hier setzen. Wir sollten Architekturprinzipien respektieren, die in Magento verwendet werden. Das wichtigste in Magento verwendete Architekturmuster ist MVC. Im Falle von Magento enthält "View" mehrere Dinge (Block, Vorlage, Layout). Es wurden Blöcke erstellt, um die Datenvorbereitungslogik von der Vorlage in eine andere Klasse zu verschieben, damit die Vorlagen für Frontend-Entwickler übersichtlicher und lesbarer werden. Hier möchte ich Fabian zustimmen.
Was Sonassis Bedenken in Bezug auf zu viele nicht benötigte Klassen betrifft, schlage ich vor, mich auf Push-basierte MVC zu freuen. In diesem Fall betrachten wir den Controller als Kommandeur, der definiert, welchen Block und welche Daten er haben soll. Die Aktion in der Steuerung kann den erforderlichen Code enthalten, um Daten zu laden und vor dem Rendern (über Magic Setter) zu blockieren.
quelle
Ich stimme Fabian Blechschmidt zu, dass es sich um eine schlechte Praxis handelt und Sie die Trennung von Bedenken respektieren sollten.
So fügen Sie einen konstruktiven Vorschlag hinzu:
Dafür sind die Block-Klassen gedacht. In Ihrem Fall müssten Sie neu schreiben
Mage_Catalog_Block_Product_List
, um die gewünschte Funktionalität hinzuzufügen:Es sollte offensichtlich sein, wie diese Methoden in der Vorlage verwendet werden.
Hinweis: Rewrite bedeutet nicht, die Kerndatei zu bearbeiten. Befolgen Sie das Tutorial zum Anpassen, wenn Sie nicht wissen, wie Sie einen Block umschreiben können.
quelle