Категории

ASEO редактор-оптимизатор

Адаптивный Composite
ASEO редактор-оптимизатор

Описание

Описание решения

В современном мире интернет-маркетинга успех сайта напрямую зависит от того, насколько грамотно проработана его поисковая оптимизация. Модуль ASEO редактор-оптимизатор для 1С-Битрикс — это профессиональный инструмент, который превращает рутинную работу по наполнению мета-тегов, заголовков и описаний в быстрый и управляемый процесс. Решение предназначено для тех, кто хочет вывести свой проект в топ поисковой выдачи без лишних затрат времени и сил.

ASEO редактор-оптимизатор позволяет централизованно управлять SEO-параметрами всех страниц сайта: от главной до карточек товаров и новостных статей. Вам больше не нужно заходить в каждый элемент вручную — модуль автоматизирует генерацию title, description, h1 и других важных тегов на основе гибких шаблонов. Это особенно актуально для крупных каталогов, интернет-магазинов и порталов с сотнями и тысячами страниц.

Продукт идеально вписывается в экосистему 1С-Битрикс, расширяя её стандартные возможности и экономя ресурсы команды. С ASEO редактором вы получаете не просто инструмент, а полноценного помощника в борьбе за позиции в поисковых системах.

Возможности и функции

  • Гибкая настройка шаблонов мета-тегов. Создавайте правила для генерации title, description, keywords и h1 для любых типов страниц (инфоблоки, разделы, элементы, лендинги). Используйте переменные: название элемента, цена, бренд, категория и другие поля.
  • Автоматическая оптимизация заголовков. Модуль автоматически подставляет правильные теги и <h1> в зависимости от контекста страницы, исключая дубли и пустые значения.</li> <li><strong>Управление ЧПУ-путями (URL).</strong> Настраивайте генерацию человеко-понятных ссылок для всех страниц, что положительно влияет на индексацию и ранжирование.</li> <li><strong>Массовое редактирование.</strong> Изменяйте SEO-параметры для групп страниц одновременно: выберите раздел каталога, примените новый шаблон — и все дочерние элементы обновятся за секунды.</li> <li><strong>Интеграция с внешними сервисами.</strong> Поддержка импорта/экспорта данных для обмена с SEO-платформами, что упрощает аудит и корректировку стратегии.</li> <li><strong>Контроль уникальности.</strong> Система предотвращает появление одинаковых мета-тегов на разных страницах, генерируя уникальные описания и заголовки на основе заданных алгоритмов.</li> <li><strong>Логирование и отчёты.</strong> Встроенный журнал изменений позволяет отследить, какие теги и когда были обновлены, что полезно для контроля качества работы.</li> <li><strong>Совместимость с многоязычными версиями.</strong> Если ваш сайт поддерживает несколько языков, модуль корректно обрабатывает шаблоны для каждой локализации.</li> </ul> <h2>Для кого подходит</h2> <p><strong>ASEO редактор-оптимизатор</strong> — это универсальное решение для широкого круга пользователей <strong>1С-Битрикс</strong>:</p> <ul> <li><strong>Владельцы интернет-магазинов и каталогов.</strong> Если у вас сотни товаров и категорий, ручное заполнение title и description превращается в ад. Модуль автоматизирует этот процесс, повышая видимость в поиске.</li> <li><strong>SEO-специалисты и маркетологи.</strong> Профессионалы оценят гибкость настройки шаблонов, возможность быстрого A/B-тестирования мета-тегов и интеграцию с аналитикой.</li> <li><strong>Веб-студии и разработчики.</strong> Решение станет отличным дополнением к портфолио — вы сможете предлагать клиентам готовый инструмент для SEO-оптимизации, сокращая время на доработки.</li> <li><strong>Контент-менеджеры.</strong> Даже без глубоких технических знаний вы сможете управлять SEO-параметрами через понятный интерфейс, не боясь что-то сломать.</li> </ul> <h2>Технические детали</h2> <p>Модуль <strong>ipol.aseo</strong> версии <strong>2.3.18</strong> полностью совместим с актуальными версиями <strong>1С-Битрикс</strong> и поддерживает <strong>адаптивный дизайн</strong>, что обеспечивает корректное отображение на мобильных устройствах. Также реализована поддержка <strong>технологии Composite</strong> — сайт остаётся быстрым даже при высоких нагрузках, что критично для SEO.</p> <p>Установка выполняется через стандартный Marketplace или вручную, модуль не требует сложных настроек сервера. Разработчик регулярно выпускает обновления, обеспечивая совместимость с новыми релизами платформы. Более <strong>1000 установок</strong> и рейтинг <strong>5 из 5</strong> подтверждают стабильность и надёжность решения.</p> <p>Цена в <strong>6 000 ₽</strong> — это разумная инвестиция в автоматизацию SEO, которая окупится за счёт роста трафика и экономии рабочего времени.</p> <h2>Преимущества покупки</h2> <ul> <li><strong>Экономия времени.</strong> Вместо ручного заполнения мета-тегов для каждой страницы вы настраиваете шаблоны один раз — модуль сделает всё остальное.</li> <li><strong>Повышение позиций в поиске.</strong> Грамотная оптимизация title и description напрямую влияет на CTR и ранжирование. ASEO помогает избежать ошибок, которые штрафуются поисковиками.</li> <li><strong>Простота внедрения.</strong> Не требуется программист — модуль устанавливается за 10 минут и имеет понятный интерфейс на русском языке.</li> <li><strong>Гарантия качества.</strong> Продукт с многолетней историей (с 2012 года), тысячи успешных проектов и положительные отзывы покупателей.</li> <li><strong>Поддержка разработчика.</strong> Вы получаете регулярные обновления и техническую поддержку, что важно для долгосрочного использования.</li> <li><strong>Гибкость.</strong> Модуль подходит как для простых блогов, так и для сложных каталогов с миллионами страниц.</li> </ul> <p>Не откладывайте SEO на потом — начните управлять видимостью своего сайта уже сегодня. <strong>ASEO редактор-оптимизатор</strong> станет вашим надёжным помощником в продвижении.</p> <p style="text-align:center;"><a href="https://marketplace.1c-bitrix.ru/solutions/ipol.aseo/" target="_blank" rel="nofollow">Купить на маркетплейсе 1С-Битрикс</a></p> </div> </div> <!-- FAQ --> <div class="prod-faq"> <h2 class="prod-section-title"><i class="fas fa-question-circle"></i> Часто задаваемые вопросы</h2> <div class="faq-list"> <div class="faq-item" id="faq-0"> <button class="faq-q" onclick="faqToggle(0)" aria-expanded="false"> <span>Чем ASEO редактор-оптимизатор отличается от стандартных SEO-настроек в 1С-Битрикс?</span> <i class="fas fa-chevron-down faq-arrow"></i> </button> <div class="faq-a" id="faq-a-0" hidden> Стандартные настройки Битрикса требуют ручного ввода мета-тегов для каждой страницы, что крайне неэффективно для крупных сайтов. ASEO редактор-оптимизатор автоматизирует этот процесс через гибкие шаблоны: вы один раз настраиваете правила генерации title, description и h1 на основе переменных (цена, название, бренд), и модуль сам заполняет все страницы каталога или разделов. Это исключает человеческий фактор и экономит до 90% времени на SEO-рутине. </div> </div> <div class="faq-item" id="faq-1"> <button class="faq-q" onclick="faqToggle(1)" aria-expanded="false"> <span>Подходит ли модуль для интернет-магазинов с тысячами товаров?</span> <i class="fas fa-chevron-down faq-arrow"></i> </button> <div class="faq-a" id="faq-a-1" hidden> Да, ASEO редактор-оптимизатор создан именно для таких проектов. Благодаря массовому редактированию вы можете применить новый шаблон мета-тегов сразу ко всем товарам в категории или ко всему каталогу за несколько кликов. Модуль корректно обрабатывает даже сложные структуры с множеством торговых предложений и характеристик, гарантируя уникальные заголовки для каждой карточки. </div> </div> <div class="faq-item" id="faq-2"> <button class="faq-q" onclick="faqToggle(2)" aria-expanded="false"> <span>Можно ли настраивать разные шаблоны для разных типов страниц (главная, разделы, новости)?</span> <i class="fas fa-chevron-down faq-arrow"></i> </button> <div class="faq-a" id="faq-a-2" hidden> Безусловно. В модуле предусмотрена гибкая система правил: вы можете создать отдельные шаблоны для инфоблоков, разделов, элементов, лендингов и даже для отдельных страниц по URL-маске. Например, для карточек товаров можно использовать шаблон «Купить [Название] по цене [Цена] в [Город]», а для новостей — «[Заголовок] — новости компании [Дата]». Все настройки сохраняются и применяются автоматически. </div> </div> <div class="faq-item" id="faq-3"> <button class="faq-q" onclick="faqToggle(3)" aria-expanded="false"> <span>Как модуль влияет на скорость работы сайта и нагрузку на сервер?</span> <i class="fas fa-chevron-down faq-arrow"></i> </button> <div class="faq-a" id="faq-a-3" hidden> ASEO редактор-оптимизатор спроектирован с учетом производительности: он использует кэширование сгенерированных мета-тегов и не выполняет лишних запросов к базе данных при каждом открытии страницы. Генерация происходит однократно при сохранении элемента или при массовом обновлении, после чего данные подставляются мгновенно. Это позволяет избежать увеличения времени загрузки даже на сайтах с высокой посещаемостью. </div> </div> <div class="faq-item" id="faq-4"> <button class="faq-q" onclick="faqToggle(4)" aria-expanded="false"> <span>Что делать, если у меня уже есть заполненные вручную мета-теги — модуль их перезапишет?</span> <i class="fas fa-chevron-down faq-arrow"></i> </button> <div class="faq-a" id="faq-a-4" hidden> Нет, модуль работает по принципу «приоритета»: вы можете настроить, чтобы шаблоны применялись только к пустым полям, либо всегда перезаписывали существующие значения. Также доступен режим, при котором ручные правки сохраняются, а шаблоны действуют только для новых страниц. Перед массовыми операциями рекомендуется сделать резервную копию — модуль поддерживает экспорт текущих SEO-данных для страховки. </div> </div> </div> </div> </div> <!-- ── Боковая панель ───────────────────────────────── --> <div class="prod-side-col"> <!-- Иконка продукта --> <div class="prod-icon-wrap"> <img src="/images/products/icon_1964.png" alt="ASEO редактор-оптимизатор" class="prod-icon" loading="lazy"> </div> <!-- Ценовой блок --> <div class="prod-price-card"> <div class="prod-price">6 000 ₽</div> <button type="button" class="prod-buy-btn" onclick="document.getElementById('prod-lead-form').scrollIntoView({behavior:'smooth', block:'nearest'})"> <i class="fas fa-shopping-cart"></i> Оформить заявку </button> </div> <!-- Форма заявки --> <div class="prod-order-form" id="prod-lead-form"> <h3 class="prod-info-card-title"><i class="fas fa-envelope"></i> Оставить заявку</h3> <form class="lead-form" onsubmit="submitLeadForm(event)" novalidate> <div class="lead-field"> <label class="lead-label" for="prod-lead-name">Имя</label> <input class="lead-input" id="prod-lead-name" name="name" required placeholder="Как к вам обращаться"> </div> <div class="lead-field"> <span class="lead-label" id="prod-lead-contact-label">Телефон или email</span> <div class="lead-type-toggle" role="group" aria-label="Тип контакта"> <button type="button" class="lead-type-btn active" data-type="phone" onclick="setLeadContactType(this)">Телефон</button> <button type="button" class="lead-type-btn" data-type="email" onclick="setLeadContactType(this)">Email</button> </div> <div class="lead-phone-group"> <select class="lead-country-select" aria-label="Код страны" onchange="onLeadCountryChange(this)"> <option value="RU" selected>🇷🇺 Россия +7</option> <option value="KZ">🇰🇿 Казахстан +7</option> <option value="BY">🇧🇾 Беларусь +375</option> <option value="UA">🇺🇦 Украина +380</option> <option value="UZ">🇺🇿 Узбекистан +998</option> <option value="AM">🇦🇲 Армения +374</option> <option value="AZ">🇦🇿 Азербайджан +994</option> <option value="GE">🇬🇪 Грузия +995</option> <option value="KG">🇰🇬 Киргизия +996</option> <option value="TJ">🇹🇯 Таджикистан +992</option> <option value="TM">🇹🇲 Туркменистан +993</option> <option value="MD">🇲🇩 Молдова +373</option> <option value="US">🇺🇸 США и Канада +1</option> <option value="GB">🇬🇧 Великобритания +44</option> <option value="DE">🇩🇪 Германия +49</option> <option value="FR">🇫🇷 Франция +33</option> <option value="IT">🇮🇹 Италия +39</option> <option value="ES">🇪🇸 Испания +34</option> <option value="PL">🇵🇱 Польша +48</option> <option value="TR">🇹🇷 Турция +90</option> <option value="AE">🇦🇪 ОАЭ +971</option> <option value="IL">🇮🇱 Израиль +972</option> <option value="CN">🇨🇳 Китай +86</option> <option value="IN">🇮🇳 Индия +91</option> </select> <input class="lead-input" name="contact" type="tel" inputmode="tel" required placeholder="999 123-45-67" aria-labelledby="prod-lead-contact-label" oninput="onLeadPhoneInput(event)" onkeydown="blockLeadNonDigitKeys(event)"> </div> <input type="hidden" name="contact_dial" value="7"> <input type="hidden" name="contact_type" value="phone"> </div> <div class="lead-field lead-field-full"> <label class="lead-label" for="prod-lead-message">Сообщение</label> <textarea class="lead-textarea" id="prod-lead-message" name="message" required placeholder="Ваш вопрос...">Интересует «ASEO редактор-оптимизатор»</textarea> </div> <label class="lead-consent"> <input type="checkbox" required> <span class="lead-consent-box"></span> <span class="lead-consent-text">Согласен(а) с <a href="/privacy/" target="_blank" rel="noopener">обработкой персональных данных</a></span> </label> <input type="hidden" name="lead_source" value="shablonix:product:ipol.aseo"> <button class="lead-submit" type="submit">Отправить заявку</button> <div class="lead-note"></div> </form> </div> <!-- Рейтинг и отзывы --> <div class="prod-rating-card"> <div class="prod-rating-row"> <div class="feedback-rating-container"> <div class="feedback-rating-emptystars-bar"></div> <div class="feedback-rating-progressstars-bar" style="width:100%"></div> </div> <span class="prod-rating-num">5 / 5</span> </div> <div class="prod-rating-counts"> <span><i class="fas fa-star"></i> 1 отзыв</span> <span><i class="fas fa-comments"></i> 69 обсужденией</span> </div> <div class="prod-rating-source">Рейтинг и отзывы — по данным маркетплейса 1С-Битрикс</div> </div> <!-- Характеристики --> <div class="prod-info-card"> <h3 class="prod-info-card-title"><i class="fas fa-info-circle"></i> Характеристики</h3> <table class="prod-info-table"> <tr> <td class="prod-info-label"><i class="fas fa-code-branch"></i> Версия</td> <td class="prod-info-val">2.3.18</td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-calendar-plus"></i> Добавлен</td> <td class="prod-info-val">31.08.2012</td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-sync-alt"></i> Обновлён</td> <td class="prod-info-val">05.03.2026</td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-download"></i> Установок</td> <td class="prod-info-val">Более 1000 раз</td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-tag"></i> Код</td> <td class="prod-info-val prod-info-code">ipol.aseo</td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-mobile-alt"></i> Адаптивный</td> <td class="prod-info-val"> <span class="prod-prop-yes"><i class="fas fa-check"></i> Да</span> </td> </tr> <tr> <td class="prod-info-label"><i class="fas fa-layer-group"></i> Composite</td> <td class="prod-info-val"> <span class="prod-prop-yes"><i class="fas fa-check"></i> Да</span> </td> </tr> </table> </div> </div><!-- /prod-side-col --> </div><!-- /prod-layout --> <!-- Похожие продукты --> <div class="related-products"> <h2 class="prod-section-title"><i class="fas fa-th-large"></i> Из той же категории</h2> <div class="related-grid"> <a href="/product/avtomaticheskoe-uskorenie-sayta-na-1s-bitriks-dlya-google-pagespeed-bolshe-trafika-i-prodazh" class="related-item"> <div class="related-title">Ускорение сайта на 1С-Битрикс на 80% быстро: в топ Google и +200% трафика за 14 дней</div> <div class="related-desc">Модуль для комплексной оптимизации скорости загрузки сайта на Битриксе. Автомати…</div> </a> <a href="/product/bystrye-seo-ssylki-rost-trafika-v-bitriks-200-za-14-dney" class="related-item"> <div class="related-icon"> <img src="/images/products/icon_52.png" alt="Быстрые SEO ссылки для Битрикс: в топ-10 за 14 дней и +200% трафика легко" loading="lazy"> </div> <div class="related-title">Быстрые SEO ссылки для Битрикс: в топ-10 за 14 дней и +200% трафика легко</div> <div class="related-desc">С модулем Быстрые SEO ссылки для вашего Битрикс-сайта вы проиндексируете 100 стр…</div> </a> <a href="/product/scoderedirects" class="related-item"> <div class="related-icon"> <img src="/images/products/icon_2545.jpg" alt="SEO редиректы" loading="lazy"> </div> <div class="related-title">SEO редиректы</div> <div class="related-desc">Общая сумма:…</div> </a> <a href="/product/schemaorg-uvelichivaem-klikabelnost-sayta-na-1s-bitriks-s-pomoschyu-mikrorazmetki" class="related-item"> <div class="related-title">Легко внедряйте микроразметку Битрикс: в топ-10 поиска за 14 дней с 1С-Битрикс</div> <div class="related-desc">Модуль микроразметки для Битрикс автоматически структурирует данные сайта на пла…</div> </a> <a href="/product/acritseo" class="related-item"> <div class="related-icon"> <img src="/images/products/icon_1939.png" alt="SEO - монитор качества + Инструменты оптимизации" loading="lazy"> </div> <div class="related-title">SEO - монитор качества + Инструменты оптимизации</div> <div class="related-desc">Общая сумма:…</div> </a> <a href="/product/grainseofunc" class="related-item"> <div class="related-icon"> <img src="/images/products/icon_2689.png" alt="Дополнительные SEO функции" loading="lazy"> </div> <div class="related-title">Дополнительные SEO функции</div> <div class="related-desc">Общая сумма:…</div> </a> </div> </div> </div><!-- /right-side --> </div><!-- /main-content --> </div><!-- /container --> <style> .prod-order-form { margin-top:16px; padding:16px; background:#f7fafc; border-radius:var(--border-radius); border:1px solid #e2e8f0; } .lead-form { display:grid; gap:18px; margin-top:12px; } .lead-field { display:grid; gap:8px; } .lead-field-full { grid-column:1/-1; } .lead-label { font-weight:600; font-size:0.9rem; color:var(--dark-color); } .lead-input, .lead-textarea, .lead-country-select { width:100%; padding:13px 15px; border-radius:10px; border:1px solid #E2E8F0; font:inherit; font-size:0.95rem; color:var(--dark-color); outline:none; transition:var(--transition); background-color:#F8FAFC; } .lead-input:focus, .lead-textarea:focus, .lead-country-select:focus { border-color:var(--secondary-color); background-color:white; box-shadow:0 0 0 3px rgba(66,153,225,.15); } .lead-textarea { min-height:110px; resize:vertical; } .lead-type-toggle { display:flex; gap:8px; margin-bottom:8px; } .lead-type-btn { flex:1; padding:8px 12px; border-radius:14px; border:1px solid transparent; background-color:#F8FAFC; color:var(--gray-color); font-weight:600; font-size:0.85rem; cursor:pointer; transition:var(--transition); } .lead-type-btn.active { background-color:rgba(66,153,225,.12); border-color:var(--secondary-color); color:var(--primary-color); } .lead-phone-group { display:flex; gap:8px; } .lead-country-select { flex:0 0 auto; width:auto; min-width:78px; max-width:104px; padding-left:8px; padding-right:6px; } .lead-phone-group input[name="contact"] { flex:1; min-width:0; } .lead-phone-group.is-email .lead-country-select { display:none; } .lead-consent { display:flex; align-items:flex-start; gap:10px; cursor:pointer; user-select:none; position:relative; } .lead-consent input { position:absolute; opacity:0; pointer-events:none; } .lead-consent-box { width:20px; height:20px; border-radius:6px; flex-shrink:0; border:1px solid #CBD5E0; background-color:#F8FAFC; display:grid; place-items:center; transition:var(--transition); font-size:12px; color:white; margin-top:2px; } .lead-consent input:checked + .lead-consent-box { border-color:var(--secondary-color); background:linear-gradient(135deg,var(--primary-color),var(--secondary-color)); } .lead-consent input:checked + .lead-consent-box::before { content:"✓"; } .lead-consent-text { color:var(--gray-color); font-size:0.9rem; line-height:1.5; } .lead-consent-text a { color:var(--primary-color); } .lead-submit { background:linear-gradient(135deg,var(--primary-color),var(--secondary-color)); color:white; border:none; padding:14px 28px; border-radius:var(--border-radius); font-weight:700; font-size:1rem; cursor:pointer; transition:var(--transition); box-shadow:0 4px 12px rgba(43,108,176,.25); } .lead-submit:hover { transform:translateY(-2px); box-shadow:0 6px 20px rgba(43,108,176,.35); } .lead-submit:disabled { opacity:.6; cursor:not-allowed; transform:none; } .lead-note { font-size:0.9rem; min-height:20px; } .lead-note.ok { color:var(--success-color); } .lead-note.error { color:var(--danger-color); } .lead-field.invalid .lead-input, .lead-field.invalid .lead-textarea, .lead-field.invalid .lead-country-select { border-color:var(--danger-color); } .lead-field.invalid .lead-consent-box { border-color:var(--danger-color); } .lead-field-error { color:var(--danger-color); font-size:0.8rem; margin-top:2px; } /* Related products */ .related-products { margin-top:40px; } .related-grid { display:grid; grid-template-columns:repeat(auto-fill,minmax(180px,1fr)); gap:16px; margin-top:16px; } .related-item { display:flex; flex-direction:column; gap:8px; padding:16px; background:#fff; border:1px solid #e2e8f0; border-radius:var(--border-radius); text-decoration:none; color:inherit; transition:box-shadow 0.2s,border-color 0.2s; } .related-item:hover { border-color:var(--primary-color); box-shadow:0 4px 16px rgba(0,102,204,0.1); } .related-icon { width:48px; height:48px; flex-shrink:0; } .related-icon img { width:100%; height:100%; object-fit:contain; } .related-title { font-size:0.88rem; font-weight:600; color:var(--dark-color); line-height:1.4; } .related-desc { font-size:0.8rem; color:#718096; line-height:1.5; } /* FAQ */ .prod-faq { margin-top:32px; } .faq-list { display:flex; flex-direction:column; gap:8px; margin-top:16px; } .faq-item { border:1px solid #e2e8f0; border-radius:var(--border-radius); overflow:hidden; } .faq-q { width:100%; display:flex; align-items:center; justify-content:space-between; gap:12px; padding:14px 18px; background:#fff; border:none; cursor:pointer; text-align:left; font-size:0.97rem; font-weight:600; color:var(--dark-color); transition:background 0.15s; } .faq-q:hover { background:#f7fafc; } .faq-q[aria-expanded="true"] { background:#f0f7ff; color:var(--primary-color); } .faq-arrow { flex-shrink:0; font-size:0.8rem; color:#94a3b8; transition:transform 0.2s; } .faq-q[aria-expanded="true"] .faq-arrow { transform:rotate(180deg); color:var(--primary-color); } .faq-a { padding:14px 18px 16px; font-size:0.93rem; line-height:1.65; color:#4a5568; border-top:1px solid #e2e8f0; background:#fafcff; } .prod-gallery-main { position: relative; } .prod-gallery-thumbs { justify-content: center; } .prod-gallery-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 40px; height: 40px; border-radius: 50%; border: none; background: rgba(255,255,255,0.9); box-shadow: 0 2px 8px rgba(0,0,0,0.15); color: var(--dark-color); cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s; } .prod-gallery-nav:hover { background: #fff; color: var(--primary-color); } .prod-gallery-nav--prev { left: 12px; } .prod-gallery-nav--next { right: 12px; } .prod-lightbox { display: none; position: fixed; inset: 0; background: rgba(15,23,42,0.92); z-index: 1000; align-items: center; justify-content: center; } .prod-lightbox.open { display: flex; } .prod-lightbox img { max-width: 90vw; max-height: 90vh; object-fit: contain; border-radius: 8px; } .prod-lightbox-close { position: absolute; top: 20px; right: 28px; background: none; border: none; color: #fff; font-size: 2.2rem; line-height: 1; cursor: pointer; } .prod-lightbox-nav { position: absolute; top: 50%; transform: translateY(-50%); width: 48px; height: 48px; border-radius: 50%; border: none; background: rgba(255,255,255,0.15); color: #fff; font-size: 1.2rem; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background 0.15s; } .prod-lightbox-nav:hover { background: rgba(255,255,255,0.3); } .prod-lightbox-nav--prev { left: 24px; } .prod-lightbox-nav--next { right: 24px; } @media (max-width: 640px) { .prod-gallery-nav { width: 34px; height: 34px; } .prod-lightbox-nav { width: 40px; height: 40px; } } </style> <script> var prodShots = ["/images/products/shot_1964_1.png","/images/products/shot_1964_2.png","/images/products/shot_1964_3.png"]; var prodIndex = 0; function prodSetImg(i) { prodIndex = i; var src = prodShots[prodIndex]; document.getElementById('prod-main-img').src = src; document.querySelectorAll('.prod-thumb').forEach(function(t, idx){ t.classList.toggle('active', idx === prodIndex); }); var lb = document.getElementById('prod-lightbox'); if (lb && lb.classList.contains('open')) { document.getElementById('prod-lightbox-img').src = src; } } function prodStep(delta) { if (!prodShots.length) return; var next = (prodIndex + delta + prodShots.length) % prodShots.length; prodSetImg(next); } function prodOpenLightbox() { if (!prodShots.length) return; document.getElementById('prod-lightbox-img').src = prodShots[prodIndex]; document.getElementById('prod-lightbox').classList.add('open'); document.body.style.overflow = 'hidden'; } function prodCloseLightbox() { document.getElementById('prod-lightbox').classList.remove('open'); document.body.style.overflow = ''; } document.addEventListener('keydown', function(e) { var lb = document.getElementById('prod-lightbox'); if (!lb || !lb.classList.contains('open')) return; if (e.key === 'Escape') prodCloseLightbox(); if (e.key === 'ArrowLeft') prodStep(-1); if (e.key === 'ArrowRight') prodStep(1); }); function faqToggle(i) { var btn = document.querySelector('#faq-' + i + ' .faq-q'); var ans = document.getElementById('faq-a-' + i); var open = btn.getAttribute('aria-expanded') === 'true'; btn.setAttribute('aria-expanded', open ? 'false' : 'true'); if (open) { ans.hidden = true; } else { ans.hidden = false; } } document.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.left-menu-item.has-children').forEach(function(item) { item.addEventListener('click', function(e) { if (window.innerWidth > 992) return; var dropdown = this.querySelector('.subcategory-dropdown'); if (!dropdown) return; var isOpen = dropdown.style.display === 'block'; document.querySelectorAll('.subcategory-dropdown').forEach(function(d){ d.style.cssText=''; }); if (!isOpen) { dropdown.style.cssText = 'display:block;position:static;box-shadow:none;border:none;border-left:3px solid var(--primary-color);border-radius:0;'; e.preventDefault(); } }); }); }); var LEAD_PHONE_COUNTRIES = [ {iso:'RU',dial:'7'},{iso:'KZ',dial:'7'},{iso:'BY',dial:'375'},{iso:'UA',dial:'380'}, {iso:'UZ',dial:'998'},{iso:'AM',dial:'374'},{iso:'AZ',dial:'994'},{iso:'GE',dial:'995'}, {iso:'KG',dial:'996'},{iso:'TJ',dial:'992'},{iso:'TM',dial:'993'},{iso:'MD',dial:'373'}, {iso:'US',dial:'1'},{iso:'GB',dial:'44'},{iso:'DE',dial:'49'},{iso:'FR',dial:'33'}, {iso:'IT',dial:'39'},{iso:'ES',dial:'34'},{iso:'PL',dial:'48'},{iso:'TR',dial:'90'}, {iso:'AE',dial:'971'},{iso:'IL',dial:'972'},{iso:'CN',dial:'86'},{iso:'IN',dial:'91'} ]; var LEAD_PHONE_DIAL_BY_ISO = {}; LEAD_PHONE_COUNTRIES.forEach(function (c) { LEAD_PHONE_DIAL_BY_ISO[c.iso] = c.dial; }); function leadFormatRUPhone(digits) { digits = digits.slice(0, 10); var out = ''; if (digits.length > 0) out += '(' + digits.slice(0, 3); if (digits.length >= 3) out += ')'; if (digits.length > 3) out += ' ' + digits.slice(3, 6); if (digits.length > 6) out += '-' + digits.slice(6, 8); if (digits.length > 8) out += '-' + digits.slice(8, 10); return out; } function leadFormatGenericPhone(digits) { digits = digits.slice(0, 15); return digits.replace(/(\d{3})(?=\d)/g, '$1 ').trim(); } function leadFormatPhoneValue(raw, iso) { var digits = raw.replace(/\D/g, ''); return (iso === 'RU' || iso === 'KZ') ? leadFormatRUPhone(digits) : leadFormatGenericPhone(digits); } function blockLeadNonDigitKeys(e) { if (e.target && e.target.type !== 'tel') return; if (e.ctrlKey || e.metaKey || e.altKey) return; var allowed = ['Backspace', 'Delete', 'Tab', 'Escape', 'Enter', 'ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Home', 'End']; if (allowed.indexOf(e.key) !== -1) return; if (!/^[0-9]$/.test(e.key)) e.preventDefault(); } function onLeadPhoneInput(e) { var input = e.target; if (input.type !== 'tel') return; var group = input.closest('.lead-phone-group'); var select = group ? group.querySelector('.lead-country-select') : null; var iso = select ? select.value : 'RU'; input.value = leadFormatPhoneValue(input.value, iso); } function onLeadCountryChange(select) { var field = select.closest('.lead-field'); if (!field) return; var iso = select.value; var dial = LEAD_PHONE_DIAL_BY_ISO[iso] || '7'; var hiddenDial = field.querySelector('input[name="contact_dial"]'); if (hiddenDial) hiddenDial.value = dial; var input = field.querySelector('input[name="contact"]'); if (input) input.value = leadFormatPhoneValue(input.value, iso); } function setLeadContactType(btn) { var field = btn.closest('.lead-field'); if (!field) return; field.querySelectorAll('.lead-type-btn').forEach(function (b) { b.classList.toggle('active', b === btn); }); var type = btn.getAttribute('data-type'); var input = field.querySelector('input[name="contact"]'); var hidden = field.querySelector('input[name="contact_type"]'); var group = field.querySelector('.lead-phone-group'); if (hidden) hidden.value = type; if (input) { input.type = type === 'email' ? 'email' : 'tel'; input.setAttribute('inputmode', type === 'email' ? 'email' : 'tel'); input.placeholder = type === 'email' ? 'example@company.com' : '999 123-45-67'; input.value = ''; } if (group) group.classList.toggle('is-email', type === 'email'); } function validateLeadForm(form) { var errors = {}; var name = form.querySelector('input[name="name"]'); var contact = form.querySelector('input[name="contact"]'); var contactType = form.querySelector('input[name="contact_type"]'); var message = form.querySelector('textarea[name="message"]'); var consent = form.querySelector('.lead-consent input[type="checkbox"]'); if (name && !name.value.trim()) errors.name = 'Укажите имя'; var type = contactType ? contactType.value : 'phone'; if (contact) { var val = contact.value.trim(); if (!val) { errors.contact = type === 'email' ? 'Укажите email' : 'Укажите телефон'; } else if (type === 'email') { var emailRe = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (val.indexOf('@') === -1 || !emailRe.test(val)) { errors.contact = 'Введите корректный email, например name@company.ru'; } } else { var digits = val.replace(/\D/g, ''); if (digits.length < 7) errors.contact = 'Введите корректный номер телефона'; } } if (message && !message.value.trim()) errors.message = 'Опишите ваш вопрос'; if (consent && !consent.checked) errors.consent = 'Нужно согласие на обработку персональных данных'; return errors; } function showLeadFieldErrors(form, errors) { form.querySelectorAll('.lead-field-error').forEach(function (el) { el.remove(); }); form.querySelectorAll('.lead-field.invalid').forEach(function (el) { el.classList.remove('invalid'); }); var firstInvalid = null; Object.keys(errors).forEach(function (key) { var target = key === 'consent' ? form.querySelector('.lead-consent input[type="checkbox"]') : form.querySelector('[name="' + key + '"]'); if (!target) return; var wrap = target.closest('.lead-field') || target.closest('.lead-consent'); if (wrap) { wrap.classList.add('invalid'); var err = document.createElement('div'); err.className = 'lead-field-error'; err.textContent = errors[key]; wrap.appendChild(err); } if (!firstInvalid) firstInvalid = target; }); return firstInvalid; } async function submitLeadForm(e) { e.preventDefault(); var form = e.target; var note = form.querySelector('.lead-note'); var errors = validateLeadForm(form); if (Object.keys(errors).length) { var firstInvalid = showLeadFieldErrors(form, errors); if (note) { note.className = 'lead-note error'; note.textContent = 'Проверьте поля, отмеченные красным.'; } if (firstInvalid) firstInvalid.focus(); return; } showLeadFieldErrors(form, {}); var data = Object.fromEntries(new FormData(form).entries()); var isPhone = (data.contact_type || 'phone') === 'phone'; var contactValue = isPhone && data.contact ? ('+' + (data.contact_dial || '7') + ' ' + data.contact) : (data.contact || ''); var submitBtn = form.querySelector('.lead-submit'); var originalText = submitBtn ? submitBtn.textContent : ''; if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Отправляем...'; } if (note) { note.className = 'lead-note'; note.textContent = 'Отправляем заявку...'; } function restore() { if (submitBtn) { submitBtn.disabled = false; submitBtn.textContent = originalText; } } var resp; try { resp = await fetch('/send-lead.php', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ name: data.name || '', contact: contactValue, contact_type: data.contact_type || 'phone', message: data.message || '', source: data.lead_source || 'shablonix:product', page_url: location.href, }), }); } catch (networkErr) { console.error(networkErr); if (note) { note.className = 'lead-note error'; note.textContent = 'Нет соединения с сервером. Проверьте интернет и попробуйте ещё раз.'; } restore(); return; } if (!resp.ok) { if (note) { note.className = 'lead-note error'; note.textContent = 'Сервер временно недоступен (ошибка ' + resp.status + '). Попробуйте позже.'; } restore(); return; } var result; try { result = await resp.json(); } catch (parseErr) { console.error(parseErr); if (note) { note.className = 'lead-note error'; note.textContent = 'Не удалось обработать ответ сервера. Попробуйте ещё раз.'; } restore(); return; } if (!result.ok) { if (note) { note.className = 'lead-note error'; note.textContent = 'Не удалось сохранить заявку. Попробуйте ещё раз.'; } restore(); return; } form.reset(); var phoneBtn = form.querySelector('.lead-type-btn[data-type="phone"]'); if (phoneBtn) setLeadContactType(phoneBtn); showLeadFieldErrors(form, {}); if (note) { note.className = 'lead-note ok'; note.textContent = 'Спасибо! Заявка отправлена, мы свяжемся с вами в ближайшее время.'; } restore(); } </script> <!-- Футер --> <div class="footer_wrap"> <div class="container"> <div class="ft_footer"> <div class="ft_nav"> <h3>Каталог</h3> <ul> <li><h4><a href="/"><i class="fas fa-box-open"></i> Битрикс решения</a></h4></li> <li><h4><a href="/categories/"><i class="fas fa-th-large"></i> Категории</a></h4></li> <li><h4><a href="/wordpress/"><i class="fab fa-wordpress"></i> WordPress темы</a></h4></li> </ul> </div> <div class="ft_nav"> <h3>Покупка</h3> <ul> <li><h4><a href="/contacts/"><i class="fas fa-shopping-cart"></i> Оформить заявку</a></h4></li> <li><h4><a href="/about/"><i class="fas fa-info-circle"></i> Как купить</a></h4></li> </ul> </div> <div class="ft_nav"> <h3>Информация</h3> <ul> <li><h4><a href="/about/"><i class="fas fa-building"></i> О нас</a></h4></li> <li><h4><a href="/contacts/"><i class="fas fa-address-book"></i> Контакты</a></h4></li> </ul> </div> <div class="ft_contacts"> <div class="bottom-menu"> <a class="bottom-menu-item" href="/contacts/"><i class="fas fa-map-marker-alt"></i> Контакты</a> </div> <div class="bottom-menu"> <a class="bottom-menu-item" href="/sitemap.xml"><i class="fas fa-sitemap"></i> Карта сайта</a> </div> <div class="bottom-menu"> <a class="bottom-menu-item" href="/privacy/"><i class="fas fa-shield-alt"></i> Политика конфиденциальности</a> </div> </div> </div> <div class="ft_copyright"> <p>© 2025 Shablonix — каталог решений для 1С-Битрикс <span class="footer-age-block">16+</span> </p> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function() { // Переключатель тёмной темы const themeToggle = document.getElementById('header-theme-toggle'); if (themeToggle) { const applyThemeIcon = function() { const isDark = document.documentElement.getAttribute('data-theme') === 'dark'; themeToggle.innerHTML = isDark ? '<span aria-hidden="true">☀</span>' : '<span aria-hidden="true">🌙</span>'; themeToggle.title = isDark ? 'Светлая тема' : 'Тёмная тема'; }; applyThemeIcon(); themeToggle.addEventListener('click', function() { const isDark = document.documentElement.getAttribute('data-theme') === 'dark'; if (isDark) { document.documentElement.removeAttribute('data-theme'); localStorage.setItem('shablonix-theme', 'light'); } else { document.documentElement.setAttribute('data-theme', 'dark'); localStorage.setItem('shablonix-theme', 'dark'); } applyThemeIcon(); }); } // Мобильное меню навигации const navToggle = document.getElementById('header-nav-toggle'); const headerEl = document.querySelector('.header'); if (navToggle && headerEl) { navToggle.addEventListener('click', function() { const isOpen = headerEl.classList.toggle('nav-open'); navToggle.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); navToggle.innerHTML = isOpen ? '<i class="fas fa-times"></i>' : '<i class="fas fa-bars"></i>'; }); document.querySelectorAll('.header-nav-link').forEach(function(link) { link.addEventListener('click', function() { headerEl.classList.remove('nav-open'); navToggle.setAttribute('aria-expanded', 'false'); navToggle.innerHTML = '<i class="fas fa-bars"></i>'; }); }); } // Обработка формы поиска const searchForm = document.querySelector('.search-wrap form'); const searchInput = document.getElementById('title-search-input'); if (searchForm) { searchForm.addEventListener('submit', function(e) { e.preventDefault(); const query = searchInput.value.trim(); if (query) { // Анимация поиска searchInput.style.transform = 'scale(0.98)'; setTimeout(() => { searchInput.style.transform = ''; alert('Выполняется поиск: ' + query); }, 200); } else { searchInput.focus(); searchInput.style.border = '2px solid var(--danger-color)'; setTimeout(() => { searchInput.style.border = ''; }, 1000); } }); } // Добавление товара в корзину const cartCounter = document.querySelector('.header-cart-counter'); let cartCount = 0; // Анимация счетчика function animateCounter() { cartCounter.style.transform = 'scale(1.3)'; setTimeout(() => { cartCounter.style.transform = ''; }, 300); } // Клик по товару const itemBlocks = document.querySelectorAll('.item-block'); itemBlocks.forEach(item => { item.addEventListener('click', function(e) { // Проверяем, что клик не по ссылке внутри блока if (e.target.tagName === 'A' || e.target.closest('a')) return; e.preventDefault(); const productName = this.querySelector('.item-name-text').textContent; const productPrice = this.querySelector('.item-price, .item-price-free').textContent; // Обновляем счетчик корзины cartCount++; cartCounter.textContent = cartCount; animateCounter(); // Показываем уведомление showNotification('Товар "' + productName + '" добавлен в корзину!'); // Анимация добавления this.style.boxShadow = '0 0 0 3px var(--success-color)'; setTimeout(() => { this.style.boxShadow = ''; }, 500); }); }); // Функция показа уведомления function showNotification(message) { const notification = document.createElement('div'); notification.innerHTML = ` <div style=" position: fixed; top: 20px; right: 20px; background: linear-gradient(135deg, var(--success-color), #68D391); color: white; padding: 15px 25px; border-radius: var(--border-radius); box-shadow: var(--shadow); z-index: 9999; display: flex; align-items: center; gap: 10px; animation: slideIn 0.3s ease; "> <i class="fas fa-check-circle"></i> ${message} </div> `; document.body.appendChild(notification); setTimeout(() => { notification.style.animation = 'slideOut 0.3s ease'; setTimeout(() => { notification.remove(); }, 300); }, 3000); } // Добавляем стили для анимаций уведомлений const style = document.createElement('style'); style.textContent = ` @keyframes slideIn { from { transform: translateX(100%); opacity: 0; } to { transform: translateX(0); opacity: 1; } } @keyframes slideOut { from { transform: translateX(0); opacity: 1; } to { transform: translateX(100%); opacity: 0; } } `; document.head.appendChild(style); // Мобильное меню — тап раскрывает подкатегории document.querySelectorAll('.left-menu-item.has-children').forEach(item => { item.addEventListener('click', function(e) { if (window.innerWidth > 992) return; const dropdown = this.querySelector('.subcategory-dropdown'); if (!dropdown) return; const isOpen = dropdown.style.display === 'block'; // Закрываем все document.querySelectorAll('.subcategory-dropdown').forEach(d => d.style.display = 'none'); if (!isOpen) { dropdown.style.display = 'block'; dropdown.style.position = 'static'; dropdown.style.boxShadow = 'none'; dropdown.style.border = 'none'; dropdown.style.borderLeft = '3px solid var(--primary-color)'; dropdown.style.borderRadius = '0'; e.preventDefault(); } }); }); }); </script> </body> </html>