177 lines
8.9 KiB
PHP
177 lines
8.9 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/** @var array<int, array<string, mixed>> $categories */
|
||
/** @var array<string, mixed>|null $currentCategory */
|
||
/** @var array<int, array<string, mixed>> $products */
|
||
/** @var array<string, mixed> $pagination */
|
||
/** @var string|null $searchQuery */
|
||
/** @var string|null $catalogHeading */
|
||
/** @var string|null $catalogEyebrow */
|
||
/** @var string|null $catalogLead */
|
||
|
||
$heading = $catalogHeading ?? $currentCategory['h1'] ?? $currentCategory['name'] ?? 'Каталог продукции';
|
||
$eyebrow = $catalogEyebrow ?? ($currentCategory === null ? 'Полный каталог' : 'Категория');
|
||
$catalogLead = trim((string) ($catalogLead ?? ''));
|
||
$categoryDescription = trim((string) ($currentCategory['description'] ?? ''));
|
||
$searchQuery = trim((string) ($searchQuery ?? ''));
|
||
$pagination = $pagination ?? [
|
||
'base_path' => '/catalog',
|
||
'total' => count($products),
|
||
'shown' => count($products),
|
||
'page' => 1,
|
||
'pages' => 1,
|
||
'per_page' => 48,
|
||
'has_more' => false,
|
||
'next_limit' => count($products),
|
||
];
|
||
$paginationGlue = str_contains((string) ($pagination['base_path'] ?? ''), '?') ? '&' : '?';
|
||
?>
|
||
<section class="catalog-layout">
|
||
<aside class="catalog-sidebar">
|
||
<div class="catalog-side-stack">
|
||
<div class="panel catalog-menu-panel">
|
||
<div class="catalog-side-heading">
|
||
<span>Каталог</span>
|
||
<small><?= e((string) $pagination['total']) ?> позиций</small>
|
||
</div>
|
||
<?php
|
||
$items = $categories;
|
||
$depth = 0;
|
||
$currentSlug = $currentCategory['slug'] ?? '';
|
||
require base_path('views/partials/category-tree.php');
|
||
?>
|
||
</div>
|
||
|
||
<div class="panel catalog-mini-cart" data-mini-cart>
|
||
<div>
|
||
<span>Корзина</span>
|
||
<strong data-mini-cart-total>0 руб.</strong>
|
||
</div>
|
||
<p><span data-mini-cart-count>0</span> позиций</p>
|
||
<a href="/cart">Перейти</a>
|
||
</div>
|
||
</div>
|
||
</aside>
|
||
|
||
<section class="catalog-content">
|
||
<div class="catalog-heading">
|
||
<p class="eyebrow"><?= e($eyebrow) ?></p>
|
||
<h1><?= e($heading) ?></h1>
|
||
<?php if ($catalogLead !== ''): ?>
|
||
<p class="catalog-heading-lead"><?= e($catalogLead) ?></p>
|
||
<?php endif; ?>
|
||
</div>
|
||
|
||
<?php if ($searchQuery !== ''): ?>
|
||
<section class="catalog-search-result-panel" aria-label="Результаты умного поиска">
|
||
<div>
|
||
<p class="eyebrow">Умный поиск</p>
|
||
<h2>Поиск по запросу: <?= e($searchQuery) ?></h2>
|
||
<p>Учитываем названия, категории, фасовки, похожие формулировки и бытовую логику покупки.</p>
|
||
</div>
|
||
<a href="/catalog">Сбросить поиск</a>
|
||
</section>
|
||
<?php endif; ?>
|
||
|
||
<section class="payment-benefit-banner cash-benefit-banner" aria-label="Выгода при оплате наличными">
|
||
<div class="cash-benefit-copy">
|
||
<p class="eyebrow">Выгода считается автоматически</p>
|
||
<h2>Оплачивайте наличными при получении и получайте лучшие условия</h2>
|
||
<p>Добавляйте товары в корзину, а сайт сам пересчитает итог от суммы заказа. Ничего считать вручную не нужно.</p>
|
||
</div>
|
||
<div class="cash-receipt" aria-hidden="true">
|
||
<div class="cash-receipt-top">
|
||
<span>Чек выгоды</span>
|
||
<strong>Рыбсток</strong>
|
||
</div>
|
||
<dl>
|
||
<div>
|
||
<dt>от 7 000р.</dt>
|
||
<dd>-300р.</dd>
|
||
</div>
|
||
<div>
|
||
<dt>от 20 000р.</dt>
|
||
<dd>-5%</dd>
|
||
</div>
|
||
<div>
|
||
<dt>от 50 000р.</dt>
|
||
<dd>-7%</dd>
|
||
</div>
|
||
</dl>
|
||
<small>Пересчет появится в корзине сразу</small>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="payment-benefit-banner qr-benefit-banner" aria-label="Преимущество оплаты QR-кодом">
|
||
<div class="cash-benefit-copy">
|
||
<p class="eyebrow">Удобная оплата при получении</p>
|
||
<h2>Принимаем оплату QR-кодом без комиссии даже с кредитной карты</h2>
|
||
<p>После подтверждения заказа менеджер согласует получение, а при передаче товара можно оплатить QR-кодом без лишних комиссий.</p>
|
||
</div>
|
||
<div class="payment-benefit-card" aria-hidden="true">
|
||
<span>QR-оплата</span>
|
||
<strong>0%</strong>
|
||
<p>комиссия для покупателя</p>
|
||
<small>Наличными пользоваться необязательно</small>
|
||
</div>
|
||
</section>
|
||
|
||
<section class="payment-benefit-banner invoice-benefit-banner" aria-label="Оплата по расчетному счету">
|
||
<div class="cash-benefit-copy">
|
||
<p class="eyebrow">Для организаций и крупных заказов</p>
|
||
<h2>Счет на оплату выставляем день в день</h2>
|
||
<p>После подтверждения заказа менеджер подготовит счет и согласует документы. Безналичный расчет доступен для заказов от 30 000р.</p>
|
||
</div>
|
||
<div class="payment-benefit-card" aria-hidden="true">
|
||
<span>Расчетный счет</span>
|
||
<strong>день в день</strong>
|
||
<p>после подтверждения заказа</p>
|
||
<small>Документы согласуем с менеджером</small>
|
||
</div>
|
||
</section>
|
||
|
||
<?php if ($products === []): ?>
|
||
<div class="panel">
|
||
<p class="muted"><?= $searchQuery !== '' ? 'По этому запросу пока ничего не найдено. Попробуйте другое название, фасовку или назначение.' : 'В этой категории товары появятся после переноса каталога со старого сайта.' ?></p>
|
||
</div>
|
||
<?php else: ?>
|
||
<div class="catalog-count-panel">
|
||
<span>Показано <?= e((string) $pagination['shown']) ?> из <?= e((string) $pagination['total']) ?> товаров</span>
|
||
<?php if (!empty($pagination['has_more'])): ?>
|
||
<a href="<?= e((string) $pagination['base_path']) ?><?= e($paginationGlue) ?>limit=<?= e((string) $pagination['next_limit']) ?>">Показать еще</a>
|
||
<?php endif; ?>
|
||
</div>
|
||
|
||
<div class="product-grid catalog-product-grid">
|
||
<?php foreach ($products as $product): ?>
|
||
<?php require base_path('views/partials/product-card.php'); ?>
|
||
<?php endforeach; ?>
|
||
</div>
|
||
|
||
<?php if ((int) $pagination['pages'] > 1): ?>
|
||
<nav class="catalog-pagination" aria-label="Страницы каталога">
|
||
<?php for ($pageNumber = 1; $pageNumber <= (int) $pagination['pages']; $pageNumber++): ?>
|
||
<a
|
||
class="<?= $pageNumber === (int) $pagination['page'] && empty($pagination['cumulative']) ? 'is-current' : '' ?>"
|
||
href="<?= e((string) $pagination['base_path']) ?><?= e($paginationGlue) ?>page=<?= e((string) $pageNumber) ?>"
|
||
>
|
||
<?= e((string) $pageNumber) ?>
|
||
</a>
|
||
<?php endfor; ?>
|
||
</nav>
|
||
<?php endif; ?>
|
||
<?php endif; ?>
|
||
|
||
<?php if ($categoryDescription !== ''): ?>
|
||
<section class="catalog-seo-panel">
|
||
<h2><?= e($heading) ?></h2>
|
||
<div class="catalog-seo-content">
|
||
<?= (string) $categoryDescription ?>
|
||
</div>
|
||
</section>
|
||
<?php endif; ?>
|
||
</section>
|
||
</section>
|