A propos du modèle de collection et du modèle de ressource

29

Je suis un peu confus quant à l'utilisation du modèle de ressource et du modèle de collection. Parfois, lorsque je vois des exemples de chargement de produits à l'aide d'attributs spécifiques, dans certains exemples, ils utilisent un modèle de collection et parfois ils utilisent un modèle de ressource.

Aussi quand puis-je utiliser une méthode spécifique get...et set...avec le nom de la ligne du tableau? Comme getName, getId. J'ai essayé d'utiliser mais je n'ai pas pu obtenir les valeurs et cela montre une erreur: "appel d'une méthode non définie dans l'objet"

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

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

Il montre "méthode indéfinie getSku()"

Si j'utilise var_dump($product), le SKU s'affiche dans l'objet, mais il est impossible d'obtenir le SKU en utilisant getSku()...

MagentoBoy
la source
Pour être clair - $productdans votre exemple est une instance de Mage_Catalog_Model_Product, qui est un «modèle» dans le langage Magento.
benmarks
Oui bien. mais je ne sais pas quand utiliser le modèle de collection et le modèle de ressources et quelles méthodes sont disponibles. Comme je le vois, les modèles de collection sont disponibles dans Modèle >> dossier de collection du module et les ressources sont disponibles dans le modèle de ressources, mais quand et quel modèle devez utiliser, donc je suis un peu confus à ce sujet
MagentoBoy
Je sais, nous devons utiliser les méthodes disponibles qui sont disponibles dans la collection et les externalisations aussi. Mais j'ai du mal à trouver pour utiliser le bon modèle. Et je aussi je ne suis pas en mesure d'obtenir le résultat de l'ensemble de résultats en utilisant les méthodes "Get" signifie getName () en utilisant le nom de ligne de la table de base de données. Il montre une méthode non définie dans l'objet signifie que j'accède au mauvais modèle ou à la mauvaise méthode que je dois utiliser, donc je ne suis pas d'accord sur ce que je dois utiliser.
MagentoBoy
1
Merci d'avoir posé cette question ..
Je

Réponses:

63

Les modèles CRUD de Magento ont trois types de classes de base.

Un «modèle» est ce que vous utiliserez le plus souvent. Cela représente des données d'un type particulier d'une manière indépendante de la base de données (produit, catégorie, page CMS, revue, etc.)

Un «modèle de ressource» est une classe qui, en coulisse, procède à l'extraction réelle des données de Magento. Chaque modèle possède un modèle de ressource utilisé pour charger une seule instance d'un modèle à partir de la base de données.

Une "collection" est une classe qui charge une structure de type tableau de plusieurs modèles en fonction d'un ensemble de règles. Considérez-le comme un SQL WHERE clause.

Dans les coulisses, Magento considère également une collection comme un modèle de ressource. Il existe donc des modèles de ressources de collection et des modèles de ressources individuels .

De manière générale, lorsque vous souhaitez charger un élément spécifique, vous utilisez un modèle . Lorsque vous souhaitez charger un certain nombre d'éléments, vous utilisez un modèle de ressource de collection .

//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());
}

Une chose à garder à l'esprit lors du chargement via un modèle de ressource de collection est que la afterLoad méthode de chaque modèle individuel ne sera pas appelée automatiquement, ce qui signifie que certaines données peuvent ne pas être chargées.

Les classes de modèles de ressources individuelles ne sont généralement pas accessibles directement. Cependant, un modèle spécifique aura parfois un modèle de ressource avec une méthode utile. Vous les découvrirez au fil du temps en utilisant le système.

Enfin, il y a encore une distinction à faire. Les modèles CRUD réguliers de Magento ont une syntaxe spéciale pour le chargement via quelque chose qui n'est pas l'ID numérique. Par exemple, voici comment charger un modèle de page CMS par titre

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

Cependant, quelques modèles Magento sont des modèles EAV. Cela signifie "valeur d'attribut d'entité" et est une façon élégante de dire que ces modèles n'ont pas un ensemble fixe de champs. Cela inclut les modèles de produit et les modèles de catégorie. Cette fonctionnalité vous permet de choisir différents attributs pour différents types de produits. Chaque champ d'un modèle EAV est appelé attribut. La syntaxe ci-dessus ne fonctionnera pas avec ces modèles, mais vous devez utiliser la loadByAttributeméthode.

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

Concernant votre problème spécifique, si vous obtenez une erreur avec le texte spécifique "méthode non définie", alors quelque chose ne va pas avec votre système. Même si la getSkuméthode n'existe pas, Magento a des méthodes de setter et getter magiques qui garantissent qu'un getappel sur n'importe quel modèle retournera toujours quelque chose, même s'il est nul.

Ce qui est plus probable, c'est que vous obtenez une erreur comme la suivante

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

Cette erreur se produit car la loadByAttributeméthode retourne falsesi elle ne peut pas charger l'objet.

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

Essayez quelque chose comme ça dans votre code.

$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");
}

En plus du conditionnel, notez la getData()méthode. Cela renverra un tableau de toutes les données de l'objet sous forme de tableau.

J'espère que cela suffit pour vous faire bouger. Bonne chance!

Alan Storm
la source
@Alan .. Très belle description ... J'ai lu beaucoup de vos messages sur Magento :) .. Je suis tellement heureux après avoir vu votre réponse à mon message. Je vais aller de l'avant avec vos informations. Si je reçois un problème, j'espère que j'obtiendrai un bon soutien de cette communauté. Comme je suis nouveau dans magento ainsi que dans la programmation, ma sélection n'est peut-être pas tellement conceptuelle mais je veux quand même apprendre. J'aime vraiment beaucoup le framework magento :) .. Merci monsieur :)
MagentoBoy
Je suis désolé, j'ai une autre question. Si j'appelle $ product = Mage :: getModel ('catalog / product'); puis si j'appelle getName () et getSku (). puis-je obtenir les valeurs si j'itère le produit $ dans foreachloop ?? ou je dois appeler la méthode loadByAttribute () ??
MagentoBoy
@MagentoBoy Mes excuses, mais la barrière de la langue semble masquer votre question. Je ne sais pas trop ce que vous demandez.
Alan Storm
monsieur, je suis désolé. Dans l'excitation, je n'ai pas exprimé clairement ma question. Mais j'ai essayé et maintenant je suis en mesure d'obtenir les listes de produits et comme maintenant en mesure de récupérer correctement les produits en utilisant différents attributs. :) et oui ma question était, puis-je utiliser des méthodes get comme getName (), getPrice (), getSku (), sans appeler addAttributeToSelect ('*'), addAttributeToFilter () ou loadByAttribute (); par ex. $ product = Mage :: getModel ('catalogue / produit'); foreach ($ product as $ p) {echo $ p-> getName (). "". $ p-> getSku ();} ... Comme le modèle get instanciera la classe de produit, nous pourrons accéder aux méthodes d'accès get et set .
MagentoBoy
1
@ user8009 Ce message d'erreur peut se produire pour une multitude de raisons. Si vous ne pouvez pas obtenir d'accès FTP ou reproduire le problème dans une version locale / de développement du système, vous ne résoudrez jamais le problème.
Alan Storm