Chuyển tới nội dung chính

3. Template Hooks: Product Detail (Chi Tiết Sản Phẩm)

Trang chi tiết sản phẩm được render thông qua class \Ecommerce\Template\ProductsDetail. Kiến trúc hook được chia làm hai khu vực chính: layout (view)controller (data), đăng ký trong bootstrap/template-detail.php.


Sơ đồ Hook Tổng Quan

content_products_detail (priority 10)
└── ProductsDetail::layout() → render view product_detail.blade.php
├── product_detail_slider (hooks ảnh + share)
├── product_detail_info (hooks tiêu đề, giá, biến thể, nút mua)
├── product_detail_tabs (hooks tab mô tả, thông số, review)
└── product_detail_support (hooks sidebar hỗ trợ)

controllers_products_detail (hooks xử lý data phần dưới trang)
├── sellingPosition (sản phẩm bán chạy)
├── relatedPosition (sản phẩm liên quan)
├── setViewedSession (ghi nhớ đã xem)
└── viewedPosition (sản phẩm đã xem)

1. Hook Layout Chính

Hook NamePriorityMô tả
content_products_detail10Load toàn bộ layout trang. Truyền $object (Product).
// Override toàn bộ layout trang chi tiết
add_action('content_products_detail', function() {
// render custom layout của bạn
}, 5); // priority < 10 để thay thế hoặc > 10 để thêm sau

2. Hooks Cột Slider Ảnh (product_detail_slider)

Hook NamePriority Mặc ĐịnhMô tảTham số
product_detail_slider10Slide ảnh / gallery sản phẩm$object (Product)
product_detail_slider30Nút share mạng xã hội (Facebook, Zalo...)$object (Product)
// Thêm badge "Yêu thích" vào vùng slider
add_action('product_detail_slider', function($product) {
echo '<button class="btn-wishlist" data-id="'.$product->id.'">❤</button>';
}, 25);

3. Hooks Cột Thông Tin (product_detail_info)

Đây là hook trung tâm chứa tất cả các thành phần thông tin bên phải (hoặc bên dưới ảnh tuỳ layout).

Hook NamePriority Mặc ĐịnhClass::MethodMô tảTham số
product_detail_info3ProductsDetail::brandThương hiệu (Brand)$object
product_detail_info5ProductsDetail::titleTên sản phẩm <h1>$object
product_detail_info8ProductsDetail::codeMã SKU sản phẩm$object
product_detail_info10ProductsDetail::priceGiá bán + giá gạch$object
product_detail_info45ProductsDetail::variationsChọn biến thể (Color/Size)$object
product_detail_info50ProductsDetail::cartButtonsNút Thêm Giỏ / Mua Ngay + Qty$object
product_detail_info60ProductsDetail::descriptionMô tả ngắn (excerpt)$object

Lưu ý: Các method trên nhận $object là đối tượng Product đã được gắn thêm data (variations, attributes...).

💡 Ví dụ: Chèn cam kết chất lượng bên dưới nút Mua

add_action('product_detail_info', function($product) {
echo '<div class="quality-badge mt-3 p-2 border rounded">';
echo '🛡️ Cam kết đổi trả 30 ngày – Miễn phí vận chuyển đơn trên 500k';
echo '</div>';
}, 55); // sau cartButtons (50), trước description (60)

💡 Ví dụ: Ẩn mã SKU

remove_action('product_detail_info', [\Ecommerce\Template\ProductsDetail::class, 'code'], 8);

4. Hooks Khu Vực Tab Nội Dung (product_detail_tabs)

Hook NamePriority Mặc ĐịnhMô tảTham số
product_detail_tabs10Render toàn bộ Tab (Mô tả, Thông số, Đánh giá)$object

Để thêm một tab tùy chỉnh, hãy dùng filter product_detail_tabs_data:

add_filter('product_detail_tabs_data', function($tabs, $product) {
$tabs['chinh-sach'] = [
'label' => 'Chính sách',
'content' => '<p>Chính sách đổi trả của chúng tôi...</p>',
];
return $tabs;
}, 10, 2);

5. Hooks Sidebar (product_detail_sidebar / product_detail_support)

Hook NamePriority Mặc ĐịnhMô tả
product_detail_support1Render sidebar hỗ trợ phía trên (floating box)
product_detail_sidebar1Render sidebar chính bên phải (nếu layout hỗ trợ)
product_detail_sidebar10ProductsDetail::postSidebar – Render widget của sidebar

6. Hooks Controller – Sections Dưới Trang (controllers_products_detail)

Được gọi từ Controller trước khi render view, dùng để set data cho khu vực phía dưới trang:

Hook NamePriorityMethodMô tả
controllers_products_detail10sellingPositionVị trí hiển thị "Sản phẩm bán chạy"
controllers_products_detail10relatedPositionVị trí hiển thị "Sản phẩm liên quan"
controllers_products_detail10setViewedSessionLưu sản phẩm vào session "đã xem"
controllers_products_detail10viewedPositionVị trí hiển thị "Sản phẩm đã xem"

💡 Ví dụ: Thêm block "Sản phẩm cùng thương hiệu" phía dưới trang

add_action('controllers_products_detail', function() use ($object) {
if(!empty($object->brand_id)) {
$sameBrand = Product::where('brand_id', $object->brand_id)
->where('id', '<>', $object->id)
->limit(8)->get();
Cms::setData('sameBrandProducts', $sameBrand);
}
}, 20);