Hola @javierdeco,
Comprendo tu necesidad de añadir un contador de productos en el bloque de categorías. Es una funcionalidad muy demandada que PrestaShop no ofrece de serie y, como bien señalas, intentar implementarla con overrides directos o modificaciones de plantilla puede ser complicado de mantener y propenso a errores en futuras actualizaciones, especialmente con los cambios en Symfony en PrestaShop 8 y 9.
Tu enfoque de usar CategoryFormatter es correcto para inyectar el dato en la estructura de la categoría, pero el problema es cómo obtener ese product_count de manera eficiente. La forma más sencilla, aunque no siempre la más optimizada para tiendas muy grandes sin caché, es usar el método getProducts de la clase Category.
Aquí te muestro cómo podrías modificar tu overrides/classes/CategoryFormatter.php para incluir el conteo de productos. Asegúrate de que tu PrestaShop es 8.1.5, como mencionaste, para que esto funcione correctamente con la estructura de clases.
class CategoryFormatter extends CategoryFormatterCore
{
public function format(array $category, array $params = []): array
{
$formattedCategory = parent::format($category, $params);
$id_category = (int) $category['id_category'];
if ($id_category) {
$categoryObj = new Category($id_category, Context::getContext()->language->id);
// El último 'true' es clave para obtener solo el conteo
$formattedCategory['product_count'] = (int) $categoryObj->getProducts(true, true, null, null, null, null, true);
}
return $formattedCategory;
}
}
Este código obtiene el objeto Category y luego utiliza getProducts con el último parámetro a true para que devuelva solo el número total de productos, en lugar de los productos en sí. Esto lo hace mucho más eficiente.
Una vez que tengas product_count en $formattedCategory, podrás acceder a él desde tu archivo .tpl del módulo ps_categorytree (probablemente views/templates/hook/ps_categorytree.tpl o similar) para mostrarlo:
<a href="{$category.url}">{$category.name}<span class="category-product-count"> ({$category.product_count})</span></a>
Para una solución más robusta y fácil de mantener en producción, que ya se encarga de la optimización y compatibilidad con versiones futuras, te recomiendo considerar un módulo para bloque de categorías dedicado. Estos módulos están diseñados para añadir esta funcionalidad sin necesidad de tocar código ni preocuparse por las actualizaciones del core.