2012-03-19 19 views
13

Ai đó có thể giải thích điều này không?Trong Magento, làm thế nào để Chặn dữ liệu từ mô hình?

Hãy để tôi cho bạn biết những gì tôi biết. Nếu ba điểm đầu tiên là tốt, hãy giải thích 4 điểm.

  1. Yêu cầu đến bộ điều khiển.
  2. Trong bộ điều khiển Hành động, chúng tôi khởi tạo Mô hình.
  3. Models thu thập hoặc tạo ra tất cả các thông tin cần thiết bằng cách kết nối với cơ sở dữ liệu, vv

gì sẽ xảy ra sau đó?

  1. Làm cách nào để chuyển mô hình dữ liệu sang Chặn hoặc làm các khối nhận dữ liệu từ mô hình?

  2. Templates lấy dữ liệu chuẩn bị và hiển thị trên màn hình

    • Ngoài ra, thực hiện theo yêu cầu bao giờ quay ngược lại để điều khiển một lần nữa?

Vui lòng giải thích. Tôi bối rối ở nhiều nơi.

Trả lời

33

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

  1. 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)

  2. 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; 
+1

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

+1

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

+0

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

1

Không, nó rời khỏi bộ điều khiển (trình điều khiển yêu cầu) và sau đó di chuyển đến các khung nhìn, nơi nó được hiển thị. Khi khung nhìn (block [s]) đã trả về yêu cầu về cơ bản hơn (lưu cho hầu hết các trình trợ giúp url, không có logic để nói nhưng đôi khi được xử lý trong bộ điều khiển sau khi khung nhìn được hiển thị.) Trừ khi bạn có một số loại móc được kích hoạt sau đó.

Tôi sử dụng this flowchartthis series (Alan Storm là anh chàng) để tìm hiểu về định tuyến yêu cầu Magento.

+1

Về mặt kỹ thuật, một yêu cầu điển hình để hiển thị quy trình làm việc sử dụng 'renderLayout()', sau đó thực hiện tiếp tục trong tác vụ bộ điều khiển. Nó không phải là một trường hợp phổ biến mà đối tượng phản hồi sẽ bị thay đổi trong hành động điều khiển sau 'renderLayout()', do đó dòng tiếp theo thường là kết thúc của phương thức và do đó trở về bộ điều khiển phía trước./hairsplit – benmarks

3
  1. Chính xác, thông qua Bộ điều khiển và bộ định tuyến trước
  2. Không hoàn toàn. Việc triển khai ViewModel của Magento được tạo điều kiện một phần bằng cách có các khung nhìn (Blocks) khởi tạo các mô hình của riêng chúng.
  3. Có, thông qua các mô hình tài nguyên.

Khi khối được hiển thị thông qua luồng điển hình $this->loadLayout()->renderLayout() trong bộ điều khiển hành động, nếu chúng sử dụng mẫu, các mẫu đó là include() d tại thời gian hiển thị.

Sau cuộc gọi renderLayout(), thực thi vẫn nằm trong phạm vi hoạt động của bộ điều khiển mà chúng tôi đã gửi đến, để bạn có thể truy cập phản hồi được hiển thị bằng cách nhận đối tượng yêu cầu.

điểm cốt truyện chính:

  1. chỉ mục.php gọi Mage::run()
  2. Mage::run cuộc gọi Mage_Core_Model_App::run()
  3. App::run() cuộc gọi Mage_Core_Controller_Varien_Front, lần đầu tiên phương pháp init() của nó mà tập hợp và thiết lập router, sau đó dispatch() mà làm như sau:

    a. Viết lại URL cơ sở dữ liệu

    b. Viết lại cấu hình (không được chấp nhận)

    c. Phù hợp với hành động điều khiển chính xác thông qua bộ định tuyến. Thực thi nhảy từ Front Controller sang bộ điều khiển hành động. Gọi các khối bằng cách sử dụng bố trí hoặc thủ công sau đó sẽ vượt qua thực hiện để chặn các lớp và các mô hình và các mẫu, và sau đó chúng tôi (thường) trở lại hành động điều khiển.

    d. Gửi đối tượng phản hồi (với giả định rằng nó đã bị thay đổi bởi một bộ điều khiển hành động).

Nếu bạn nhìn vào Mage_Core_Controller_Varien_Front::dispatch(); you'll see the call to $ this-> getResponse() -> sendResponse(); `mà sẽ tuôn ra, đứng trước một sự kiện (controller_front_send_response_before) mà có thể được sử dụng như một cái móc để thêm hoặc thao tác bất cứ điều gì liên quan đến phản hồi.

Các vấn đề liên quan