Magento 2: Chuyển các biến từ hành động điều khiển sang chế độ xem


12

Trong Magento 1, nếu bạn muốn chuyển dữ liệu từ hành động Bộ điều khiển của mình sang "Chế độ xem" (nghĩa là một khối trong bố cục của bạn, bạn có thể)

  1. Thêm một giá trị / đối tượng vào sổ đăng ký toàn cầu thông qua Mage::register

  2. Tìm nạp trực tiếp một đối tượng khối và đặt thuộc tính dữ liệu trên đối tượng khối được tìm nạp sau khi chạy loadLayout

  3. Gọi các phương thức trên các đối tượng khối trong phtmlcác tệp và để các đối tượng khối sử dụng lớp mô hình / cơ sở dữ liệu để đọc dữ liệu được lưu trước đó trong hành động của bộ điều khiển

Sử dụng các phương thức đối tượng khối để đọc từ cơ sở dữ liệu vẫn có vẻ hoạt động trong Magento 2 - phù hợp với một số loại hoạt động nhất định. Tuy nhiên,

  1. Không còn đăng ký toàn cầu trong Magento 2 (hoặc có?)

  2. Hệ thống bố cục hiện hoạt động bằng cách tạo một đối tượng trang thông qua một nhà máy và bạn không thể lấy các tham chiếu khối giống như cách bạn có thể làm trong Magento 1

Magento 2 có thể truyền dữ liệu trực tiếp từ hành động của bộ điều khiển xuống chế độ xem không? Hay đây là mô hình quá trực tiếp cho thế giới Mẫu thiết kế mới dũng cảm của Magento? Nếu đây là mẫu quá trực tiếp, thì nên làm gì nếu có một số thông tin được tính toán mà chúng tôi muốn hiển thị trong một mẫu, nhưng không muốn lưu trữ thông tin đó vào một hệ thống trạng thái (nghĩa là chúng tôi không muốn lưu nó vào cơ sở dữ liệu)

Tôi có thể nghĩ ra một vài cách khác nhau để tự mình hack cái này - nhưng tôi quan tâm đến việc Magento 2 muốn bạn làm điều đó như thế nào.

Lưu ý : Tôi nhận thấy có thể tìm nạp một thể hiện khối trong hành động của bộ điều khiển bằng cách sử dụng cái gì đó như thế này

$resultPage = $this->resultPageFactory->create();    
$block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js');        

var_dump(spl_object_hash($block));

Mã lõi Magento 2 làm điều này thường xuyên. Tuy nhiên - đối tượng khối được tìm nạp trong đối tượng điều khiển dường như là một đối tượng khác với đối tượng có sẵn trong một phtmlmẫu thông qua $thishoặc $block(trước đây ( $this) dường như là đối tượng thực sự biểu hiện khuôn mẫu, trong khi đối tượng sau ( $block) dường như là một thể hiện của loại Khối Magento).

#File: path/to/template.phtml
var_dump(spl_object_hash($block));
var_dump(spl_object_hash($this));

Tôi nói "dường như là" bởi vì nếu tôi đặt dữ liệu trong phương thức hành động của bộ điều khiển, nó không có sẵn trong phtmlmẫu - và nếu tôi so sánh các spl_object_hashkết quả ở trên, tôi sẽ nhận được ba giá trị băm khác nhau. Tuy nhiên, tôi mới đủ để tất cả những điều này có thể là một số lỗi khác mà tôi đã mắc phải - vì vậy nếu bạn có thể đặt dữ liệu trên các khối và tìm nạp nó trong một mẫu tôi muốn nghe về nó !

Câu trả lời:


17

Về số 1, sổ đăng ký vẫn tồn tại, rất giống với những gì bạn biết từ Magento 1. Nó mới được chuyển đi. Xem:\Magento\Framework\Registry

Thêm nó vào hàm tạo của bạn thông qua phép nội xạ phụ thuộc và sau đó bạn có thể sử dụng các phương thức $registry->register($key, $value)$registry->registry($key)phương thức quen thuộc để lưu trữ / truy cập dữ liệu.

Tôi khuyên bạn nên chọc vào không gian tên \ Magento \ Framework nếu bạn chưa có. Rất nhiều thứ có thể truy cập từ Mage hoặc Ứng dụng trước đây vẫn còn đó, chỉ cần tách ra.

Theo như các thực tiễn tốt nhất, tôi không thể trả lời điều đó, nhưng tôi hy vọng câu trả lời sẽ là giữ càng nhiều logic ra khỏi bộ điều khiển càng tốt. Nhìn vào cốt lõi có lẽ là đặt cược tốt nhất của bạn. Ví dụ, xem trang chỉnh sửa địa chỉ khách hàng: Bộ điều khiển cơ bản ; khối mở rộng - bao gồm kéo ID địa chỉ và tải, nếu cần. Họ xử lý trực tiếp trong khối; họ không làm điều đó trong bộ điều khiển và sau đó chuyển nó đi.


2
Tất nhiên, mẹo là biết phần nào để xem phần lõi và phần nào cần bỏ qua :) Cảm ơn các con trỏ, +1 cho thông tin hữu ích!
Alan Storm

1
+1 cho đoạn cuối. Nếu bạn cần chia sẻ một số giá trị được tính toán, hãy đặt hành vi tính toán để tách đối tượng và gọi nó từ các khối yêu cầu giá trị đó. Đăng ký không được khuyến khích vì đó là trạng thái có thể thay đổi toàn cầu và bạn không bao giờ chắc chắn mình sẽ nhận được gì từ đó. Địa chỉ trực tiếp của các khối từ hành động cũng không được khuyến khích bởi vì bạn không bao giờ chắc chắn nếu khối có mặt trên một trang (bố cục có thể giết chết nó)
Anton Kril

@AntonKril làm thế nào về trình trợ giúp trình kết xuất trang? Trình trợ giúp trang CMS, trình trợ giúp xem sản phẩm, có phải là để tách kết xuất khỏi yêu cầu HTTP không?
Ivan Chepurnyi

5

Bạn không nên chuyển Biến từ Hành động của Trình điều khiển sang Chế độ xem. Sử dụng khối để chuyển Biến sang Chế độ xem (công cụ mẫu).


Tại sao? Làm thế nào bạn có thể vượt qua các thông số get / post từ khối để xem? Không phải hầu hết logic chuyển chúng từ bộ điều khiển để xem?
LucScu

Sử dụng Yêu cầu đối tượng trong các khối. Nếu bạn chặn lấy dữ liệu từ bộ điều khiển thông qua Registry, bạn không thể sử dụng khối đó với các bộ điều khiển khác. Nó được gọi là khớp nối tạm thời và các thực tiễn xấu của nó
KAndy

Tôi sử dụng $ block-> gán () để truyền tham số của yêu cầu từ bộ điều khiển sang khối. Nó cũng là một thực hành xấu?
LucScu

Địa chỉ trực tiếp của các khối từ hành động cũng không được khuyến khích bởi vì bạn không bao giờ chắc chắn nếu khối có mặt trên một trang.
KAndy

Trong trường hợp của tôi, tôi chắc chắn, vì đó là một kịch bản tùy chỉnh trong đó bộ điều khiển, bố cục và khối chỉ được kiểm soát bởi mã của tôi, vì vậy tôi nghĩ là logic thông số của yêu cầu chuyển từ bộ điều khiển sang khối. Thx cho câu trả lời của bạn!
LucScu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.