Come ottenere il primo articolo dalla collezione di prodotti


23

Nella categoria view.phtml se ottengo la categoria e quindi ottengo una raccolta di prodotti, come posso ottenere il primo prodotto dalla raccolta assegnato a $ _product per l'uso nel codice? Ecco cosa ho:

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

Ho provato a usare foreach ma ho continuato a ricevere errori.


2
$_product = $_collection->getFirstItem()
pzirkind,

1
@pzirkind metti questa answer.per favore, non lasciare un commento
Amit Bera

1
Ho provato questo ma ho ricevuto un errore - Metodo non valido Mage_Catalog_Block_Category_View :: canEmailToFriend (Array))
danny

1
@heisenberg significa che stai provando a chiamare una funzione che non si esaurisce, in entrambi i casi, è un errore diverso (non collegato alla tua domanda originale), o aggiorna la tua domanda con il nuovo codice o
avviane

@danny se hai trovato una risposta qui, accetta di contrassegnare questa domanda come risolta.
sv3n,

Risposte:


25

Per ottenere il primo elemento in una raccolta è sufficiente utilizzare la getFirstItem()funzione sulla raccolta.

Esempio:

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

Esempio 2 (per questa domanda particolare):

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

Alcune altre aree possono essere utilizzate:

Clienti

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

Ordini

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

Notare che:

Non è una buona idea caricare TUTTI i prodotti / clienti / ordini per questo richiede molte risorse. Il modo preferito è limitare ciò che si desidera caricare utilizzando le funzioni addAttributeToFilter()o addFieldToFilter(), vedere l'esempio seguente:

$productCollection = Mage::getResourceModel('catalog/product_collection')
                           ->addAttributeToFilter('sku', 'book123`);

5

pzirkind è totalmente corretto, chiedendosi solo che nessuno si preoccupi delle prestazioni. Se si desidera SOLO il primo / ultimo elemento di una raccolta, è necessario limitare sempre la query a 1:

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

Il solo utilizzo getFirstItem()caricherà comunque l'intera raccolta e successivamente afferrerà il primo elemento.


Esempio : categoria con 750 prodotti

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

Solo getFirstItem():

  • Totale incl. Wall Time (microsec): 2.318.497 microsec
  • Totale incl. CPU (microsec): 2.000.604 microsec
  • Totale incl. MemUse (byte): 7,729,776 byte
  • Totale incl. PeakMemUse (byte): 7.977.672 byte
  • Numero di chiamate di funzione: 96.957

Aggiunta getSelect()->limit(1):

  • Totale incl. Wall Time (microsec): 424.955 microsec
  • Totale incl. CPU (microsec): 380.326 microsec
  • Totale incl. MemUse (byte): 4.043.728 byte
  • Totale incl. PeakMemUse (byte): 3.976.000 byte
  • Numero di chiamate di funzione: 15.249

2
Questo è l'ideale in quanto copre due soluzioni e fornisce tempi di esecuzione e spiega i vantaggi in termini di prestazioni +1
BENN1TH

3
var_dump($_collection->getFirstItem()->getData());
echo $_collection->getFirstItem()->getName();

Inoltre come ottenere l'ultimo articolo:

echo $_collection->getLastItem()->getName();
var_dump($_collection->getLastItem()->getData()); 

2

@pZirKind ha ragione: puoi ottenere il primo articolo dalla collezione di prodotti usando i metodi nativi della classe Varien Collection come:

$_category  = $this->getCurrentCategory();

$_collection = $_category->getProductCollection();

$_product = $_collection->getFirstItem()

0
$Collection = Mage::getResourceModel('catalog/products_collection');
$firstItem = $Collection->getFirstItem(); 

0

Prova questo per favore

    $_category  = $this->getCurrentCategory();        
    $_collection = $_category->getProductCollection();        
    $_items = $_productCollection->getItems(); 
   if($_items){  
    $_items[0]->getShortName();
    $_items[0]->getProductUrl();
   }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.