Como obter o primeiro item da coleção de produtos

23

Na categoria view.phtml, se eu obtiver a categoria e, em seguida, obter uma coleção de produtos, como posso obter o primeiro produto da coleção atribuída a $ _product para uso no código? Aqui está o que eu tenho:

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

Tentei usar o foreach, mas continuava recebendo erros.

danny
fonte
2
$_product = $_collection->getFirstItem()
Pzirkind
1
@pzirkind colocar isso answer.please não colocá-lo comentar
Amit Bera
1
Eu tentei isso, mas recebendo erro - inválido método Mage_Catalog_Block_Category_View :: canEmailToFriend (Array))
danny
1
@heisenberg que significa que você está tentando chamar uma função que não existe, de qualquer forma, é um erro diferente (não está conectado à sua pergunta original), atualize sua pergunta com o novo código ou inicie um novo
pzirkind
@danny Se você encontrou uma resposta aqui, aceite marcar esta pergunta como resolvida.
Sv3n

Respostas:

25

Para obter o primeiro item de uma coleção, basta usar a getFirstItem()função na coleção.

Exemplo:

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

Exemplo 2 (para esta pergunta em particular):

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

Algumas outras áreas podem ser usadas:

clientes

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

Encomendas

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

Observe:

Não é uma boa ideia carregar TODOS os produtos / clientes / pedidos para isso, requer muitos recursos. A maneira preferida é limitar o que você deseja carregar usando as funções addAttributeToFilter()ou addFieldToFilter(), veja o exemplo abaixo:

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

O pzirkind está totalmente correto, apenas imaginando que ninguém se preocupa com o desempenho. Se você deseja SOMENTE o primeiro / último item de uma coleção, sempre limite sua consulta a 1:

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

Apenas o uso getFirstItem()ainda carrega toda a coleção e, depois disso, atrapalha o primeiro item.


Exemplo : categoria com 750 produtos

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

Apenas getFirstItem():

  • Total Incl. Tempo de parede (microsseguro): 2.318.497 microssegundos
  • Total Incl. CPU (microssegundos): 2.000.604 microssegundos
  • Total Incl. MemUse (bytes): 7.729.776 bytes
  • Total Incl. PeakMemUse (bytes): 7,977,672 bytes
  • Número de chamadas de função: 96.957

Adicionando getSelect()->limit(1):

  • Total Incl. Tempo de parede (microseg): 424.955 microssegundos
  • Total Incl. CPU (microssegundos): 380.326 microssegundos
  • Total Incl. MemUse (bytes): 4.043.728 bytes
  • Total Incl. PeakMemUse (bytes): 3.976.000 bytes
  • Número de chamadas de função: 15.249
sv3n
fonte
2
Isso é ideal, pois abrange duas soluções, fornece tempos de execução e explica os benefícios de desempenho +1
BENN1TH
3
var_dump($_collection->getFirstItem()->getData());
echo $_collection->getFirstItem()->getName();

Também como obter o último item:

echo $_collection->getLastItem()->getName();
var_dump($_collection->getLastItem()->getData()); 
TBI Infotech
fonte
2

@pZirKind está certo, você pode obter o primeiro item da coleção de produtos usando os métodos nativos da classe Varien Collection, como:

$_category  = $this->getCurrentCategory();

$_collection = $_category->getProductCollection();

$_product = $_collection->getFirstItem()
sandip.vaghasiya
fonte
0
$Collection = Mage::getResourceModel('catalog/products_collection');
$firstItem = $Collection->getFirstItem(); 
Sheshgiri Anvekar
fonte
0

Tente isso por favor

    $_category  = $this->getCurrentCategory();        
    $_collection = $_category->getProductCollection();        
    $_items = $_productCollection->getItems(); 
   if($_items){  
    $_items[0]->getShortName();
    $_items[0]->getProductUrl();
   }
Vivacity InfoTech Unip. Ltd.
fonte