2010-08-17 29 views
20

Tôi đang cố gắng lập trình vào tệp .phtml của tôi một câu lệnh if nếu khách trên trang danh sách danh mục, hoặc trên trang sản phẩm.Magento: Làm thế nào để biết bạn đang ở trên trang danh mục hay trang sản phẩm trong tệp .phtml

Ví dụ mã này:

<?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?> 

Returns "danh mục" bất cứ khi nào l'm trên một trang khác hơn là một trang CMS.

Có cách nào l có thể sử dụng phương pháp tương tự để biết liệu người dùng có đang xem danh mục gốc, danh mục phụ hoặc trang sản phẩm riêng lẻ không?

Bất kỳ trợ giúp nào sẽ được đánh giá rất nhiều!

Trả lời

39

Đã lâu rồi kể từ khi tôi xử lý các trang danh mục giao diện người dùng, nhưng hãy thử.

Phiên bản hiện tại của Magento đăng ký các biến toàn cầu nhất định (không phải là các hình cầu PHP, nhưng mọi thứ toàn cầu cho hệ thống Magento) trên một số trang nhất định.

Gọi sau

$category = Mage::registry('current_category');   
$product = Mage::registry('current_product'); 
$product = Mage::registry('product'); 

hoặc sẽ trả về null nếu đối tượng chưa được thiết lập (ví dụ: bạn đang ở trên một trang web mà không một loại hoặc một sản phẩm), hoặc trả lại loại và sản phẩm đối tượng.

Nếu đối tượng sản phẩm được trả lại bạn đang ở trên trang sản phẩm.

Nếu không có đối tượng sản phẩm nào được trả về nhưng đối tượng danh mục là, bạn đang ở trên trang danh mục. Đối tượng danh mục có phương thức nhận id cha mẹ

$category->getParentId() 

Danh mục không có id mẹ phải là danh mục cấp cao nhất, danh mục có id mẹ phải là danh mục phụ.

Điều đó sẽ cung cấp cho bạn những gì bạn cần để xác định nơi yêu cầu hiện tại là.

+0

Đó là một ý tưởng tuyệt vời Alan. – silvo

+2

Trong quản trị viên, khi bạn cố gắng chỉnh sửa một danh mục, 'Mage :: registry ('current_category')' tồn tại ... Vì vậy, kiểm tra bổ sung có thể cần thiết. – FlorinelChis

+0

@FlorinelChis, bất kỳ đề xuất nào khác về chủ đề về phát hiện trang quản trị? Tôi cũng đang cố gắng tìm một giải pháp sạch để phát hiện khi trang sản phẩm được tải – Yaroslav

3

Tôi sợ bạn đang cố gắng làm điều đó một cách sai lầm. Tôi có thể sai, bởi vì bạn chưa giải thích chính xác bạn muốn đạt được điều gì, nhưng tôi sẽ sử dụng bố cục xml để bao gồm khối của bạn trên trang sản phẩm có thông số (nói product-page = "1") và tương tự trên trang danh mục (category-page = "1").

Sau đó, bạn sẽ có thể cho biết nếu bạn đang ở trên một trang sản phẩm hoặc loại bằng cách kiểm tra những thông số bên trong khối của bạn:

if($this->getProductPage()) { 
    //this is a product page, do some stuff 
} 
elseif($this->getCategoryPage()) { 
    //this is a category page, do some stuff 
} 

Phân biệt giữa các trang chính và tiểu thể loại có thể là khó khăn hơn, điều đầu tiên mà nói đến cái tâm là phân tích các biến yêu cầu, nhưng đó chắc chắn không phải là cách tiếp cận tốt nhất.

34

Trong khi câu trả lời của Alan sẽ làm việc, có một tùy chọn trực tiếp hơn, và bạn đã thực sự đi đúng hướng với đoạn mã của bạn ... bạn chỉ cần kiểm tra tên điều khiển chứ không phải là tên module:

<?php Mage::app()->getFrontController()->getRequest()->getControllerName(); ?> 

Điều đó sẽ trả lại category hoặc product dựa trên bộ điều khiển của chúng là CategoryController.phpProductController.php tương ứng.

Điều này giả định rằng bạn chưa cài đặt bất kỳ mô-đun nào của bên thứ ba tự ghi lại các bộ điều khiển đó.

+2

Gần đây tôi đã phát hiện ra rằng ('...-> getControllerName()') cũng sẽ trả về 'sản phẩm' cho một trang" thẻ "('. ../ tag/product/list/... '). Kết hợp điều này với câu trả lời của Alan ('! Is_null (Mage :: registry ('product'))') dường như hoạt động nếu bạn muốn phân biệt đối xử với các trang xem sản phẩm. – musicliftsme

2

Tôi không phải là một fan hâm mộ lớn của kiểm tra nếu hiện tại đăng ký hiện tồn tại, bởi vì về cơ bản bất kỳ bộ điều khiển có thể làm điều này và nó không nhất thiết có nghĩa là nó là một thể loại. Cách làm của tôi mạnh mẽ hơn một chút:

$fullActionName = Mage::app()->getFrontController()->getAction()->getFullActionName(); 
if ($fullActionName == 'catalog_category_view') { 
    ... //Category 
} 
elseif ($fullActionName == 'catalog_product_view') { 
    ... //Product 
} 
Các vấn đề liên quan