Всего 125 007 комментариев

Артур Шевченко
01 июня 2025, 09:16
0
А кто-то когда-то вообще делал ручной перевод?
Я сейчас работаю с сайтом где 36 контекстов и 10 языковых версий, все переводы сделаны вручную. Babel там не используется ибо незачем. Ресурсы можно связать по псевдониму или заморозив uri. Синхронизацию полей, если она нужно, можно написать самостоятельно, там ничего сложного.
Артур Шевченко
01 июня 2025, 09:10
0
Ну да, придумано. Можно было изначально сгруппировать соцсети в поле типа migx и тогда проверка значительно упростилась бы. Наконец, можно добавить ещё одно поле «Не показывать соцсети» и если оно true то скрывать блок вне зависимости от того заполнен он или нет.
Олег
01 июня 2025, 01:19
0
Это логично. Но как это реализовать? Можно нагородить сниппет, в котором посчитать пустые поля и если их количество не совпадет с известным общим количеством, тогда выводить блок.
Но наверняка уже все придумано
Роман
31 мая 2025, 16:11
0
Век живи, век учись. Спасибо большое за помощь
Артур Шевченко
31 мая 2025, 16:00
0
Вроде логично: проверить на пустоту все ТВ и есть все пустые не показывать блок.
Павел Романов
31 мая 2025, 15:29
1
+1
Укажите для этого TV на вкладке «Параметры вывода» тип «Разделитель» и в качестве него поставьте ||.
Сергей Сергеевич
31 мая 2025, 12:39
0
Хорошая идея, так как я вижу по вебвизору на десктопе много людей смотрят сайт не кликая на закрытие плашки с уведомлением о куки. Т.е если с самого начала не загружать метрику, то я бы их не видел…
Miša Bulic
30 мая 2025, 20:49
0
при отложенной загрузке аналитики у вас метрика рекламы отвалится. Нужно при загрузке страницы нормально загрузать скрипт и потом уже отключать если не хотят.
Николай Савин
30 мая 2025, 19:57
0
Пишется небольшой сниппет, который получает список «непустых» категорий. Перечень ID кладем в плейсхолдер.
Запускаем сниппет ДО вызова pdoMenu
В pdoMenu — дописываем параметр resources и вставляем в него плейсхолдер из шага выше
Артур Шевченко
30 мая 2025, 18:05
0
// Дополнительно: скрытие при клике вне блока
                document.addEventListener('click', function(e) {
                    if (!cookieMessage.contains(e.target) && e.target !== cookieMessage) {
                        cookieMessage.style.opacity = '0';
                        setTimeout(() => {
                            cookieMessage.style.display = 'none';
                        }, 300);
                    }
                });
А вот это зачем?
Андрей Степаненко
30 мая 2025, 08:11
+2
Оба вариант что выше, не работают)))

перегенерировал
<style>
        .cookie-message {
            position: fixed;
            z-index: 1000;
            bottom: 20px;
            left: 20px;
            right: 20px;
            max-width: 350px;
            padding: 0;
            font-family: Arial, sans-serif;
            animation: fadeIn 0.5s ease-in-out;
            display: none;
        }
        
        @keyframes fadeIn {
            from { opacity: 0; transform: translateY(20px); }
            to { opacity: 1; transform: translateY(0); }
        }
        
        .cookie-message-inner {
            display: grid;
            justify-items: start;
            grid-gap: 15px;
            font-size: 14px;
            padding: 20px;
            line-height: 1.5;
            background-color: #fff;
            border-radius: 10px;
            box-shadow: 0 5px 15px 0px rgba(0, 0, 0, 0.15);
        }
        
        .cookie-message-text {
            color: #5a5a5a;
        }
        
        .cookie-message-link {
            color: #01356f;
            text-decoration: underline;
        }
        
        .cookie-message-inner .button {
            background: #e1e1e1;
            color: #878787;
            border: none;
            padding: 8px 20px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 14px;
            transition: all 0.3s ease;
        }
        
        .cookie-message-inner .button:hover {
            background-color: #01356f;
            color: #fff;
        }
        
        @media (max-width: 480px) {
            .cookie-message {
                max-width: 100%;
                left: 10px;
                right: 10px;
                bottom: 10px;
            }
        }
    </style>

    <!-- Основное содержимое вашего сайта -->
    
    <!-- Блок уведомления о cookies -->
    <div class="cookie-message js-cookie-message">
        <div class="cookie-message-inner">
            <div class="cookie-message-text">
                Наш сайт использует cookies, включая сервисы веб-аналитики (файлы с данными о прошлых посещениях сайта). Продолжая пользоваться сайтом, вы соглашаетесь с
                <a href="/privacy-policy" class="cookie-message-link">политикой конфиденциальности</a>.
            </div>
            <button class="btn button js-cookie-message-confirm">Принять</button>
        </div>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            // Проверяем, было ли уже принято соглашение
            if (!localStorage.getItem('cookieAccept')) {
                const cookieMessage = document.querySelector('.js-cookie-message');
                
                // Показываем сообщение
                cookieMessage.style.display = 'block';
                
                // Обработчик для кнопки подтверждения
                document.querySelector('.js-cookie-message-confirm').addEventListener('click', function(e) {
                    // Сохраняем согласие в localStorage
                    localStorage.setItem('cookieAccept', '1');
                    
                    // Скрываем сообщение с анимацией
                    cookieMessage.style.opacity = '0';
                    setTimeout(() => {
                        cookieMessage.style.display = 'none';
                    }, 300);
                });
                
                // Дополнительно: скрытие при клике вне блока
                document.addEventListener('click', function(e) {
                    if (!cookieMessage.contains(e.target) && e.target !== cookieMessage) {
                        cookieMessage.style.opacity = '0';
                        setTimeout(() => {
                            cookieMessage.style.display = 'none';
                        }, 300);
                    }
                });
            }
            
            // Проверяем, нужно ли загружать аналитику
            if (localStorage.getItem('cookieAccept')) {
                loadAnalytics();
            }
        });
        
        // Функция для загрузки аналитики (пример)
        function loadAnalytics() {
            console.log('Loading analytics...');
            // Здесь можно добавить код для загрузки Google Analytics, Yandex.Metrika и т.д.
        }
    </script>
Ivan K.
29 мая 2025, 16:19
0
Данная версия будет бесплатной всегда, задумывал ее как базовую версию. Я скоро выпушу платный вариант с расширенным функционалом, где будет возможность использовать другие базы ip.
Дима Касаткин
29 мая 2025, 14:25
0
Респект автору за подход: описание, документация (в части и полноты и оформления)!
Будем пробовать!

И хотел уточнить, это opensource? Для своих клиентов я бы допилил поддержку sxgeo, т.к. он уже используется на проекте, чтобы не тащить дополнительную базу GeoIP и по ней не искать 2 раза.

P.S. Открой приём донатов в профиле на modx.pro!
Nikita
29 мая 2025, 10:09
0
Подскажите, пожалуйста, кто-то решил данную задачу? Актуально, не могу придумать как… ((((
Сергей Карпович
29 мая 2025, 10:05
+1
Спасибо, эта тема уже поднималась, когда только за куки нахлобучивали, с тех пор использую такой вариант:
<style>
    .cookie-message {
        position: fixed;
        z-index: 100;
        bottom: 0;
        left: 0;
        max-width: 350px;
        padding: 0 20px 20px;
    }
    .cookie-message-inner {
        display: grid;
        justify-items: start;
        grid-gap: 10px;
        font-size: 14px;
        padding: 30px;
        line-height: 1.3;
        background-color: #fff;
        border-radius: 10px;
        box-shadow: 0 5px 15px 0px rgba(0, 0, 0, 0.1);
    }
    .cookie-message-text {
        flex-grow: 2;
        color: #8d949e;
    }
    .cookie-message-inner .button{
        background: #e1e1e1;
        color: #878787;
    }
    .cookie-message-inner .button:hover{
        background-color: #01356f;
        color: #fff;
    }
</style>

<div class="cookie-message js-cookie-message" hidden>
    <div class="container">
        <div class="cookie-message-inner">
            <div class="cookie-message-text">
                Наш сайт использует сооkiе в том числе сервисов Веб-аналитики (файлы с данными о прошлых посещениях сайта). Продолжая пользоваться сайтом, вы соглашаетесь с 
                <a data-fancybox data-type="ajax" data-src="{198 | url}" data-filter="#content">политикой конфиденциальности</a>.
            </div>
            <button class="button js-cookie-message-confirm">ОК</button>
        </div>
    </div>
</div>

<script>
    if (!localStorage.getItem('cookieAccept')) {
        const el = document.querySelector('.js-cookie-message');
        el.style.display = 'block';
        el.querySelector('.js-cookie-message-confirm').addEventListener('click', (e) => {
            localStorage.setItem('cookieAccept', 1);
            el.style.display = 'none';
        }, true);
    }
</script>
Все запихано в один чанк и выведено на всех страницах
Артур Шевченко
29 мая 2025, 07:59
+2
Ну вот, а говорят Modx умер, заметок новых нет, компонентов новых нет. А я же знаю, что врут. Modx жил, Modx жив, Modx будет жить!

Теперь по делу. Судя по описанию мощный инструмент защиты, а хорошая защита сайта это всегда актуально. Отдельное спасибо за поддержку второй версии Modx.
Павел
29 мая 2025, 06:54
0
Ок, спасибо
Александр
28 мая 2025, 21:01
+1
А не планируется под MODX 2 подобное выкатить?
Сергей Уткин
28 мая 2025, 17:44
0
Данная проблема была на двух сайтах на reg.ru около 2 месяцев назад, высокая нагрузка на ЦП, решалось удалением папок и файлов observer, через top находил файл php, который вызывал процесс с высокой загрузкой. Нужно было быстро удалять одновременно и файл и убивать процесс, иначе новый создавал.
В итоге для одного сайта вся история повторялась снова пока на другой хостинг рег ру не перенесли, а для второго разово помогло.

И вот сейчас снова проблема на хостинге таймвеб на другом сайте, правда пока только файлы вредоносные появились, загрузка ЦП по крайней мере в top не показывается высокая и панели управления.

В одном из файлов папки observer было упоминание пути tinymce/action.php, буду туда копать (саму папку удалил уже, так что без конкретики)