Giáo trình magento part 7 – Magento Models and ORM Basics

Việc triển khai của Model là 1 phần lớn của bất kì MVC framework nào. Nó đại diện cho dữ liệu của ứng dung, và hầu hết ứng dụng vô dụng nếu không có data. Magento Models đóng vai trò lớn hơn nhiều và chúng ta sẽ dần tìm hiểu thêm chi tiết .

Traditional PHP MVC Models : Các PHP MVC Model truyền thống 

Trước khi phương pháp MVC phổ viến bới PHP developer, truy vẫn dữ liệu  thường sử dụng raw SQL hoặc SQL abstraction layer.  Người phát triển sẽ viết truy vấn và không phải nghĩ nhiều về đối tượng  mô hình.

Hiện nay , Sql thuần không được tán thành nhiều, nhưng nhiều PHP framework vẫn hỗ trợ  SQL thuần. Models là objects cung cấp vài lớp trừu tượng, nhưng đằng sau nó vẫn là lệnh SQL và gọi SQL để đọc và ghi dữ liệu.

Những frameworks khác tránh dùng Sql và dùng cách tiếp  ORM.  Ở đây, dev làm việc hoàn toàn với Objects. Thuộc tính được thiết lập, và khi save method được gọi trong đối tượng, data tự động ghi vào db. Nhiều hệ thống ORM cố gắng đoán thuộc tính đối tượng từ DB mà không phải khai báo trong class, nhưng có framework khác yêu cầu người dùng chỉ rõ theo vài cách . Ví dụ kinh điển của ORM loại này là ActiveRecord (dùng trong Yii) , Eloquent dùng trong Laravel …..

Magento Models 

Không có gì ngạc nhiên khi Magento sử dung ORM. Hầu hết data access thông qua Magento Models và models xây dựng bởi chính bạn. Magento có tính mềm dẻo, trừu tượng cao.

 

Các Magento Model có thể được phân thành 2 loại. 1 là ActiveRecord, 2 là EAV model. Mỗi Model đều có Model Collection. Magento team triển khai PHP Standart Library interface của IteratorAggregate và Countable cho phép mỗi model có loại Collection của nó. Collection có thể hiểu là mảng chứa nhiều đối tượng .

Magento Model không có bất kì code nào kết nối với Database, thay vào đó , mỗi model sử dụng ModelResource class để liên lạc với DB server ( thông qua đọc và ghi adapter object). Bằng việc tách riêng ra logic Model và code giao tiếp với db. Nó có khả năng tạo mới resource classes cho database khác nhau và platform khi dữ nguyên Model

Creating a Basic Model

Tạo basic Magento Model cho ứng dụng  weblog.

  1. tạo module Weblog
  2. tạo bảng cho Model
  3. thêm thông tin cho config Model
  4. thêm thông tin model Resource cho config Model
  5.  thêm read Adapter cho Model
  6.  thêm write
  7.  Thêm class Model)
  8. thêm class Resource
  9. khởi tạo Model

 

Có nhiều thứ như khởi tạo block các bạn cần đọc ở các bài trước trước khi làm ví dụ này ..

Trong Magentotutorial/Weblog/etc/config.xml add thêm code để định tuyến

<frontend>
<routers>
<weblog>
<use>standard</use>
<args>
<module>Magentotutorial_Weblog</module>
<frontName>weblog</frontName>
</args>
</weblog>
</routers>
</frontend>

 

Thêm trong Magentotutorial/Weblog/controllers/IndexController.php

class Magentotutorial_Weblog_IndexController extends Mage_Core_Controller_Front_Action {
public function testModelAction() {
echo ‘Setup!';
}
}

http://example.com/weblog/index/testModel

se thay chu  “Setup” tren nen trang background.

Creating the Database Table

Ví dụ này tạo DB bằng tay thông qua các tool như navicat , phpadmin

CREATE TABLE blog_posts (
blogpost_id int(11) NOT NULL auto_increment,
title text,
post text,
date datetime default NULL,
timestamp timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY  (blogpost_id)
)

Thêm ít data

INSERT INTO blog_posts VALUES (1,’My New Title’,’This is a blog post’,’2010-07-01 00:00:00′,’2010-07-02 23:12:30′);

The Global Config and Creating The Model

 

thêm vào file config.xml của module mới tạo để khai áo class Model và resourceModel.

<global>
<!– … –>
<models>
<weblog>
<class>Magentotutorial_Weblog_Model</class>
<!–
need to create our own resource, can’t just
use core_resource
–>
<resourceModel>weblog_resource</resourceModel>
</weblog>
</models>
<!– … –>
</global>

Gọi thử model trong controller tự tạo

public function testModelAction() {
$blogpost = Mage::getModel(‘weblog/blogpost’); // cai nay de gọi model
echo get_class($blogpost);
}

 

Sẽ thấy lỗi này

include(Magentotutorial/Weblog/Model/Blogpost.php) [function.include]: failed to open stream: No such file or directory

Vì magento không tìm được file khai báo trong config nên ta phải tạo thêm file và add code vào file

File: app/code/local/Magentotutorial/Weblog/Model/Blogpost.php

class Magentotutorial_Weblog_Model_Blogpost extends Mage_Core_Model_Abstract
{
protected function _construct()
{
$this->_init(‘weblog/blogpost’);
}
}

The Global Config and Resources

setup resource là dòng sau

<resourceModel>weblog_resource</resourceModel>

resource sẽ làm việc với database mà khong phải model

cách gọi model resource

Mage::getResourceModel(‘weblog/blogpost’);

 

Sửa lại action test

 

public function testModelAction() {
$params = $this->getRequest()->getParams();
$blogpost = Mage::getModel(‘weblog/blogpost’);
echo(“Loading the blogpost with an ID of “.$params[‘id’]);
$blogpost->load($params[‘id’]);
$data = $blogpost->getData();
var_dump($data);
}

chạy URL:

http://example.com/weblog/index/testModel/id/1

exception sẽ xuất hiện

Warning: include(Magentotutorial/Weblog/Model/Resource/Blogpost.php) [function.include]: failed to open stream: No such file ….

Lý do cũng như trên là không tìm được class resource nên ta phải thêm File sau

File: app/code/local/Magentotutorial/Weblog/Model/Resource/Blogpost.php

class Magentotutorial_Weblog_Model_Resource_Blogpost extends Mage_Core_Model_Resource_Db_Abstract{
protected function _construct()
{
$this->_init(‘weblog/blogpost’, ‘blogpost_id’);
}
}

 

Reload link sẽ bắn ra

Can’t retrieve entity config: weblog/blogpost

lý do là không đọc được config khởi tạo rằng model resource sẽ map với bảng nào nên chúng ta cần thêm

config.xml

<models>
<!– … —>
<weblog_resource>
<class>Magentotutorial_Weblog_Model_Resource</class>
<entities>
<blogpost>
<table>blog_posts</table>
</blogpost>
</entities>
</weblog_resource>
</models>

 

Giờ chạy lại dữ liệu của bảng đã được lấy ra :D

 

Basic Model Operations 

$model->getData();
$model->getData(‘title’);

function này lấy data của đối tượng(du lieu luu trong db cua doi tuong) chay thu var_dump ra de xem cấu trúc của kết quả trả về

$model->getOrigData();
$model->getOrigData(‘title’);

Function nay lấy các data lúc đầu khi khởi tạo đối tượng

$model->getBlogpostId();
$model->setBlogpostId(25);
$model->unsetBlogpostId();
if($model->hasBlogpostId()){…}

Mấy method này sinh ra do magic call của PHP mỗi function map với 1 tên column trong bảng

 

CRUD, the Magento Way

Create :

existing one. Add the following method to your Controller

public function createNewPostAction() {
$blogpost = Mage::getModel(‘weblog/blogpost’);
$blogpost->setTitle(‘Code Post!’);
$blogpost->setPost(‘This post was created from code!’);
$blogpost->save();
echo ‘post with ID ‘ . $blogpost->getId() . ‘ created';
}

Read

$blogpost->load(1); 1 la id cua ban ghi

Update

public function editFirstPostAction() {
$blogpost = Mage::getModel(‘weblog/blogpost’);
$blogpost->load(1);
$blogpost->setTitle(“The First post!”);
$blogpost->save();
echo ‘post edited';
}

 

delete

 

public function deleteFirstPostAction() {
$blogpost = Mage::getModel(‘weblog/blogpost’);
$blogpost->load(1);
$blogpost->delete();
echo ‘post removed';
}

Model Collections

Nhiều khi ta sẽ lấy nhiều bản ghi trong table mỗi bản ghi sẽ ứng với 1 model vậy cần làm việc qua collection – danh sách các Model

public function showAllBlogPostsAction() {
$posts = Mage::getModel(‘weblog/blogpost’)->getCollection(); // lay tat ca ban ghi trong blogpost
foreach($posts as $blogpost){
echo ‘<h3>’.$blogpost->getTitle().'</h3>';
echo nl2br($blogpost->getPost());
}
}

http://example.com/weblog/index/showAllBlogPosts

chạy cái này sẽ báo lỗi

Warning: include(Magentotutorial/Weblog/Model/Resource/Blogpost/Collection.php) [function.include]: failed to open stream

Nhớ khai báo

protected ‘_resourceCollectionName’ => string ‘weblog/blogpost_collection’

trong mỗi file model để chỉ ra resource Collection tương ứng

bởi vì Collection chỉ chạy khi có file tương ứng

File: app/code/local/Magentotutorial/Weblog/Model/Resource/Blogpost/Collection.php

class Magentotutorial_Weblog_Model_Resource_Blogpost_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract {
protected function _construct()
{
$this->_init(‘weblog/blogpost’);
}
}

 

Thôi hết rồi. Rất mong anh em đóng góp nếu ví dụ không chạy . Thanks

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">