Không có gì chuyển dữ liệu vào các khối. Sau một hành động điều khiển đã thực hiện mô hình Tương tác của mình, đó là trách nhiệm
tải một đối tượng bố trí (trong đó, gián tiếp, tải và tạo các đối tượng block)
Nói rằng đối tượng bố trí để làm cho một trang.
Hầu hết các thao tác điều khiển Magento thực hiện điều này với hai cuộc gọi vào cuối hành động bộ điều khiển.
$this->loadLayout();
$this->renderLayout();
Trong Magento, không có dữ liệu nào trên chế độ xem. Thay vào đó, chế độ xem (tức là các đối tượng khối) yêu cầu hệ thống cho dữ liệu. Bạn có thể xem ví dụ về điều này trong lớp khối Mage_Tag_Block_Customer_View
.
#File: app/code/core/Mage/Tag/Block/Customer/View.php
...
public function getTagInfo()
{
if (is_null($this->_tagInfo)) {
$this->_tagInfo = Mage::getModel('tag/tag')
->load($this->getTagId());
}
return $this->_tagInfo;
}
...
Đây là phương pháp trực tiếp để biết thông tin của mô hình. Bằng cách này, nhà phát triển mẫu front-end có quyền truy cập vào phương thức
$this->getTagInfo();
. Tôi cũng có nó trên good authority rằng phương pháp _prepareLayout
của khối là nơi hoàn hảo để đặt nhiều nhất, nếu không phải tất cả, mã tìm nạp dữ liệu của bạn trong một khối.
Mẫu thứ hai bạn sẽ thấy được sử dụng là mẫu đăng ký Magento. Đây là một hệ thống Magento cho phép bạn thiết lập một biến toàn cục (nhưng không phải PHP) toàn hệ thống.
Mage::register('foo', 'some value');
echo Mage::registry('foo');
Đôi khi một nhà phát triển Magento sẽ sử dụng sổ đăng ký để đặt biến lên trong hành động điều khiển và sau đó lấy lại trong khối. Ví dụ: trong bộ điều khiển hóa đơn của bảng điều khiển dành cho quản trị viên.
#File: app/code/core/Mage/Adminhtml/controllers/Sales/Order/InvoiceController.php
protected function _initInvoice()
{
...
$invoice = Mage::register('current_invoice', $invoice);
return $invoice;
}
và sau đó một khối sẽ tham chiếu sau này.
#File: app/code/core/Mage/Sales/Block/Order/Print/Invoice.php
public function getInvoice()
{
return Mage::registry('current_invoice');
}
Tôi không hoang dã về mẫu đăng ký, nhưng nó được sử dụng bởi nhóm nòng cốt, vì vậy nó có thể là kosher.
Cuối cùng, nếu bạn đang tìm kiếm để cạnh tranh với "cái nhìn câm" mô hình được sử dụng trong hầu hết các khuôn khổ PHP MVC, hãy thử một cái gì đó như thế này
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->setSomeData('My Data');
$block->setData('alternate_syntax', 'Some other data');
$this->renderLayout();
và sau đó trong khối và/hoặc tập tin mẫu.
echo $this->getSomeData();
echo $this->getData('some_data');
echo $this->getAlternateSyntax();
echo $this->getData('alternate_syntax');
Sau khi bạn gọi loadLayout
, Magento sẽ tạo tất cả các đối tượng khối. Những gì bạn đang làm ở trên là lấy tham chiếu đến một đối tượng khối cụ thể, và sau đó thiết lập dữ liệu của nó.
Mỗi bình luận của Vinai bên dưới, cũng có phương pháp assign
của khối để xem xét.
Tương tự như setData
, sau khi gọi loadLayout
(hoặc từ một khối _prepareLayout
) phương pháp, bạn có thể làm điều gì đó như
$this->loadLayout();
$block = $this->getLayout()->getBlock('block_name');
$block->assign('my_view_var','Something for the view');
$this->renderLayout();
và sau đó trong tập tin phtml
của khối, bạn sẽ có thể đầu ra mà xem biến
echo $my_view_var;
Alan, chúng ta nên bắt đầu điều phối. Câu trả lời của bạn là tốt nhất vì nó trả lời câu hỏi tiềm ẩn của OP, đó là, "Magento, YU KHÔNG CÓ GIỚI HẠN NHƯ PHP MVC NHẤT?", Một cái gì đó chúng ta đã hỏi ... :-D – benmarks
Cảm ơn Alan, bạn tóm tắt nó một cách độc đáo ! Điều duy nhất tôi có thể nghĩ đến để thêm là phương thức 'assign()' của khối mẫu. Hiếm khi được sử dụng, nhưng một số người prefere nó để 'setData()' bởi vì nó phù hợp với cách tiếp cận "gán mẫu biến" cổ điển. – Vinai
Cảm ơn Alan. Lời giải thích rất hay, đã xóa hết những nghi ngờ của tôi. – RIK