Extrafields Market Custom

Назначение этого плагина для Cotonti: добавляет экстраполя для модуля «Market PRO v.5» в собственную таблицу базы данных и позволяет их выводить, там, где этого требуется для решения задачи

Опубликовано в: Модули и Плагины для Cotonti

Extrafields Market Custom — расширение для Market PRO

Основная информация о плагине

  • Код: xtradbrowmarket
  • Назначение: добавляет экстраполя для модуля «Market PRO v.5» в собственную таблицу базы данных
  • Версия: 2.7.9
  • Дата: 26 апреля 2026
  • Автор: webitproff
  • Copyright: © 2026 webitproff
  • Примечания: Новичкам рекомендуется изучить раздел форума об API ExtraFields. (код в этом файле). После установки плагина сразу откройте управление его экстраполями.
  • Зависимости: Market PRO v.5+ от webitproff

 permanent link to the current plugin source code on GitHub 

 

Структура плагина (хуки)

#PartFileHooks
1extrafieldsxtradbrowmarket.extrafields.phpadmin.extrafields.first
2header.tagsxtradbrowmarket.header.tags.phpheader.tags
3market.edit.delete.donextradbrowmarket.market.edit.delete.done.phpmarket.edit.delete.done
4market.edit.tagsxtradbrowmarket.market.edit.tags.phpmarket.edit.tags
5market.edit.update.donextradbrowmarket.market.edit.update.done.phpmarket.edit.update.done
6market.tagsxtradbrowmarket.market.tags.phpmarket.tags
7markettagsxtradbrowmarket.markettags.phpmarkettags.main

 

Пошаговая установка и использование

  1. Скачать плагин
  2. Папку xtradbrowmarket закачать в папку с плагинами, то есть файл xtradbrowmarket.setup.php должен лежать в таком расположении:

    /plugins/xtradbrowmarket/xtradbrowmarket.setup.php

    После установки, если ошибок не было, в примечании сразу ссылка

    После установки плагина, открыть экстраполя плагина Custom Extrafields Market .

    Или идем по пути

    Управление сайтом     Прочее     Экстраполя     Таблица cot_xtradbrowmarket - Custom Extrafields Market

    ссылка в браузер

    https://cotonti.local/admin/extrafields?n=cot_xtradbrowmarket

    Это и есть и будет вся святая святых вашего плагина, - 15 предустановленных демонстрационных экстраполей дадут вам полное представление, какой тип экстраполя, для какого сценария и применения.

  3. Открываем шаблон редактирования товара, - он же market.edit.tpl. Его правильна "геолокация":

    /themes/index36/modules/market/market.edit.tpl

    и перед радио-кнопками "Да"/"Нет" на удаление товара добавляем код:

    <!-- IF {PHP|cot_plugin_active('xtradbrowmarket')} -->
    <div class="card mb-4">
        <div class="card-header">
            <h4>{PHP.L.xtradbrowmarket_edittpl_dynamic_title}</h4>
        </div>
        <div class="card-body">
            <!-- BEGIN: XTRA_EXTRAFLD -->
            <div class="form-group mb-3">
                <label>{MARKETEDIT_FORM_XTRA_EXTRAFLD_TITLE}</label>
                {MARKETEDIT_FORM_XTRA_EXTRAFLD}
            </div>
            <!-- END: XTRA_EXTRAFLD -->
        </div>
    </div>
    <!-- ENDIF -->

    Кнопкой "Таб" прогнали его вправо. сохранили файл. Затем открываем любой товар и редактируем, например

    https://cotonti.local/market/1165?m=edit

    Как и говорилось ранее, теперь перед радио-кнопками "Да"/"Нет" на удаление товара, вы должны увидеть все поля (а сразу после установки их 15). Теперь, заполните все поля от фонаря, но не бойтесь полагаться на интуицую. Сохраните карточку товара и сразу вернитесь, что бы проверить, что сохранилось в ваших полях. Если все "ок" - идем править файл карточки товара.

  4. Шаблон: market.tpl
    Открываем шаблон карточки товара (его полная детальная страница), - он же market.tpl. Его правильна "геолокация":

    /themes/index36/modules/market/market.tpl
    /themes/index36/modules/market/market.category-name.tpl

    Находим заголовок товара:

    <h1 class="h4 mb-3">
        <!-- IF {PHP.item.fieldmrkt_product_status} == 'instock' -->
        <span class="px-2 fw-bold bg-success text-white rounded-2">{MARKET_PRODUCT_STATUS}</span>
        <!-- ENDIF -->
        <!-- IF {PHP.item.fieldmrkt_product_status} == 'onorder' -->
        <span class="fw-bold text-warning-hot">{MARKET_PRODUCT_STATUS}</span>
        <!-- ENDIF -->
    {MARKET_TITLE}
    </h1>

    и сразу после него, или где вам угодно, вставляем код:

    <!-- IF {PHP.usr.maingrp} == 5 -->
    <!-- IF {PHP|cot_plugin_active('xtradbrowmarket')} -->
    <div class="card mb-4">
    	<div class="card-header">
    		<h4 class="mb-3">{PHP.L.xtradbrowmarket_pagetpl_custom_title}</h4>
    		<small class="mb-3">{PHP.L.xtradbrowmarket_pagetpl_custom_desc}</small>
    	</div>
    	<div class="card-body">
    		
    		<!-- event_name (input) -->
    		<!-- IF {MARKET_XTRA_EVENT_NAME} -->
    		<div class="mb-3">
    			<i class="fa-regular fa-calendar-check me-2 text-primary"></i>
    			<strong>{MARKET_XTRA_EVENT_NAME_TITLE}:</strong>
    			<span class="fw-semibold">{MARKET_XTRA_EVENT_NAME}</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- event_description (textarea) с очисткой тегов и обрезкой -->
    		<!-- IF {MARKET_XTRA_EVENT_DESCRIPTION} -->
    		<div class="mb-3 p-3 bg-light rounded">
    			<h6 class="fw-bold"><i class="fa-solid fa-align-left me-1"></i> {MARKET_XTRA_EVENT_DESCRIPTION_TITLE}</h6>
    			<p class="mb-0">
    				{MARKET_XTRA_EVENT_DESCRIPTION_VALUE|strip_tags($this)|mb_substr($this, 0, 150, 'UTF-8')}...
    			</p>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- event_start (datetime) – форматирование через cot_date -->
    		<!-- IF {MARKET_XTRA_EVENT_START} -->
    		<div class="mb-3">
    			<i class="fa-regular fa-clock me-2 text-warning"></i>
    			<strong>{MARKET_XTRA_EVENT_START_TITLE}:</strong>
    			<span class="badge bg-warning text-dark">
    				{MARKET_XTRA_EVENT_START_VALUE|cot_date('d.m.Y H:i', $this)}
    			</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- event_ticketprice (double) -->
    		<!-- IF {MARKET_XTRA_EVENT_TICKETPRICE} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-dollar-sign me-2 text-success"></i>
    			<strong>{MARKET_XTRA_EVENT_TICKETPRICE_TITLE}:</strong>
    			<!-- IF {MARKET_XTRA_EVENT_TICKETPRICE_VALUE} == '0' -->
    			<span class="badge bg-success">Бесплатно</span>
    			<!-- ELSE -->
    			<span class="fs-3 fw-bold">
    				{MARKET_XTRA_EVENT_TICKETPRICE_VALUE} $
    			</span>
    			<!-- ENDIF -->
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- event_seson (select) – вложенные IF вместо ELSEIF -->
    		<!-- IF {MARKET_XTRA_EVENT_SESON} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-cloud-sun me-2 text-success"></i>
    			<strong>{MARKET_XTRA_EVENT_SESON_TITLE}:</strong>
    			<!-- IF {MARKET_XTRA_EVENT_SESON_VALUE} == 'winter' -->
    			<span>❄️ Зима</span>
    			<!-- ELSE -->
    			<!-- IF {MARKET_XTRA_EVENT_SESON_VALUE} == 'spring' -->
    			<span>🌱 Весна</span>
    			<!-- ELSE -->
    			<!-- IF {MARKET_XTRA_EVENT_SESON_VALUE} == 'summer' -->
    			<span>☀️ Лето</span>
    			<!-- ELSE -->
    			<!-- IF {MARKET_XTRA_EVENT_SESON_VALUE} == 'autumn' -->
    			<span>🍂 Осень</span>
    			<!-- ELSE -->
    			<span class="text-capitalize">{MARKET_XTRA_EVENT_SESON}</span>
    			<!-- ENDIF -->
    			<!-- ENDIF -->
    			<!-- ENDIF -->
    			<!-- ENDIF -->
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_int (inputint) -->
    		<!-- IF {MARKET_XTRA_DEMO_INT} -->
    		<div class="mb-3">
    			<span class="fa-stack fa-sm me-2">
    				<i class="fa-solid fa-circle fa-stack-2x text-secondary"></i>
    				<i class="fa-solid fa-hashtag fa-stack-1x fa-inverse"></i>
    			</span>
    			<strong>{MARKET_XTRA_DEMO_INT_TITLE}:</strong>
    			<span class="badge bg-secondary">{MARKET_XTRA_DEMO_INT}</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_double (double) -->
    		<!-- IF {MARKET_XTRA_DEMO_DOUBLE} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-dollar-sign me-2 text-success"></i>
    			<strong>{MARKET_XTRA_DEMO_DOUBLE_TITLE}:</strong>
    			<!-- IF {MARKET_XTRA_DEMO_DOUBLE_VALUE} == '0.00' -->
    			<span class="text-muted">не указано</span>
    			<!-- ELSE -->
    			{MARKET_XTRA_DEMO_DOUBLE_VALUE}
    			<!-- ENDIF -->
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_select (select) -->
    		<!-- IF {MARKET_XTRA_DEMO_SELECT} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-list me-2 text-info"></i>
    			<strong>{MARKET_XTRA_DEMO_SELECT_TITLE}:</strong>
    			<span class="badge bg-info text-dark">{MARKET_XTRA_DEMO_SELECT}</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_radio (radio) – проверка значения внутри IF -->
    		<!-- IF {MARKET_XTRA_DEMO_RADIO} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-circle-dot me-2 text-secondary"></i>
    			<strong>{MARKET_XTRA_DEMO_RADIO_TITLE}:</strong>
    			<!-- IF {MARKET_XTRA_DEMO_RADIO_VALUE} == 'Yes' -->
    			<span class="text-success fw-bold">Да</span>
    			<!-- ELSE -->
    			<span class="text-danger fw-bold">Нет</span>
    			<!-- ENDIF -->
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_datetime (datetime) -->
    		<!-- IF {MARKET_XTRA_DEMO_DATETIME} -->
    		<div class="mb-3">
    			<i class="fa-regular fa-calendar me-2 text-danger"></i>
    			<strong>{MARKET_XTRA_DEMO_DATETIME_TITLE}:</strong>
    			<span class="text-muted">
    				{MARKET_XTRA_DEMO_DATETIME_VALUE|cot_date('d.m.Y H:i', $this)}
    			</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_file (file)  -->
    		<!-- IF {MARKET_XTRA_DEMO_FILE} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-paperclip me-2"></i>
    			<strong>{MARKET_XTRA_DEMO_FILE_TITLE}:</strong>
    			<a href="{PHP.cfg.mainurl}/datas/exflds/xtradbrowmarket/{MARKET_XTRA_DEMO_FILE}" target="_blank">
    				{MARKET_XTRA_DEMO_FILE}
    			</a>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_country (country) -->
    		<!-- IF {MARKET_XTRA_DEMO_COUNTRY} -->
    		<div class="mb-3">
    			<img src="images/flags/{MARKET_XTRA_DEMO_COUNTRY_VALUE}.svg"
    			style="width:24px;height:auto;" class="me-2" alt="">
    			<strong>{MARKET_XTRA_DEMO_COUNTRY_TITLE}:</strong>
    			<span>{MARKET_XTRA_DEMO_COUNTRY}</span>    <span>{MARKET_XTRA_DEMO_COUNTRY_NAME}</span>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_range (range) – прогресс-бар с реальным значением -->
    		<!-- IF {MARKET_XTRA_DEMO_RANGE} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-sliders me-2" style="color:#6f42c1;"></i>
    			<strong>{MARKET_XTRA_DEMO_RANGE_TITLE}:</strong>
    			<div class="progress mt-1" style="height:20px;">
    				<div class="progress-bar bg-info" role="progressbar"
    				style="width:{MARKET_XTRA_DEMO_RANGE_VALUE}%;"
    				aria-valuenow="{MARKET_XTRA_DEMO_RANGE_VALUE}" aria-valuemin="0" aria-valuemax="100">
    					{MARKET_XTRA_DEMO_RANGE_VALUE}%
    				</div>
    			</div>
    		</div>
    		<!-- ENDIF -->
    		
    		<!-- demo_checklistbox (checklistbox) -->
    		<!-- IF {MARKET_XTRA_DEMO_CHECKLISTBOX} -->
    		<div class="mb-3">
    			<i class="fa-solid fa-check-double me-2 text-primary"></i>
    			<strong>{MARKET_XTRA_DEMO_CHECKLISTBOX_TITLE}:</strong>
    			<span class="text-muted">{MARKET_XTRA_DEMO_CHECKLISTBOX}</span>
    		</div>
    		<!-- ENDIF -->
    		
    	</div>
    </div>
    <!-- ENDIF -->
    <!-- ENDIF -->
    

    Обратите внимание, здесь, я проверку функции активности плагина помещаю в "рамку" условия,

    <!-- IF {PHP.usr.maingrp} == 5 -->
    <!-- IF {PHP|cot_plugin_active('xtradbrowmarket')} -->
    <div class="card mb-4">
        ... bla-bla-bla ....
    </div>
    <!-- ENDIF -->
    <!-- ENDIF -->

    - если главный админ, то только тогда и покажем то, что внутри блока кода плагина, если сам плагин активен. Это нужно в основном только тогда, когда вы что-то "пихаете" на продакшен, - (работающий сайт). Когда вы уже вы это бревно "оттешите" под себя, - затем спокойно снимаем рамку
    <!-- IF {PHP.usr.maingrp} == 5 --> - эту строку убираем, которой мы объявляем условие (показать админу) тут внутри код весь остается
    <!-- ENDIF --> - эту строку, которой мы закрываем условие (показать админу)

  5. Шаблон: market.list.tpl
    Открываем шаблон списка товаров в категории, категориях или вообще без них, - он же market.list.tpl. Его правильна "геолокация":

    /themes/index36/modules/market/market.list.tpl
    /themes/index36/modules/market/market.list.category-name.tpl

    Скролим к блоку цикла товаров

    <div class="row row-cols-1 row-cols-xl-3 row-cols-lg-2 row-cols-md-1 g-3 g-lg-4" id="market-items-container">
        <!-- BEGIN: LIST_ROW -->
        <div class="col">
         ...
        </div>
        <!-- END: LIST_ROW -->
    </div>

    И к примеру, сразу после ссылки на карточку товара

    <h5 class="card-title mb-2">
        <a href="{LIST_ROW_URL}" class="text-decoration-none">{LIST_ROW_TITLE}</a>
    </h5>

    добавляем код:

    <!-- IF {PHP|cot_plugin_active('xtradbrowmarket')} -->
    
    <!-- тупо к примеру - страна производства -->
    <!-- IF {LIST_ROW_XTRA_DEMO_COUNTRY} -->
    <div class="mb-3">
        <img src="images/flags/{LIST_ROW_XTRA_DEMO_COUNTRY_VALUE}.svg"
             style="width:24px;height:auto;" class="me-2" alt="">
        <strong>{LIST_ROW_XTRA_DEMO_COUNTRY_TITLE}:</strong>
        <span>{LIST_ROW_XTRA_DEMO_COUNTRY}</span>    <span>{LIST_ROW_XTRA_DEMO_COUNTRY_NAME}</span>
    </div>
    <!-- ENDIF -->
    
    <!-- тупо к примеру - дата поступления в продажу -->
    <!-- IF {LIST_ROW_XTRA_EVENT_START} -->
    <div class="mb-3">
        <strong>{LIST_ROW_XTRA_EVENT_START_TITLE}:</strong>
        <span class="text-primary"><i class="fa-regular fa-alarm-clock fa-xl"></i></span>
        <span class="ms-2 fw-bold text-danger">{LIST_ROW_XTRA_EVENT_START}</span>
    </div>
    <!-- ENDIF -->
    
    <!-- ENDIF -->

    Сохранили файл, идем в список товаров и видим что вышло (смотрите скрины).

Вывод собственных экстраполей в header.tpl

Его правильна "геолокация":

/themes/index36/header.tpl

Цели такой реализации могут быть вообще самыми разными, главное то, что мы имеем гибкий, достаточно простой, что бы решать специфические задачи, например сообщить поисковику, что-то индивидуальное о каждом товаре на нашем сайте.

В идеале, конечно, желательно иметь, например для товаров свою "шапку сайта", - пользовательский шаблон  header.market.tpl или для страницы товара каждой или нужной категории, - header.market.notebook.tpl, header.market.mobile-phones.tpl и т.д. В Cotonti у вас вообще может быть вот так:

/themes/index36/header.tpl - общая шапка
/themes/index36/header.list.tpl - шапка для списка статей
/themes/index36/header.page.news.tpl - шапка для полной страницы статьи из категории "новости"
/themes/index36/header.market.tpl - общая шапка модуля "маркет"
/themes/index36/header.market.notebook.tpl - шапка карточки товара в категории "Ноувбуки"

Разумеется, это настраивается отдельно и это отдельная тема для разговора, но если вы спросите, - "... и зачем же так заморачиваться? чем проще, тем лучше!"

И вы будете очень правы, но очень "близоруко"!!! Для "местного" значения, - правы на все 100 пудов, а для областного или общенационально, - ни на пинту, даже дерьмового пива! Почему?

Лирическое отступление о дифференциации

На операционном уровне, - конечно, я согласен, чем проще мы сделаем наш header.market.notebook.tpl под именно категорию товаров - тем лучше, а вот сделать простым и универсальным header.tpl "под все задачи" у вас не получится. Один уже пробовал, я про Генри Форда, с его известной массовой моделью "Т". Этот автомобиль был прост, надёжен и неоспоримо доминировал, но не так долго и только в сегменте доступных автомобилей. Модель "Т" предназначалась только под массу, что-то очень количественное и очень стандартизированное. Но успешный бизнесмен, предпримчивый гангстер или властный политик, увлеченный своей важностью никак не стремился ассоциировать себя "потужномошьного" с массой и чем-то стандартным, заурядным! Такой успешный человек не нуждался просто в автомобиле как в средстве передвижения, ему нужен был автомобиль, который подчеркнет его достижения, статус, успешность, а здесь как раз владение простым и дешевым "Т" наносило ущерб имиджу, понижая успешность владельца или не соответствовало техническим, уже стандартным требованиям, - проходимость, подвеска и т.д... Поэтому с появлением "Chevrolet Superior", "Cadillac Type 51", "Cadillac V-63" много людей стали продавать свои "Т" и покупать "то, что ему соответствует". Вот так именно рухнуло доминирование Форда на рынке автомобилей.

1926 год. Три модели, три цены:
Ford Model T (Runabout): $260
Chevrolet Superior Series V (Roadster): $510
Cadillac V-63 (Touring): $3085

Еще до появления концепции "Позиционирования" рынок кричал, всем известными словами Джека Траута, сказанными в 1992 году, - «Дифференцируйся или умри» (Differentiate or Die). Вы не сможете, одну простую и обкатанную, до универсальности, модель управления одним успешным городом применить на каждый город или поселок в области, и тем более на каждый город в государстве. Мы же не построим в каждом городе космодром, институт генетики, коровник и фабрику кондитерских изделий? Вот поэтому, упрощать нужно уже на локальном, местном уровне и в рамках общей стратегии.

вот же меня прорвало.
вернемся к баранам с больными на голову со своей простотой и аллергией на всё цветное. Думаю, я достаточно наглядно показал, почему на весь сайт один супер-пипец-простой header.tpl никак не решит мелких задач для достижения стратегических целей, и разумеется, я очень надеюсь, что если вы владелец сайта, то такие цели у вас точно есть, и например:

  • за год переоринтерировать контент на конкретную аудиторию в рамках физически осязаемой географии;
  • за полгода очистить статьи из раздела "блог", от мусора в разметке кода, который я по неопытности и тупости накопировал с чужих сайтов;
  • рядом с витриной товаров организовать и запустить в форсированном режиме форум, с поддержкой покупателей и пользователей, которые купили или могут купить в будущем товары в моем магазине, и т.д.

Вот здесь и потребуется, одна из изюминок Cotonti, - возможность дифференциации header.tpl под разные "области" и "города".

Вот кстати и пример того, что Cotonti, это вам ни какой-то там OpenCart или WordPress, который прост как модель "Т", - поставил в гараж и забыл, главное что есть машина )))). Но если вы активный разработчик, к вам часто сыпятся заказы, у вас часто будет на уме, - "***б*чий тарантас", - чтоб затюнить или апнуть, да еще и с хотелками заказчика, - тут "подвинул", - там "упало", а когда дело до сметы, - Заказчик в откровенном ужасе, - "так он же бесплатный"....

Практический пример для header.market.notebook.tpl

Снова отвлекся. открываем:

/themes/index36/header.market.notebook.tpl

вот он:

<!--
    /********************************************************************************
    * File: header.tpl
    * Extension: Core'
    * Description: HTML template for header.tpl.
    * Compatibility: CMF/CMS Cotonti Siena v0.9.26[](https://github.com/Cotonti/Cotonti)
    * Dependencies:
    *        Bootstrap 5.3.+[](https://getbootstrap.com/);
    *        Font Awesome Free 7.1[](https://fontawesome.com/)
    * Theme: Index36
    * Version: 1.0.2
    * Created: 01 Feb 2026
    * Updated: 22 Apr 2026
    * Copyright (c) 2026 webitproff | https://github.com/webitproff
    * Source: https://github.com/webitproff/index36-cotonti-theme
    * Demo : https://freelance-script.abuyfile.com/
    * Help and support: https://abuyfile.com/ru/forums/cotonti/original/skins/index36
    * License: BSD (Free distribution with saving Copyright (c) 2026 webitproff)
    ********************************************************************************/
-->
<!-- BEGIN: HEADER -->
<!DOCTYPE html>
    <!-- IF {HTML_LANG} -->
    <html lang="{HTML_LANG}" data-bs-theme="light">
    <!-- ELSE -->
    <html lang="{PHP.usr.lang}" data-bs-theme="light">
    <!-- ENDIF -->
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <!-- IF {I18N_HEADER_META_TITLE} -->
        <title>{I18N_HEADER_META_TITLE}</title>
        <!-- ELSE -->
        <title>{HEADER_TITLE}</title>
        <!-- ENDIF -->
    <!-- IF {I18N_HEADER_META_DESCRIPTION} -->
        <meta name="description" content="{I18N_HEADER_META_DESCRIPTION}" />
    <!-- ELSE -->
        <!-- IF {HEADER_META_DESCRIPTION} -->
        <meta name="description" content="{HEADER_META_DESCRIPTION}" />
        <!-- ENDIF -->
    <!-- ENDIF -->
        <!-- IF {HEADER_BASEHREF} -->
        {HEADER_BASEHREF}
        <!-- ENDIF -->
        <!-- IF {HEADER_CANONICAL_URL} -->
        <link rel="canonical" href="{HEADER_CANONICAL_URL}" />
        <!-- ENDIF -->
        <!-- IF {ALTERNATE_TAGS} -->
        {ALTERNATE_TAGS}
        <!-- ENDIF -->
        <link rel="shortcut icon" href="favicon.ico" />
        <link rel="icon" href="{PHP.cfg.themes_dir}/{PHP.theme}/img/icon.webp" type="image/svg+xml">
        <link rel="apple-touch-icon" href="apple-touch-icon.png" />
        <!-- IF {PHP.out.meta} -->
        {PHP.out.meta}
        <!-- ENDIF -->
        <script>
            (function () {
                const storedTheme = localStorage.getItem('theme');
                const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
                const defaultTheme = storedTheme || (prefersDark ? 'dark' : 'light');
                document.documentElement.setAttribute('data-bs-theme', defaultTheme);
            })();
        </script>
        {HEADER_HEAD}
    </head>
    <body class="sidebar-closed">
        <header class="navbar navbar-expand-lg shadow-sm fixed-top" style="background-color: var(--bs-header-bg);" data-bs-theme="inherit">
               ....
                <div class="d-flex align-items-center gap-3 ms-auto">
                    <!-- BEGIN: I18N_LANG -->
                    <div class="btn-group">
                        <button type="button" class="dropdown-toggle btn nav-link d-flex align-items-center" data-bs-toggle="dropdown">
                            <i class="fa-solid fa-language me-2"></i>
                            <!-- IF {PHP.i18n_locale} == 'ru' -->RU<!-- ENDIF -->
                            <!-- IF {PHP.i18n_locale} == 'cn' -->CN<!-- ENDIF -->
                            <!-- IF {PHP.i18n_locale} == 'en' -->EN<!-- ENDIF -->
                            <!-- IF {PHP.i18n_locale} == 'ua' -->UA<!-- ENDIF -->
                        </button>
                        <ul class="dropdown-menu dropdown-menu-end">
                            <!-- BEGIN: I18N_LANG_ROW -->
                            <li><a class="dropdown-item" href="{I18N_LANG_ROW_URL}">{I18N_LANG_ROW_TITLE}</a></li>
                            <!-- END: I18N_LANG_ROW -->
                        </ul>
                    </div>
                    <!-- END: I18N_LANG -->

            ...
        </header>

        <aside class="main-sidebar">
            ...
        </aside>

        <div class="expanded-panels ps-container">
        ...
        </div>
        <main>
<!-- END: HEADER -->

показываю рабочий пример именно вывода полей, а не смысловую нагрузку, которую они несут в примерах, а поэтому комбинировать можно как угодно: находим:

<title>{HEADER_TITLE}</title>

меняем на

<title>{HEADER_TITLE} <!-- IF {MARKET_HEADER_XTRA_DEMO_COUNTRY} -->. {MARKET_HEADER_XTRA_DEMO_COUNTRY_NAME}<!-- ENDIF --></title>

Это вместо

<title>Очень супер-пупер товар</title>

выведет в браузер

<title>Очень супер-пупер товар. Китай</title>

дальше, находим

<!-- IF {HEADER_META_DESCRIPTION} --><meta name="description" content="{HEADER_META_DESCRIPTION}<!-- ENDIF -->" />
<!-- ENDIF -->

меняем на

<!-- IF {HEADER_META_DESCRIPTION} --><meta name="description" content="{HEADER_META_DESCRIPTION}<!-- IF {MARKET_HEADER_XTRA_EVENT_START} -->  • {MARKET_HEADER_XTRA_EVENT_START_TITLE} {MARKET_HEADER_XTRA_EVENT_START}<!-- ENDIF -->" />
<!-- ENDIF -->

и теперь вместо

<meta name="description" content="Купить товар с самым классным описание от ИИ" />

получим

<meta name="description" content="Купить товар с самым классным описание от ИИ • Акционая продажа только у нас с 27.05.2026 10:10" />

 

Не забывайте как рынок наказал Форда за отказ от изменений.

Нельзя построить космодром в каждом городе — управленческая модель должна адаптироваться к местным условиям. От общего к частному. Так и с сайтом: для каждой категории или конкретной задачи нужен свой «заточенный» инструмент или шаблон, сохраняя общую стратегию. Cotonti предоставляет эту гибкость, чем выгодно отличается от простых «коробочных» CMS.

Extrafields Market Custom - меленький чемоданчик с инструментами, разместить то, что нужно именно вам, и там, где это нужно, - внедрить в систему метаданные или любой контент, посредством, действительного простого вывода экстраполей.

Пример использование в карточке товара:

<div class="row align-items-center mb-4">
	<div class="col-md-6 col-xl-9 col-12 col-auto">
			<h1 class="h4 mb-3">
				<!-- IF {PHP.item.fieldmrkt_product_status} == 'instock' -->
				<span class="px-2 fw-bold bg-success text-white rounded-2">{MARKET_PRODUCT_STATUS}</span>
				<!-- ENDIF -->
				<!-- IF {PHP.item.fieldmrkt_product_status} == 'onorder' -->
				<span class="fw-bold text-warning-hot">{MARKET_PRODUCT_STATUS}</span>
				<!-- ENDIF -->
				<!-- IF {I18N_MXTRA_PAGE_H1} -->
				{I18N_MXTRA_PAGE_H1}
				<!-- ELSE -->
					<!-- IF {MARKET_XTRA_PAGE_H1} AND {PHP.i18n_locale} == {PHP.cfg.defaultlang} -->
					{MARKET_XTRA_PAGE_H1}
					<!-- ELSE -->
					{MARKET_TITLE}
					<!-- ENDIF -->
				<!-- ENDIF -->
			</h1>
	</div>
	<div class="col-md-6 col-xl-3 col-12 mt-3 mt-md-0 text-lg-end">
	...
	</div>
</div>

Сразу отдаем заголовок уже переведенный на другой язык,

иначе

если активен наш плагин и есть значение кастомизированного заголовка для языка по умолчанию - отдаем его,

иначе

отдаем дефолтный заголовок и закрываем по-шагово каждое условие

 

 

Рейтинг на основе отзывов:
Звезд получено: 0
Oтзывов всего: 0
Средняя оценка: 0
12 минут чтения
Владелец: Carbonate Sodium

Отзывы к товарам

Отзывов пока нет


Добавить в корзину

Товар без файла для загрузки

 

Категория расширения
Администрирование и управление, Характеристики, Атрибуты и Опции товаров, Меню, дизайн и внешний вид, Маркетинг и реклама, SEO и оптимизация, Утилиты и инструменты
Доступность
Бесплатно

Рекомендуемые статьи к товару

Локализация экстраполей в Cotonti Пошаговая инструкция на примере поля "статус товара"

Локализация экстраполей в Cotonti Пошаговая инструкция на примере поля "статус товара"

Экстраполя в Cotonti: полное руководство по созданию и локализации заголовков (названий поля) и их

Автор контента

webitproff

Оффлайн

webitproff

Последняя авторизация: 18.06.2026 10:44

  • Чем могу помочь?

    Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.

  • Разработки на GitHub бесплатно
    • 27.04.2026 09:14
    • 01.06.2026 22:24
    • Язык:

    Рекомендуемые товары и услуги

    Плагин “Custom Extrafields” для Cotonti

    Плагин “Custom Extrafields” для Cotonti

    плагин меняет стратегию хранения: для всех зарегистрированных через него экстраполей создаётся
    Установка, интеграция и адаптация плагинов под Cotonti CMF

    Установка, интеграция и адаптация плагинов под Cotonti CMF

    профессиональные услуги по установке, глубокой интеграции и адаптации плагинов под Cotonti CMF, с
    Плагин Userfields для CMF Cotonti 0.9.26

    Плагин Userfields для CMF Cotonti 0.9.26

    Дополнительные поля профиля пользователя, выводим где угодно на сайте в любых шаблонах сайта: список

    Рекомендуемые темы форума для этого товара

    “Custom Extrafields” для модуля “Market” плагин Cotonti

    “Custom Extrafields” для модуля “Market” плагин Cotonti

    Отдельный плагин, - а значит отдельная тема поддержки.
    #208 | Постов: 1 | Просмотров: 1421

    Витрина Market PRO

    CMS, Скрипт и Движок - веб сайта онлайн-витрины, интернет магазина инфопродуктов и цифровых товаров. Разные цены в разных валютах на товар. Онлайн-оплата в криптовалюте за товары и услуги.