Sobre o modelo de coleção e o modelo de recursos

29

Estou um pouco confuso sobre o uso de modelo de recurso e modelo de coleção. Às vezes, quando vejo exemplos de carregamento de produtos usando atributos específicos, em alguns exemplos, eles usam o modelo de coleção e, às vezes, o modelo de recursos.

Além disso, quando posso usar um método específico get...e o set...nome da linha da tabela? Como getName, getId. Eu tentei usar, mas não foi possível obter os valores e ele mostra o erro: "chamando método indefinido no objeto"

$product = Mage::getModel('catalog/product')
    ->loadByAttribute('name', 'product_name');

echo $product->getName(); 
echo $product->getSku();

Mostra "método indefinido getSku()"

Se eu usar var_dump($product), o SKU é exibido no objeto, mas não é possível obter o SKU usando getSku()...

MagentoBoy
fonte
Para ser claro - $productno seu exemplo é uma instância de Mage_Catalog_Model_Product, que é um "modelo" na linguagem Magento.
benmarks
Sim certo. mas estou confuso quando usar o modelo de coleção e o modelo de recursos e quais métodos estão disponíveis para uso. A meu ver modelos de recolha estão disponíveis no Modelo >> pasta de coleção do módulo e os recursos são availble no modelo de recursos, mas quando e quais necessidade modelo para usar assim que eu pouco confuso sobre isso
MagentoBoy
Eu sei, precisamos usar os métodos disponíveis que também estão disponíveis na coleção e na terceirização. Mas estou com dificuldades em encontrar o modelo correto. E também não sou capaz de obter o resultado do conjunto de resultados usando os métodos "Get" significa getName () usando o nome da linha da tabela do banco de dados. Ele mostra um método indefinido no objeto, significa que estou acessando o modelo ou método errado que eu preciso usar, por isso não estou certo sobre o que eu preciso usar.
MagentoBoy
1
Obrigado por perguntar isso question..I estava procurando resposta para esta pergunta muito tempo .. 1 ..
Elavarasan

Respostas:

63

Os modelos CRUD do Magento têm três tipos básicos de classe.

Um "modelo" é o que você mais usa. Isso representa dados de um tipo específico de uma maneira independente de banco de dados (produto, categoria, página CMS, revisão etc.)

Um "modelo de recursos" é uma classe que, nos bastidores, realiza a busca real de dados do Magento. Todo modelo possui um modelo de recurso usado para carregar uma única instância de um modelo do banco de dados.

Uma "coleção" é uma classe que carrega uma matriz, como a estrutura de vários modelos, com base em um conjunto de regras. Pense nisso como um SQL WHERE clause.

Confundir um pouco as coisas é que, nos bastidores, o Magento também considera uma coleção um modelo de recursos. Portanto, existem modelos de recursos de coleção e modelos de recursos individuais .

De um modo geral, quando você deseja carregar um item específico, você usa um modelo . Quando você deseja carregar vários itens, você usa um modelo de recurso de coleção .

//loads one
$product = Mage::getModel('catalog/product')->load($id);

//loads many products where price is greater than 100
$products = Mage::getModel('catalog/product')
->getCollection()
->addAttributeToSelect('*') //load all fields, see EAV below
->addAttributeToFilter('price', array('gt'=>'100'));

foreach($products as $product)
{
    var_dump($product->getSku());
}

Um aspecto a ser lembrado sobre o carregamento por meio de um modelo de recurso de coleção é que o afterLoad método de cada modelo individual não será chamado automaticamente, o que significa que alguns dados podem não ser carregados.

As classes do modelo de recurso individual geralmente não são acessadas diretamente. No entanto, ocasionalmente, um modelo específico terá um modelo de recurso com um método útil. Você descobrirá com o tempo usando o sistema.

Finalmente, há mais uma distinção a ser feita. Os modelos CRUD regulares do Magento têm uma sintaxe especial para carregar através de algo que não é o ID numérico. Por exemplo, veja como carregar um modelo de página do CMS por título

$page = Mage::getModel('cms/page')->load('Home page','title');
var_dump($page->getData());

No entanto, alguns modelos Magento são modelos EAV. Isso significa "valor do atributo da entidade" e é uma maneira elegante de dizer que esses modelos não têm um conjunto fixo de campos. Isso inclui modelos de produtos e modelos de categoria. Esse recurso é o que permite escolher diferentes atributos para diferentes tipos de produtos. Cada campo em um modelo EAV é conhecido como um atributo. A sintaxe acima não funcionará com esses modelos; você precisará usar o loadByAttributemétodo

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'n2610');

Em relação ao seu problema específico, se você estiver recebendo um erro com o texto específico "método indefinido", algo está muito errado com seu sistema. Mesmo que o getSkumétodo não exista, o Magento possui métodos de setter e getter mágicos que garantem que uma getchamada em qualquer modelo sempre retorne algo, mesmo que seja nulo.

O mais provável é que você esteja recebendo um erro como o seguinte

Call to a member function getSku() on a non-object

Este erro está ocorrendo porque o loadByAttributemétodo retorna falsese não puder carregar o objeto.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'this-is-not-a-sku');
var_dump($product); //prints false

Tente algo assim no seu código.

$product = Mage::getModel('catalog/product')->loadByAttribute('sku', 'sku-value');
if($product)
{
    var_dump($product->getName());
    var_dump($product->getSku());
    var_dump($product->getData());
}
else
{
    var_dump("Could not load product");
}

Além do condicional, observe o getData()método Isso retornará uma matriz de todos os dados do objeto como uma matriz.

Espero que isso seja suficiente para você se mexer. Boa sorte!

Alan Storm
fonte
@ Alan .. Descrição muito boa ... Eu li muitos dos seus posts no Magento :) .. Estou tão feliz depois de ver sua resposta ao meu post. Vou seguir em frente com suas informações. Se tiver algum problema, espero obter um bom suporte desta comunidade. Como eu inicio no magento e também na programação, minha opção pode não ser tão conceitual, mas ainda quero aprender. Eu realmente gosto magento estrutura de um monte :) .. Obrigado senhor :)
MagentoBoy
Sinto muito, tenho mais uma pergunta. Se eu chamar $ product = Mage :: getModel ('catalog / product'); e se eu chamar getName () e getSku (). eu sou capaz de obter os valores se eu iterar o produto $ no foreachloop? ou eu tenho que chamar o método loadByAttribute () ??
MagentoBoy
@ MagentoBoy Minhas desculpas, mas a barreira do idioma parece estar escondendo sua pergunta. Não tenho certeza do que você está perguntando.
Alan Storm
senhor, me desculpe. Empolgado, não expressei minha pergunta claramente. Mas tentei e agora sou capaz de obter as listas de produtos e, agora, buscar os produtos usando atributos diferentes corretamente. :) e sim, minha pergunta foi: posso usar métodos get, como getName (), getPrice (), getSku (), sem chamar addAttributeToSelect ('*'), addAttributeToFilter () ou loadByAttribute (); por ex. $ product = Mage :: getModel ('catálogo / produto'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Como o modelo get instancia a classe do produto, podemos acessar os métodos get e set de acesso .
MagentoBoy
1
@ user8009 Essa mensagem de erro pode ocorrer por vários motivos. Se você não conseguir acessar o FTP ou reproduzir o problema em uma versão local / de desenvolvimento do sistema, nunca resolverá o problema.
Alan Storm