Jak zdobyć pierwszy przedmiot z kolekcji produktów

23

W kategorii view.phtml, jeśli otrzymam kategorię, a następnie kolekcję produktów, jak mogę uzyskać pierwszy produkt z kolekcji przypisanej do $ _product do użycia w kodzie? Oto co mam:

$_category   = $this->getCurrentCategory();
$_collection = $_category->getProductCollection();
$_product    = 
$_resource   = $_product->getResource();

Próbowałem używać foreach, ale ciągle pojawiały się błędy.

Danny
źródło
2
$_product = $_collection->getFirstItem()
pzirkind
1
@pzirkind umieścił tę odpowiedź. proszę nie komentować
Amit Bera
1
Próbowałem tego, ale pojawia się błąd - niepoprawna metoda Mage_Catalog_Block_Category_View :: canEmailToFriend (Array))
danny
1
@heisenberg, że meand próbujesz wywołać funkcję, która nie jest exixt, tak czy inaczej, to inny błąd (niezwiązany z pierwotnym pytaniem), albo zaktualizuj swoje pytanie nowym kodem, albo uruchom nowy
pzirkind
@ Danny, jeśli znalazłeś tutaj odpowiedź, zaakceptuj to pytanie jako rozwiązane.
sv3n

Odpowiedzi:

25

Aby uzyskać pierwszy element w kolekcji, wystarczy użyć getFirstItem()funkcji w kolekcji.

Przykład:

// this gets all the products
$productCollection = Mage::getResourceModel('catalog/products_collection');
// this line gets just the first product
$firstItem = $productCollection->getFirstItem(); 

Przykład 2 (dla tego konkretnego pytania):

$_category  = $this->getCurrentCategory();
$_collection = $_category->getProductCollection();
$_product =  $_collection->getFirstItem(); // this will get first item in collection

Niektóre inne obszary mogą być wykorzystane:

Klienci

$customerCollection = Mage::getResourceModel('customer/customer_collection');
$firstCustomer = $customerCollection->getFirstItem();

Święcenia

$orderCollection = Mage::getResourceModel('sales/order_collection');
$firstOrder = $orderCollection->getFirstItem();

Proszę zanotować:

Załadowanie WSZYSTKICH produktów / klientów / zamówień nie jest dobrym pomysłem, ponieważ wymaga to wielu zasobów. Preferowanym sposobem jest ograniczenie tego, co chcesz załadować za pomocą funkcji addAttributeToFilter()lub addFieldToFilter(), patrz przykład poniżej:

$productCollection = Mage::getResourceModel('catalog/product_collection')
                           ->addAttributeToFilter('sku', 'book123`);
pzirkind
źródło
5

pzirkind ma całkowitą rację, tylko zastanawia się, że nikt nie dba o wydajność. Jeśli chcesz TYLKO pierwszego / ostatniego elementu kolekcji, zawsze powinieneś ograniczyć zapytanie do 1:

$collection->getSelect()->limit(1);

Samo użycie getFirstItem()nadal ładuje całą kolekcję, a następnie obejmuje pierwszy przedmiot.


Przykład : kategoria z 750 produktami

$category = Mage::getModel('catalog/category')->load(41);
$collection = $category->getProductCollection();
# $collection->getSelect()->limit(1);
var_dump($collection->getSelect()->__toString());
var_dump($collection->getFirstItem()->getData());

Po prostu getFirstItem():

  • Razem z Czas ścienny (mikrosekund): 2 318 497 mikrosekund
  • Razem z Procesor (mikrosekundy): 2000604 mikrosekund
  • Razem z MemUse (bajty): 7 729 776 bajtów
  • Razem z PeakMemUse (bytes): 7977672 bajtów
  • Liczba wywołań funkcji: 96 957

Dodawanie getSelect()->limit(1):

  • Razem z Czas ścienny (mikrosekund): 424,955 mikrosekund
  • Razem z Procesor (mikrosekundy): 380,326 mikrosekund
  • Razem z MemUse (bajty): 40433,728 bajtów
  • Razem z PeakMemUse (bajty): 3 976 000 bajtów
  • Liczba wywołań funkcji: 15,249
sv3n
źródło
2
Jest to idealne rozwiązanie, ponieważ obejmuje dwa rozwiązania i zapewnia czas realizacji dostaw oraz wyjaśnia korzyści dla wydajności +1
BENN1TH
3
var_dump($_collection->getFirstItem()->getData());
echo $_collection->getFirstItem()->getName();

Jak zdobyć ostatni przedmiot:

echo $_collection->getLastItem()->getName();
var_dump($_collection->getLastItem()->getData()); 
TBI Infotech
źródło
2

@pZirKind ma rację, możesz uzyskać pierwszy przedmiot z kolekcji produktów przy użyciu natywnych metod klasy Varien Collection, takich jak:

$_category  = $this->getCurrentCategory();

$_collection = $_category->getProductCollection();

$_product = $_collection->getFirstItem()
sandip.vaghasiya
źródło
0
$Collection = Mage::getResourceModel('catalog/products_collection');
$firstItem = $Collection->getFirstItem(); 
Sheshgiri Anvekar
źródło
0

Spróbuj tego proszę

    $_category  = $this->getCurrentCategory();        
    $_collection = $_category->getProductCollection();        
    $_items = $_productCollection->getItems(); 
   if($_items){  
    $_items[0]->getShortName();
    $_items[0]->getProductUrl();
   }
Vivacity InfoTech Pvt. Sp. z o.o.
źródło