*** CORE ***

This commit is contained in:
Aivars Zukovskis 2026-09-25 13:43:24 +03:00
parent be176b55fc
commit 8b8d324581
15 changed files with 92 additions and 98 deletions

View File

@ -22,7 +22,7 @@
--accent-gold-hover: #A87A2B; --accent-gold-hover: #A87A2B;
--accent-gold-light: rgba(200, 150, 62, 0.12); --accent-gold-light: rgba(200, 150, 62, 0.12);
--brand-dark: #2B1E16; --brand-dark: #2B1E16;
--border-color: #E2D5C3; --border-color: 137,159,135; /* #E2D5C3 */
--hero-gradient: linear-gradient(135deg, rgba(200, 150, 62, 0.18) 0%, rgba(247, 243, 236, 0.96) 42%, rgba(255, 255, 255, 0.92) 100%); --hero-gradient: linear-gradient(135deg, rgba(200, 150, 62, 0.18) 0%, rgba(247, 243, 236, 0.96) 42%, rgba(255, 255, 255, 0.92) 100%);
--font-sans: 'Plus Jakarta Sans', sans-serif; --font-sans: 'Plus Jakarta Sans', sans-serif;
--font-serif: 'Cinzel', serif; --font-serif: 'Cinzel', serif;

View File

@ -394,7 +394,7 @@ class indexController extends cCore
// Set image path or default image. // Set image path or default image.
$imgPath = self::IMG_ASSETS_DEFAULT_TESTIMONIAL; $imgPath = self::IMG_ASSETS_DEFAULT_TESTIMONIAL;
if (!empty($v['i'])) { if (!empty($v['i'])) {
$imgPath = self::normalizeImagePath($v['i']); $imgPath = self::normalizeImagePath($v['i'], 'service_card');
} }
$result[$k] = [ $result[$k] = [

View File

@ -15,7 +15,7 @@
{{ section.description }} {{ section.description }}
</div> </div>
<div class="view-button" data-animate="animate__fadeIn"> <div class="view-button" data-animate="animate__fadeIn">
<a href="{{ section.link }}" class="btn-gold"> <a href="{{ section.link }}" class="btn-gold" style="padding: 8px;">
{{ section.button_text }}<i class="ri-arrow-right-long-line msl-4 fw-normal"></i> {{ section.button_text }}<i class="ri-arrow-right-long-line msl-4 fw-normal"></i>
</a> </a>
</div> </div>

View File

@ -20,9 +20,7 @@
<h6 class="font-18 heading-weight mb-0">{{ testi.name }}</h6> <h6 class="font-18 heading-weight mb-0">{{ testi.name }}</h6>
<span class="d-block mst-4 heading-color">{{ testi.role }}</span> <span class="d-block mst-4 heading-color">{{ testi.role }}</span>
<div class="testi-review mst-10"> <div class="testi-review mst-10">
<span class="testi-star review-color icon-16 ul-mt5 justify-content-center justify-content-lg-start lh-1"> <span class="testi-star review-color icon-16 ul-mt5 justify-content-center justify-content-lg-start lh-1"></span>
{# {{ stars.render(testi.rating) }}#}
</span>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
{{ include("include/index/home-slider.twig") }} {{ include("include/index/home-slider.twig") }}
{{ include("include/index/category-slider.twig") }} {{ include("include/index/category-slider.twig") }}
{{ include("include/index/featured-product.twig") }} {{ include("include/index/featured-product.twig") }}
{{ include("include/index/service-area.twig") }} {#{{ include("include/index/service-area.twig") }}#}
{#{{ include("include/index/home-about-product.twig") }}#} {#{{ include("include/index/home-about-product.twig") }}#}
{{ include("include/index/home-about-text.twig") }} {{ include("include/index/home-about-text.twig") }}
{#{{ include("include/index/deal-of-area.twig") }}#} {#{{ include("include/index/deal-of-area.twig") }}#}

View File

@ -56,7 +56,7 @@
</label> </label>
</div> </div>
<div class="checkout-btn d-flex flex-column flex-md-row-reverse justify-content-md-between mst-30 pst-30 bst"> <div class="checkout-btn d-flex flex-column flex-md-row-reverse justify-content-md-between mst-30 pst-30 bst">
<button type="submit" class="width-100 width-md-auto btn-gold">{{ dt.gM("Place order") }}</button> <button type="submit" class="width-100 width-md-auto btn-gold btn-style secondary-btn">{{ dt.gM("Place order") }}</button>
<a href="{{ dt.gL(896) }}" class="btn-outline-gold body-primary-color d-flex align-items-center justify-content-center mst-15 mst-md-0"><i class="ri-arrow-left-line d-block icon-16 mer-5 lh-1"></i>{{ dt.gM("Return to cart") }}</a> <a href="{{ dt.gL(896) }}" class="btn-outline-gold body-primary-color d-flex align-items-center justify-content-center mst-15 mst-md-0"><i class="ri-arrow-left-line d-block icon-16 mer-5 lh-1"></i>{{ dt.gM("Return to cart") }}</a>
</div> </div>
</div> </div>

View File

@ -104,10 +104,10 @@
<div class="acc-detail-button mst-20 mst-md-30"> <div class="acc-detail-button mst-20 mst-md-30">
<div class="row btn-row"> <div class="row btn-row">
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<button type="button" class="w-100 acc-save btn-gold">{{ dt.gM("Save & continue") }}</button> <button type="button" class="w-100 acc-save btn-style quaternary-btn">{{ dt.gM("Save & continue") }}</button>
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
<button type="button" class="w-100 acc-cancel btn-outline-gold">{{ dt.gM("Cancel") }}</button> <button type="button" class="w-100 acc-cancel btn-style secondary-btn">{{ dt.gM("Cancel") }}</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -519,20 +519,22 @@ class pubCategoriesController extends cCore{
private function getCachedCategoryTreeData(int $selectedAliasId): array private function getCachedCategoryTreeData(int $selectedAliasId): array
{ {
$cacheType = ($selectedAliasId > 0 ? self::APC_CATEGORY_TREE_MAIN_KEY . $selectedAliasId : self::APC_CATEGORY_TREE_ROOT_KEY); $isCat = $selectedAliasId > 0;
$cacheType = ($isCat ? self::APC_CATEGORY_TREE_MAIN_KEY . $selectedAliasId : self::APC_CATEGORY_TREE_ROOT_KEY);
$cached = $this->cache->get($cacheType, $this->langId); $cached = $this->cache->get($cacheType, $this->langId);
if ($cached !== false && is_array($cached)) { if ($cached !== false && is_array($cached)) {
return $cached; return $cached;
} }
$treeData = indexController::loadCategoryButtonMenu($this, $this->langId); $treeData = indexController::loadCategoryButtonMenu($this, $this->langId);
if ($selectedAliasId > 0) { if ($isCat) {
$selectedTitle = $this->module->getCategoryTitleByAliasId($selectedAliasId, $this->langId); $selectedTitle = $this->module->getCategoryTitleByAliasId($selectedAliasId, $this->langId);
$selectedTitle = $this->normalizeCategoryTitle($selectedTitle); $selectedTitle = $this->normalizeCategoryTitle($selectedTitle);
if (empty($selectedTitle)) { if (empty($selectedTitle)) {
// Fallback for selected main category // Fallback for selected main category
$item_id = $this->uri_data['item_id'] ?? ''; $item_id = $this->uri_data['item_id'] ?? '';
$selectedTitle = (new cmsTextManagerModule())->getDataById($item_id, ['a_title']); $selectedTitle = (new cmsTextManagerModule())->getDataById($item_id, ['a_title']);
$selectedTitle = $this->normalizeCategoryTitle($selectedTitle);
} }
if (!empty($treeData[$selectedTitle])) { if (!empty($treeData[$selectedTitle])) {
@ -549,8 +551,7 @@ class pubCategoriesController extends cCore{
private function normalizeCategoryTitle(string $title): string private function normalizeCategoryTitle(string $title): string
{ {
$title = trim(html_entity_decode($title, ENT_QUOTES | ENT_HTML5, 'UTF-8')); $title = trim(html_entity_decode($title, ENT_QUOTES | ENT_HTML5, 'UTF-8'));
$title = preg_replace('/\s+/u', ' ', $title); return preg_replace('/\s+/u', ' ', $title);
return function_exists('mb_strtolower') ? mb_strtolower($title, 'UTF-8') : strtolower($title);
} }
private function flattenCategoryTree(array $treeData): array private function flattenCategoryTree(array $treeData): array
@ -563,7 +564,7 @@ class pubCategoriesController extends cCore{
} }
if (!empty($subCategories['t']) && !empty($subCategories['l'])) { if (!empty($subCategories['t']) && !empty($subCategories['l'])) {
$linkSet = isset($subCategories['l']) && $subCategories['l'] !== '' && $subCategories['l'] !== '/'; $linkSet = $subCategories['l'] !== '' && $subCategories['l'] !== '/';
$image = '/img/assets/collection/collection-1.jpg'; $image = '/img/assets/collection/collection-1.jpg';
if (!empty($subCategories['i'])) { if (!empty($subCategories['i'])) {

View File

@ -64,6 +64,4 @@ class cmsTextManagerConst
const MAP_SUB_URL_TYPE = 316; // Map url classificator type ID for site map urls table const MAP_SUB_URL_TYPE = 316; // Map url classificator type ID for site map urls table
const CATEGORY_ALIAS_ID = 899; // Category url alias ID const CATEGORY_ALIAS_ID = 899; // Category url alias ID
const CATEGORY_TYPES = [self::BASE_SUB_CATEGORIES, self::BASE_CATEGORIES]; const CATEGORY_TYPES = [self::BASE_SUB_CATEGORIES, self::BASE_CATEGORIES];
// TODO: Not implemented types.
} }

View File

@ -467,7 +467,7 @@ class cmsTextManagerController extends cCore
// Url to lower // Url to lower
$link = stripSpecialChars(strtolower($val["a_link-{$langId}"]), ["-"], false); $link = stripSpecialChars(strtolower($val["a_link-{$langId}"]), ["-"], false);
if (strlen($link) && in_array($update['a_type'], cmsTextManagerConst::CATEGORY_TYPES, true)) { if (strlen($link) && in_array($update['a_type'], cmsTextManagerConst::CATEGORY_TYPES)) {
// If url segment is in use send an error // If url segment is in use send an error
if ($this->module->chkUrlSegment($link, $recordId, $langId)) if ($this->module->chkUrlSegment($link, $recordId, $langId))
cJSON::sendError(['msg' => "Url segment already in use, please chose a different one"]); cJSON::sendError(['msg' => "Url segment already in use, please chose a different one"]);
@ -962,6 +962,7 @@ class cmsTextManagerController extends cCore
cmsTextManagerConst::GLOBAL_BREADCRUMBS => ['category_bg'], cmsTextManagerConst::GLOBAL_BREADCRUMBS => ['category_bg'],
cmsTextManagerConst::SHOP_SIDE_BANNER => ['shop_side_banner'], cmsTextManagerConst::SHOP_SIDE_BANNER => ['shop_side_banner'],
cmsTextManagerConst::COLLECTION_BANNER => ['collection_banner'], cmsTextManagerConst::COLLECTION_BANNER => ['collection_banner'],
cmsTextManagerConst::INDEX_PAGE_TESTIMONIAL => ['service_card'],
]; ];
return [ return [

View File

@ -2,9 +2,9 @@
{% set breadcrumbs_t = HEADER.breadcrumbs_t|default(HEADER.t) %} {% set breadcrumbs_t = HEADER.breadcrumbs_t|default(HEADER.t) %}
<div class="breadcrumb-area ptb-30 bg-img text-center" data-bgimg="{{ bg }}" data-animate="animate__fadeIn"> <div class="breadcrumb-area ptb-30 bg-img text-center" data-bgimg="{{ bg }}" data-animate="animate__fadeIn">
<div class="container"> <div class="container">
<span class="d-block extra-color"> <span class="d-block" style="color: var(--accent-gold)">
<a href="{{ dt.gL(525) }}" class="extra-color">{{ dt.gM("Home") }}</a> / {{ breadcrumbs_t }} <a href="{{ dt.gL(525) }}">{{ dt.gM("Home") }}</a> / {{ breadcrumbs_t }}
</span> </span>
<h2 class="extra-color font-24 font-xl-32 mst-5 mst-xl-9">{{ HEADER.s }}</h2> <h2 class="font-24 font-xl-32 mst-5 mst-xl-9">{{ HEADER.s }}</h2>
</div> </div>
</div> </div>

View File

@ -1,30 +1,21 @@
{% set cartData = cart|default({}) %} {% set cartData = cart|default({}) %}
{% set cartItems = cartData.cat|default({}) %} {% set cartItems = cartData.cat|default({}) %}
<div class="cart-drawer-table plr-15"> <div class="cart-drawer-table plr-15">
<div class="cart-drawer-summary mb-3">
<div class="d-flex justify-content-between align-items-center mb-2">
<span class="font-serif text-brand-dark">Shipping progress</span>
<span class="text-gold">65%</span>
</div>
<div class="progress-shipping" aria-label="Shipping progress">
<span class="progress-shipping-bar" style="width: 65%;"></span>
</div>
</div>
{% for prodId, variants in cartItems %} {% for prodId, variants in cartItems %}
{% for variantKey, item in variants %} {% for variantKey, item in variants %}
<div class="cart-drawer-info ptb-15 bst bg-card-custom p-3 rounded-4 mb-3" data-item="{{ item.cID }}"> <div class="cart-drawer-info ptb-15 bst" data-item="{{ item.cID }}">
<div class="cart-drawer-content d-flex flex-wrap"> <div class="cart-drawer-content d-flex flex-wrap">
<div class="cart-drawer-image width-88 product-img-wrapper"> <div class="cart-drawer-image width-88">
<a href="{{ item.u }}" class="d-block br-hidden"><img src="{{ item.i }}" class="w-100 img-fluid" alt="{{ item.t }}"></a> <a href="{{ item.u }}" class="d-block br-hidden"><img src="{{ item.i }}" class="w-100 img-fluid" alt="{{ item.t }}"></a>
</div> </div>
<div class="cart-drawer-info width-calc-88 psl-15"> <div class="cart-drawer-info width-calc-88 psl-15">
<div class="cart-drawer-detail"> <div class="cart-drawer-detail">
<a href="{{ item.u }}" class="primary-link font-serif text-brand-dark">{{ item.t }}</a> <a href="{{ item.u }}" class="primary-link">{{ item.t }}</a>
<span class="d-block mst-5 text-secondary"> <span class="d-block mst-5">
{{ item.c1 }}{% if item.c1 and item.c2 %} / {% endif %}{{ item.c2 }} {{ item.c1 }}{% if item.c1 and item.c2 %} / {% endif %}{{ item.c2 }}
</span> </span>
</div> </div>
<div class="heading-color heading-weight mst-5 text-gold">{{ CURR|default('€&nbsp;')|raw }}{{ item.p|number_format(2, '.', ' ') }}</div> <div class="heading-color heading-weight mst-5">{{ CURR|default('€&nbsp;')|raw }}{{ item.p|number_format(2, '.', ' ') }}</div>
<div class="cart-drawer-qty-remove d-flex align-items-end justify-content-between mst-15"> <div class="cart-drawer-qty-remove d-flex align-items-end justify-content-between mst-15">
<div class="js-qty-wrapper"> <div class="js-qty-wrapper">
<div class="js-qty-wrap d-flex body-bg border-full br-hidden"> <div class="js-qty-wrap d-flex body-bg border-full br-hidden">
@ -40,5 +31,4 @@
</div> </div>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
<button type="button" class="btn-gold w-100 py-3 text-uppercase mt-3">Checkout</button>
</div> </div>

View File

@ -69,19 +69,76 @@
<!-- footer-top start --> <!-- footer-top start -->
<div class="footer-area section-ptb bg-brand-sand extra-bg"> <div class="footer-area section-ptb bg-brand-sand extra-bg">
<div class="container"> <div class="container">
<div class="row row-mtm"> <div class="row row-mtm align-items-start">
<div class="col-12 col-md-6 col-lg-3"> <div class="col-12 col-lg-3">
<div class="footer-info text-center"> <div class="footer-info text-start">
<div class="footer-theme-logo"> <div class="footer-theme-logo">
<a href="{{ dt.gL(525) }}" class="d-inline-block theme-logo"> <a href="{{ dt.gL(525) }}" class="d-inline-block theme-logo">
<img src="/img/assets/logo.png" class="width-96 width-xl-112 img-fluid" alt="logo"> <img src="/img/assets/logo.png" class="width-96 width-xl-112 img-fluid" alt="logo">
{# <span class="d-block font-serif h2 mb-0 text-brand-dark">{{ BRAND_NAME }}</span>#}
</a> </a>
</div> </div>
<div class="footer-company-detail mst-23"> <div class="footer-company-detail mst-23">
<p class="text-brand-dark">{{ dt.gM("Footer_company_details") }}</p> <p class="text-brand-dark mb-0">{{ dt.gM("Footer_company_details") }}</p>
</div> </div>
<div class="footer-social mst-23"> </div>
<ul class="social-ul ul-mt10 justify-content-center"> </div>
<div class="col-12 col-md-6 col-lg-2">
<div class="footer-menu text-start">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Information") }}</h6>
<div class="ft-link">
<ul class="ftlink-ul ul-ft pst-19">
{% for link in footerInfoLinks %}
<li class="ftlink-li">
<a href="{{ link.url }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM(link.title) }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-2">
<div class="footer-menu text-start">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Policies") }}</h6>
<div class="ft-link">
<ul class="ftlink-ul ul-ft pst-19">
{% for link in footerHelpLinks %}
<li class="ftlink-li">
<a href="{{ link.url }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM(link.title) }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-2">
<div class="footer-menu text-start">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Quick link") }}</h6>
<div class="ft-link">
<ul class="ftlink-ul ul-ft pst-19">
<li class="ftlink-li"><a href="{{ dt.gL(899) }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM("Shop") }}</a></li>
<li class="ftlink-li"><a href="{{ dt.gL(746) }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM("Contact us") }}</a></li>
<li class="ftlink-li"><a href="{{ dt.gL(748) }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM("About us") }}</a></li>
<li class="ftlink-li"><a href="{{ dt.gL(764) }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM("Faqs") }}</a></li>
</ul>
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-3">
<div class="footer-news text-start">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Newsletter") }}</h6>
<form method="post" class="news-form mst-24 frm_input" id="footer_subscribe">
<div class="news-wrap d-flex">
<div class="validate form-group w-100 mb-0">
<input type="email" id="newsletter-email" name="sub_email" class="form-control border-0" placeholder="{{ dt.gM("Enter your email") }}" required>
</div>
<button type="submit" class="news-btn width-48 tertiary-btn btn-gold" aria-label="{{ dt.gM("Subscribe") }}">
<i class="ri-mail-line d-block lh-1"></i>
</button>
</div>
</form>
<div class="footer-social mst-30">
<ul class="social-ul ul-mt10 justify-content-start">
<li class="social-li"> <li class="social-li">
<a href="javascript:void(0)" class="tertiary-color icon-16 text-brand-dark" aria-label="Social link"><i class="ri-facebook-fill d-block lh-1"></i></a> <a href="javascript:void(0)" class="tertiary-color icon-16 text-brand-dark" aria-label="Social link"><i class="ri-facebook-fill d-block lh-1"></i></a>
</li> </li>
@ -98,57 +155,6 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-12 col-lg-6 order-md-last order-lg-0">
<div class="row row-mtm">
<div class="col-6">
<!-- footer-info start -->
<div class="footer-menu text-center">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Information") }}</h6>
<div class="ft-link">
<ul class="ftlink-ul ul-ft pst-19">
{% for link in footerInfoLinks %}
<li class="ftlink-li">
<a href="{{ link.url }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM(link.title) }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
<!-- footer-info end -->
</div>
<div class="col-6">
<!-- footer-help start -->
<div class="footer-menu text-center">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Help") }}</h6>
<div class="ft-link">
<ul class="ftlink-ul ul-ft pst-19">
{% for link in footerHelpLinks %}
<li class="ftlink-li">
<a href="{{ link.url }}" class="d-inline-block body-primary-color text-brand-dark">{{ dt.gM(link.title) }}</a>
</li>
{% endfor %}
</ul>
</div>
</div>
<!-- footer-help end -->
</div>
</div>
</div>
<div class="col-12 col-md-6 col-lg-3">
<!-- footer-newsletter start -->
<div class="footer-news text-center">
<h6 class="ft-title font-18 text-brand-dark">{{ dt.gM("Newsletter") }}</h6>
<form method="post" class="news-form mst-24 frm_input" id="footer_subscribe">
<div class="news-wrap">
<div class="validate form-group">
<input type="email" id="newsletter-email" name="sub_email" class="form-control w-100 text-center" placeholder="{{ dt.gM("Enter your email") }}" required>
</div>
<button type="submit" class="news-btn w-100 btn-gold mst-15">{{ dt.gM("Subscribe") }}</button>
</div>
</form>
</div>
<!-- footer-newsletter end -->
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@ -55,6 +55,6 @@
</div> </div>
{# Back to top #} {# Back to top #}
<a href="javascript:void(0)" id="top" class="icon-16 tertiary-btn position-fixed width-32 height-32 d-flex align-items-center justify-content-center z-1 opacity-0 invisible rounded-circle" aria-label="Back to top"><i class="ri-arrow-up-line d-block lh-1"></i></a> <a href="javascript:void(0)" id="top" class="icon-16 tertiary-btn position-fixed width-32 height-32 d-flex align-items-center justify-content-center z-1 opacity-0 invisible rounded-circle btn-gold" aria-label="Back to top"><i class="ri-arrow-up-line d-block lh-1"></i></a>
{{ include("pub/mobile_menu.twig") }} {{ include("pub/mobile_menu.twig") }}