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 loadByAttribute
mé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 getSku
méthode n'existe pas, Magento a des méthodes de setter et getter magiques qui garantissent qu'un get
appel 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 loadByAttribute
méthode retourne false
si 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!
$product
dans votre exemple est une instance deMage_Catalog_Model_Product
, qui est un «modèle» dans le langage Magento.