Die erste Sammlung posten, ohne zu brechen pager
Ich habe eine Frage zu diesem früheren, aber ich habe Sie jetzt weitere Informationen an und ich dachte, es am besten posten Sie eine neue ein, anstatt ändern (sorry, wenn das nicht die richtige Protokoll). Finden Sie meine ursprüngliche Frage hier.
Jedenfalls, das erste problem war, dass ich wollte, zu inspizieren, um das erste Element in einer Sammlung in der List.php Klasse nur nach der Einstellung der Sammlung, so dass ich könnte kratzen, die Kategorie und Bewertungen anzeigen. Das war alles, basierend auf einem benutzerdefinierten Modul, so gab es eine Menge von Variablen. Ich habe seitdem versucht es auf eine Standard-Magento-sample-store und nur Hinzugefügt EINE Linie zu app/code/core/Mage/catalog/Block/Product/List.php
zu brechen, den pager. Hier sind die details. Wenn Sie irgendwelche Ideen, warum dies geschieht, bitte lassen Sie mich wissen, wie ich bin stecken
Öffnen Sie zunächst app/code/core/Mage/catalog/Block/Product/List.php
und suchen Sie die _getProductCollection
Funktion. Am Ende der if (is_null...)
block, fügen Sie $_foo123 = $this->_productCollection->getFirstItem();
so haben Sie eine Funktion, die wie folgt aussieht:
protected function _getProductCollection()
{
if (is_null($this->_productCollection)) {
$layer = $this->getLayer();
/* @var $layer Mage_Catalog_Model_Layer */
if ($this->getShowRootCategory()) {
$this->setCategoryId(Mage::app()->getStore()->getRootCategoryId());
}
//if this is a product view page
if (Mage::registry('product')) {
//get collection of categories this product is associated with
$categories = Mage::registry('product')->getCategoryCollection()
->setPage(1, 1)
->load();
//if the product is associated with any category
if ($categories->count()) {
//show products from this category
$this->setCategoryId(current($categories->getIterator()));
}
}
$origCategory = null;
if ($this->getCategoryId()) {
$category = Mage::getModel('catalog/category')->load($this->getCategoryId());
if ($category->getId()) {
$origCategory = $layer->getCurrentCategory();
$layer->setCurrentCategory($category);
}
}
$this->_productCollection = $layer->getProductCollection();
$this->prepareSortableFieldsByCategory($layer->getCurrentCategory());
if ($origCategory) {
$layer->setCurrentCategory($origCategory);
}
//THIS LINE BREAKS THE PAGER
$_foo123 = $this->_productCollection->getFirstItem();
}
return $this->_productCollection;
}
Nun, gehen Sie einfach zu einem Produkt-Liste, das die Klasse verwendet (Kategorie Ansicht, zum Beispiel) und du wirst sehen was ich meine. Egal was Sie wählen, unter Zeigen, XX pro Seite in der Symbolleiste, es wird immer zeigen Sie alle Elemente in der Liste. Wenn Sie kommentieren, dass $_foo123...
Zeile, funktioniert es einwandfrei.
Was gibt??
P. S. ich weiß, ich bin eigentlich nicht zum Bearbeiten von core-Dateien...dies ist nur ein Beispiel 🙂
InformationsquelleAutor BrianVPS | 2011-06-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Grund ist, weil, wenn Sie anrufen
getFirstItem()
(oder einfach über jeden anderen retrieval-Methode) auf eine Kollektion, die Sammlung ist geladen. Jede nachfolgende operation ignoriert die Datenbank und verwendet nur die Daten geladen, die Filter haben keine Wirkung, da Sie SQL nur, dito für die Paginierung und ausgewählte Spalten. Die Problemumgehung ist die Verwendung einer zweiten Sammlung basierend auf den ersten.Den
clear()
Methode entlädt Sie die Daten für die Sammlung, zwingen es, auf die Datenbank zuzugreifen nächsten mal wieder.clear()
Zeile bevor diegetFirstItem()
nennen? Scheint counter-intuitive...Ich habe absichtlich
clear()
vor der zweiten Sammlung wird verwendet, wenn die erste Kollektion war bereits geladen. Dieclone
Klone alles.Ist es nicht besser, zu Klonen Sammlung vollständig geladen - wenn es hat alle Elemente? Dann müssen Sie nicht haben, um es zu deaktivieren - man-Klon vollständige Sammlung und auf-Klon rufen Sie
getFirstItem()
Was ist, wenn
getFirstItem()
ist nicht das einzige, was Sie tun möchten, ist mit der Sammlung? Möglicherweise gibt es weitere Filter hinzufügen, oder einige paging. Das würde sich ändern, die Bedeutung von dem Element 'first'. Auch von nicht-clearing-Sie verwenden die gleichen Instanzen der Modelle, so dass, wenn eines verändert wird, dann die andere Sammlung der Daten auch geändert, was als 'Nebenwirkung'. Es ist besser, code defensiv und vermeiden Sie solche Probleme.InformationsquelleAutor clockworkgeek