haiku-atelier-2024/web/app/themes/haiku-atelier-2024/single-product.php
2026-04-03 17:00:01 +02:00

81 lines
2.3 KiB
PHP
Executable file

<?php
declare(strict_types=1);
/**
* Le modèle de la Page d'un Produit.
*/
namespace HaikuAtelier;
use Exception;
use HaikuAtelier\Data\Product;
use HaikuAtelier\WP\Resource;
use Illuminate\Support\Arr;
use stdClass;
use Timber\Timber;
use WC_Product;
use function add_action;
use function assert;
use function collect;
use function is_array;
use function is_bool;
use function recupere_produits_meme_collection;
use function wc_get_product;
use function wp_json_encode;
require_once __DIR__ . '/src/inc/TraitementInformations.php';
$context = Timber::context();
$templates = ['produit.twig'];
$raw_product = wc_get_product();
// Le Produit DOIT exister.
if ($raw_product === null || $raw_product === false) {
throw new Exception("Le Produit n'existe pas.");
}
// Assemble les données d'intérêt pour la page au sein d'une Classe.
$product = Product::new($raw_product);
/** @var int $maximum_price Le prix de la Variation la plus chère */
$maximum_price = collect($product->variations)->max('price');
/** @var list<Product> Les Produits de la même collection que celui affiché dans la Page. */
$same_collection_products = recupere_produits_meme_collection($product->collection)($product->id)
|> function (/** @var list<WC_Product>|stdClass */ mixed $products): array {
assert(is_array($products), 'Les Produits de la même collection doivent être un tableau.');
return $products;
}
|> (static fn(/** @var list<WC_Product> */ array $products): array => Arr::map($products, Product::new(...)));
$context['product'] = $product;
$context['product_json'] = wp_json_encode($product);
$context['maximum_price'] = $maximum_price;
$context['same_collection_products'] = $same_collection_products;
/**
* Charge les scripts et styles de la page.
*
* @throws Exception une exception est levée s'il est impossible d'obtenir la date de modification du fichier à charger
*/
function load_page_resources(): void {
Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-page-produit',
path: '/assets/js/scripts-page-produit.js',
);
Resource::enqueue_script_module_file(
id: 'haiku-atelier-2024-scripts-menu-categories',
path: '/assets/js/scripts-menu-categories.js',
);
}
add_action('wp_enqueue_scripts', load_page_resources(...));
// Rendu
Timber::render(
filenames: $templates,
data: $context,
);