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

2. Template Hooks: Product List (Trang Danh Sách Sản Phẩm)

Trang danh sách sản phẩm (danh mục, thương hiệu, tìm kiếm) sử dụng class \Ecommerce\Template\ProductsIndex. Hooks được đăng ký trong bootstrap/template-index.php.


Sơ Đồ Hook

content_products_index (priority 10)
└── ProductsIndex::index()
└── page_products_index_view
├── 10 → sort() Thanh sắp xếp/lọc
├── 20 → contentTop() Vùng trên danh sách
├── 30 → category() Tab danh mục con
├── 40 → products() Lưới sản phẩm
├── 50 → pagination() Phân trang
└── 60 → contentBottom() Vùng dưới danh sách

Danh Sách Hook Render (page_products_index_view)

Hook NamePriorityClass::MethodMô TảTham Số
page_products_index_view10ProductsIndex::sortThanh Sort (giá tăng/giảm, mới nhất...)View Data
page_products_index_view20ProductsIndex::contentTopVùng tuỳ chỉnh trên danh sách (Banner, Breadcrumb)View Data
page_products_index_view30ProductsIndex::categoryTab danh mục conView Data
page_products_index_view40ProductsIndex::productsLưới sản phẩm chínhView Data
page_products_index_view50ProductsIndex::paginationThanh phân trangView Data
page_products_index_view60ProductsIndex::contentBottomVùng dưới (text SEO, ghi chú)View Data

Ví Dụ Thực Tế

💡 Thêm Banner Khuyến Mãi giữa Sort và contentTop

add_action('page_products_index_view', function() {
$category = Cms::getData('category');
if(!empty($category->image)) {
echo '<div class="promo-banner">';
echo '<img src="'.asset($category->image).'" alt="'.$category->name.'"/>';
echo '</div>';
}
}, 15); // >10 (sort) và <20 (contentTop)

💡 Thêm Bộ Lọc Theo Giá

add_action('page_products_index_view', function() {
echo '<div class="price-range-filter">';
echo '<input type="range" name="price_min" min="0" max="10000000"/>';
echo '</div>';
}, 11); // Ngay sau sort (10)

💡 Ẩn Thanh Danh Mục Con

remove_action('page_products_index_view', [\Ecommerce\Template\ProductsIndex::class, 'category'], 30);

Hooks Controller (Sửa Query Sản Phẩm)

Các hooks này chạy trong productControllerIndex() trước khi render.

Hook NameTham SốMô Tả
controllers_product_index_args$querySửa query builder ban đầu
controllers_product_index_count$countOverride tổng số kết quả
controllers_product_index_paging$paginationSửa object pagination
controllers_product_index_query$query, $requestSửa query cuối cùng (sau sort)
controllers_product_index_objects$objectsSửa/filter kết quả sản phẩm
// Chỉ lấy sản phẩm đang còn hàng
add_filter('controllers_product_index_args', function($query) {
$query->where('in_stock', 1);
return $query;
});

// Loại bỏ sản phẩm hết hạn khỏi kết quả
add_filter('controllers_product_index_objects', function($products) {
return $products->filter(function($product) {
$expiry = Product::getMeta($product->id, 'expiry_date', true);
return empty($expiry) || strtotime($expiry) > time();
});
});

Hooks Template Breadcrumb & Layout

Hook NameClass::MethodMô Tả
theme_breadcrumb_products_index_dataBreadcrumb::productsIndexBreadcrumb trang danh sách
template_layout_products_categoryLayout::getCategoryLayoutLayout của trang danh mục
template_view_products_categoryLayout::getCategoryViewView của trang danh mục