Showing posts with label getModel(). Show all posts
Showing posts with label getModel(). Show all posts

Wednesday, March 28, 2012

마젠토 콜렉션(Collection) 사용하기

마젠토 콜렉션(Collection)은 한번에 여러개의 객체(product, customer, category 등등)를 불러오는데 사용됩니다.
예를들어 카테고리 페이지에있는 모든 제품을 불러온다던지, 모든 커스토머(customer) 정보를 불러올때 유용하게 쓰입니다.

아래와 같은 php코드를 루트에 올려놓고 시험해 보세요.
[ccln_php]
require_once "app/Mage.php";
Mage::app();

// 모든 제품 불러오기
$collection = Mage::getResourceModel('catalog/product_collection'); // 첫번째 방법
$collection = Mage::getModel('catalog/product')->getCollection(); // 두번째 방법

// 모든 제품이 필요하지는 않으므로 5개만 로드합니다.
$collection->getSelect()->limit(5);
$collection->load(); // 콜렉션을 불러옵니다.
foreach($collection AS $product) {
// 제품의 모든 데이터 출력
print_r($product->getData());
}
[/ccln_php]
위의 코드를 실행해 보시면 제품의 모든 데이터가 출력이 됩니다.
콜렉션 객체를 불러올때 두가지 방법을 보여드렸는데 첫번째 방법과 두번째 방법의 결과가 약간은 틀린걸 확인할수 있습니다.

첫번째 방법은 최소한의 데이터만 로드함으로써 메모리의 사용을 최대한 줄이는 방법이고,
$collection = Mage::getResourceModel('catalog/product_collection');

두번째 방법은 제품의 모든 데이터를 불러옴으로써 메모리 사용에 상관없이 콜렉션을 사용하는 방법입니다.
$collection = Mage::getModel('catalog/product')->getCollection();

개인적으로 메모리 사용이 적은 첫번째 방법을 선호합니다.
그렇다고 필요한 제품의 데이터를 불러오지 못하는것은 아닙니다.
아래와 같이 addAttributeToSelect()을 사용해서 필요한 Attribute을 불러올수 있습니다.
[ccln_php]
require_once "app/Mage.php";
Mage::app();

$collection = Mage::getResourceModel('catalog/product_collection');

// 아래처럼 원하는 attribute을 콜렉션에 포함시킬수 있습니다.
$collection->addAttributeToSelect('price');
$collection->addAttributeToSelect('weight');

// 모든 제품이 필요하지는 않으므로 5개만 로드합니다.
$collection->getSelect()->limit(5);
$collection->load(); // 콜렉션을 불러옵니다.
foreach($collection AS $product) {
// 제품의 모든 데이터 출력
print_r($product->getData());
}
[/ccln_php]


Attribute으로 불러올 데이터를 addAttributeToFilter()를 사용해서 걸러낼수도 있습니다.
예를들어 id가 10보다 커야 한다던지 sku가 'abcd'를 포함해야 하는경우 아래와 같이 콜렉션을 설정할수 있습니다.
[ccln_php]
require_once "app/Mage.php";
Mage::app();

$collection = Mage::getResourceModel('catalog/product_collection');

// 아래처럼 원하는 attribute을 콜렉션에 포함시킬수 있습니다.
// product entity_id가 10보다 커야하는경우
$collection->addAttributeToFilter('entity_id', array('gt' => 10));

// price가 $100 이하여야 하는 경우
$collection->addAttributeToFilter('price', array('lt' => 100));

// sku가 'abcd'를 포함해야 하는 경우
$collection->addAttributeToFilter('sku', array('like' => '%abcd%'));

// sku가 'zzz1'이 아니어야 하는 경우
$collection->addAttributeToFilter('sku', array('neq' => 'zzz1'));

// description이 아무것도 없는 제품을 포함하는 경우
$collection->addAttributeToFilter('description', 'null');

$collection->load(); // 콜렉션을 불러옵니다.
foreach($collection AS $product) {
// 제품의 모든 데이터 출력
print_r($product->getData());
}
[/ccln_php]

이런식으로 addAttributeToSelect()나 addAttributeToFilter()를 사용해서 원하는 attribute을 콜렉션에 포함시키거나 필터를 적용해서 걸러낼수 있습니다.
콜렉션의 사용은 한번에 많은 객체를 불러와야 할때, 또 한번에 여러 객체의 정보를 수정해야할때 유용하게 쓰입니다.

Thursday, January 5, 2012

마젠토의 싱글턴 패턴

마젠토의 싱글턴 패턴
getSingleton()과 getModel()의 차이점과 사용법



싱글턴 패턴은 하나의 클래스에서 하나의 인스턴스만을 생성하도록 하는 소프트웨어 디자인 패턴중의 하나입니다.
마젠토에서 이런 싱글턴 패턴의 사용은 객체의 인스턴스 생성 남용을 막으려는 방법이고 결과적으로 메모리의 사용을 최소화하기 위한 방책입니다.

예를 들자면 데이터베이스 인스턴스가 가장 대표적인 예입니다.
페이지가 로딩되면서 여러번의 데이터베이스 사용이 필요할수 있지만 데이터베이스 연결 인스턴스는 하나면 족합니다.
데이터베이스를 사용할때마다 똑같은 데이터베이스에 연결시키는 인스턴스를 여러번 생성하게되면 불필요한 리소스를 낭비하게 됩니다.
이럴때 이미 생성된 데이터베이스 인스턴스를 재활용하고자 하는것이 기본적인 싱글턴 패턴의 컨셉트 입니다.

마젠토에서 객체 인스턴스를 생성하는 방법은 getSingleton('모델/클래스'); 또는 getModel('모델/클래스'); 이 사용되는데 getSingleton('모델/클래스')의 경우 인스턴스가 이미 생성되어있지 않은경우 getModel('모델/클래스') method를 호출하게 됩니다.
아래는 app/Mage.php의 getSingleton() 와 getMethod() method입니다.
[ccln_php]
// getSingleton
public static function getSingleton($modelClass='', array $arguments=array())
{
$registryKey = '_singleton/'.$modelClass;
if (!self::registry($registryKey)) {
self::register($registryKey, self::getModel($modelClass, $arguments));
}
return self::registry($registryKey);
}

// getModel
public static function getModel($modelClass = '', $arguments = array())
{
return self::getConfig()->getModelInstance($modelClass, $arguments);
}
[/ccln_php]

getModel()의 사용예
[ccln_php]
// $productId를 이용한 product 객체의 인스턴스 생성,
$product = Mage::getModel('catalog/product')->load($productId);
// product의 이름 가져오기
$name = $product->getName();
[/ccln_php]

getSingleton()의 사용예
[ccln_php]
// customer session 불러오기
$customerSession = Mage::getSingleton('customer/session');
// customer 인스턴스 불러오기
$customer = $customerSession->getCustomer();
[/ccln_php]

getModel()과 getSingleton()의 비교

[ccln_php]
// getSingleton()을 사용하여 product 객체를 product_id 34로 로딩
$product = Mage::getSingleton('catalog/product')->load(34);
echo $product->getId(); // 34 가 출력됨

// getModel()을 사용하여 product 객체를 로딩
$product = Mage::getModel('catalog/product');
echo $product->getId(); // 아무것도 출력되지 않음
// getModel()은 새로운 객체를 생성하기 때문에 아무것도 출력되지 않음

// getSingleton()을 사용하여 이미 존재하는 product 객체를 로딩
$product = Mage::getSingleton('catalog/product');
echo $product->getId(); // 34 가 출력됨
[/ccln_php]

line 11의 경우, getSingleton()은 이미 생성된 객체를 불러오기 때문에 굳이 product_id 를 로딩하지 않아도 위의 line 2에서 생성된 객체를 자동으로 로딩하게 됩니다.
그래서 line 12에서는 기존에 로딩되어있던 product 객체의 id를 출력하게 됩니다.

Monday, January 2, 2012

마젠토 객체의 데이터 불러오기

마젠토 getModel()과 getData()를 사용한 객체의 데이터 불러오는 방법



마젠토 객체의 데이터를 불러오는 방법입니다. getModel()과 getData()를 사용하며 마젠토의 객체를 불러오는 방식은 대부분 동일합니다.

마젠토에서는 객체를 불러올때 대체로 getModel() method를 사용하고 불러온 객체의 데이터를 가져올때 getData() method를 사용합니다.
method의 이름이 무엇을 할때 쓰이는지 이미 알려주듯이 사용법 또한 그리 어렵지 않습니다.
이번 포스팅에서는 객체를 불러와 객체를 아이디로 로드하는 방법, 그리고 객체내에 있는 데이터를 불러오는 방법을 보여드립니다.

예를들어 product 객체를 불러올때엔 아래와 같은 코드를 실행하시면 됩니다.
[ccln_php]
$product = Mage::getModel('catalog/product');
?>
[/ccln_php]
한마디로 Mage_Catalog_Model_Product의 객체를 불러오는 것이며 getModel() 안에있는 'catalog/product'는 Mage_Catalog_Model_Product 를 나타냅니다.
Mage_Catalog_Model_Product는 /app/code/core/Mage/Catalog/Model/Product.php 에 위치하고 있으며 Mage_Catalog_Model_Abstract 에서 계승되어 내려온 클래스입니다.
다른 객체를 불러올때도 같은 방법을 사용하며 파일의 위치또한 같은 형식의 폴더안에 위치해 있습니다.

category 객체나 customer 객체를 불러올때도 같은 형식입니다.
[ccln_php]
$category = Mage::getModel('catalog/category');
$customer = Mage::getModel('customer/customer');
?>
[/ccln_php]
category의 경우 Mage_Catalog_Model_Category의 객체를 불러오는 것이며 해당 파일은 /app/code/core/Mage/Catalog/Model/Category.php 에 위치해 있습니다.
customer의 경우 Mage_Customer_Model_Customer의 객체를 불러오는 것이며 해당 파일은 /app/code/core/Mage/Customer/Model/Customer.php 에 위치해 있습니다.

위와같이 product, category, customer 객체를 불러왔을때엔 그 객체 안에는 아직 아무것도 없고 객체를 사용해서 할수있는 일도 몇가지 안됩니다.
객체를 불러온 후에는 product_id, category_id 또는 customer_id를 사용해서 각각의 정보를 로딩해야 합니다.

아래는 product_id '3'을 가진 product를 $product에 로딩시킨후 로딩된 객체의 정보를 getData() method를 사용해서 프린트하는 코드입니다.
마젠토의 root 폴더에 임의의 파일을 만들어 아래 코드를 복사해서 실행시킬수 있습니다.
[ccln_php]
require_once "app/Mage.php";

$product = Mage::getModel('catalog/product')->load(3);
echo '
'; // 어레이를 조금 보기 쉽게 하기 위해서...
print_r($product->getData());

// product의 이름 출력하는 방법
echo $product->getName();
echo $product->getData('name');
// product의 sku 출력하는 방법
echo $product->getSku();
echo $product->getData('sku');
// product의 가격 출력하는 방법
echo $product->getPrice();
echo $product->getData('price');
?>
[/ccln_php]

print_r($product->getData()); 를 프린트 해 보시면 array 안에 product에 관련된 모든 attribute들이 데이터 형식으로 들어있는것을 볼수 있습니다.
그 데이터를 불러올때엔
$product->get{attribute 이름}(); 형식을 사용하면 되고,
$product->getData('{attribute 이름}');의 형식도 사용 가능합니다.
다만 $product->get{attribute 이름}(); 의 경우 {attribute 이름}의 첫번째 알파벳은 대문자가 되어야 합니다.