Koleksiyon Modeli ve Kaynak Modeli Hakkında


29

Kaynak modeli ve koleksiyon modelini kullanmak konusunda biraz kafam karıştı. Bazen belirli özellikleri kullanarak ürün yüklemek için örnekler gördüğümde, bazı örneklerde toplama modelini kullanıyorlar ve bazen kaynak modelini kullanıyorlar.

Ayrıca ne zaman get...ve belirli bir set...sıra ile tablo satır adını kullanabilirim? Gibi getName, getId. Kullanmaya çalıştım ama değerleri alamadım ve hata gösteriyor: "nesnede tanımsız yöntemi çağırmak"

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

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

"Tanımsız yöntem getSku()" i gösteriyor

Ben kullanırsanız var_dump($product)nesnesinde, SKU gösterileri Ancak yapamaz SKU kullanarak almak için getSku()...


Açık olmak $productgerekirse - örneğinizde, Mage_Catalog_Model_ProductMagento parlance'da bir "model" olan bir örnektir .
Benmarks

Evet doğru. ancak toplama modelini ve kaynakları modelini ne zaman kullanacağımı ve hangi yöntemleri kullanabileceğimi kafam karıştı. Ben toplama modelleri modülün Modeli >> koleksiyon klasöründe mevcuttur ve bu konuda biraz aklım karıştı bu yüzden kaynaklar hangi modeli ihtiyaç kullanmak kaynaklar modelinde Availble ama ne zaman ve Gördüğünüz gibi
MagentoBoy

Biliyorum, koleksiyon ve dış kaynak kullanımında da mevcut olan yöntemleri kullanmamız gerekiyor. Ancak doğru modeli kullanmakta zorluk çekiyorum. Ve ayrıca "Get" yöntemini kullanarak sonuç kümesinden sonuç elde edemiyorum, veritabanı tablosu satır adını kullanarak getName () anlamına gelir. Nesnede tanımlanmamış yöntemi gösterir, kullanmam gereken yanlış modele veya yönteme erişiyorum demektir, bu yüzden kullanmam gerekenleri doğrulamıyorum.
MagentoBoy

1
Bu soruyu sorduğun için teşekkür
ederim

Yanıtlar:


63

Magento'nun CRUD modelleri üç temel sınıf tipine sahiptir.

Bir "model", en sık kullanacağınız şeydir. Bu, veritabanı agnostik yolla belirli bir türdeki verileri temsil eder (ürün, kategori, CMS Sayfası, İnceleme, vb.)

Bir "kaynak modeli", sahne arkasında Magento'dan gerçek veri alımını yapan bir sınıftır. Her modelin bir sahiptir kaynak modelini bir tek bir örneğini yüklemek için kullanılır modeli veritabanından.

Bir "koleksiyon", bir dizi kurala dayanarak çoklu modellerin bir dizi benzeri yapısını yükleyen bir sınıftır. Bir SQL gibi düşünün WHERE clause.

Olayları bir şekilde karıştıran, sahne arkasındaki Magento, aynı zamanda bir kaynak model olarak bir koleksiyon olarak görüyor. Yani toplama kaynak modelleri ve bireysel kaynak modelleri var .

Genel olarak, belirli bir öğeyi yüklemek istediğinizde bir model kullanırsınız . Çok sayıda öğe yüklemek istediğinizde, bir koleksiyon kaynak modeli kullanırsınız .

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

Koleksiyon kaynak modeliyle yükleme hakkında akılda tutulması gereken bir nokta, her bir modelin afterLoad yönteminin otomatik olarak çağrılmaması, yani bazı verilerin yüklenemeyeceği anlamına gelir.

Individua kaynak modeli sınıfları genellikle doğrudan erişilebilir değildir. Ancak, zaman zaman belirli bir model üzerinde faydalı bir yöntemle bir kaynak modeline sahip olacaktır. Bunlar sistemi kullanarak zaman içinde keşfedeceksiniz.

Son olarak, yapılacak bir ayrım daha var. Magento'nun normal CRUD modelleri, sayısal kimliği olmayan bir şey üzerinden yüklemek için özel bir sözdizimine sahiptir. Örneğin, CMS sayfa modelini başlığa göre nasıl yükleyeceğiniz

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

Ancak, birkaç Magento modeli EAV modelleridir. Bu "varlık niteliği değeri" anlamına gelir ve bu modellerin sabit bir alan kümesi olmadığını söylemenin süslü bir yoludur. Buna ürün modelleri ve kategori modelleri de dahildir. Bu özellik, farklı ürün türleri için farklı özellikler seçmenize izin veren şeydir. Bir EAV modelindeki her alan bir özellik olarak bilinir. Yukarıdaki sözdizimi bu modellerle çalışmaz, bunun yerine loadByAttributeyöntemi kullanmanız gerekir .

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

Özel probleminizle ilgili olarak, "method undefined" metoduyla ilgili bir hata mesajı alıyorsanız, sisteminizde bir sorun var demektir. getSkuMetot olmasa bile , Magento sihirli ayarlayıcıya ve getherhangi bir modelde bir çağrının boş olsa bile her zaman bir şey döndürmesini sağlayan alıcı metodlarına sahiptir .

Daha olası olan, aşağıdaki gibi bir hatayla karşılaşıyor olmanızdır.

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

Bu hata, nesne yüklenemiyorsa loadByAttributeyöntem geri döndüğü için oluyor false.

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

Kodunuzda böyle bir şey deneyin.

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

Koşullu ek olarak, getData()metoda dikkat edin . Bu, tüm nesnenin verilerinin bir dizisini bir dizi olarak döndürür.

Umarım bu sizi harekete geçirmek için yeterlidir. İyi şanslar!


@Alan .. Çok güzel bir açıklama ... Magento'da yayınlarınızın çoğunu okudum :) .. Yazımın cevabını gördükten sonra çok mutluyum. Bilgilerinizle birlikte ilerleyeceğim. Eğer herhangi bir sorun yaşarsam, umarım bu topluluktan iyi destek alırım. Magento'da ve pogramming'de yeni olduğum için, benim önerim çok kavramsal olmayabilir ama yine de öğrenmek istiyorum. Ben gerçekten magento çerçevesini çok seviyorum :) .. Teşekkür ederim efendim :)
MagentoBoy

Üzgünüm, bir sorum daha var. Eğer $ product = Mage :: getModel ('katalog / ürün') diyorsam; ve sonra getName () ve getSku () işlevini çağırırsam. foreachloop'ta $ ürününü yinelersem değerleri alabilir miyim? veya loadByAttribute () yöntemini çağırmam gerekiyor mu?
MagentoBoy

@MagentoBoy Özür dilerim, ama dil engeli, sorunuzu gizliyor gibi görünüyor. Ne sorduğuna emin değilim.
Alan Storm,

efendim, özür dilerim Heyecan içinde sorumu açıkça ifade etmedim. Ancak denedim ve şimdi ürünlerin listesini alabiliyorum ve şimdi farklı özellikleri kullanarak ürünleri doğru bir şekilde alabiliyorum. :) ve evet sorum şuydu, getAdı (), getPrice (), getSku () gibi getName (), getAdributeToSelect ('*'), addAttributeToFilter () veya loadByAttribute () 'ı çağırmadan get metodlarını kullanabilir miyim? örneğin $ product = Mage :: getModel ('katalog / ürün'); foreach ($ p olarak $ ürün) {echo $ p-> getName (). "". $ p-> getSku ();} ... Get get modeli, ürün sınıfını örnekleyeceği için, get get set ve set metodlarına erişebiliriz. .
MagentoBoy

1
@ user8009 Bu hata mesajı sayısız sebeplerden dolayı olabilir. FTP erişimi alamıyorsanız veya sorunu sistemin yerel / geliştirme sürümünde yeniden oluşturamıyorsanız, sorunu asla çözemezsiniz.
Alan Storm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.