Как скрыть пустой select в Joomla при печати

    При разработке на CMS Joomla часто возникает задача стилизации кастомного выпадающего списка с множественным выбором (мультивыбор). Особенно остро стоит вопрос: как скрыть пустой элемент <select> при печати страницы, если в нём нет динамических классов, показывающих количество выбранных опций. Стандартный CSS-псевдокласс :empty не работает для тега <select>, даже если в нём нет выбранных элементов. Разберём причины и предложим надёжные решения.

    Почему select:empty не работает

    Псевдокласс :empty в CSS предназначен для элементов, у которых нет дочерних узлов (включая текстовые). Однако тег <select> всегда содержит как минимум один дочерний элемент - <option>. Даже если у вас пустой список опций, в DOM-дереве присутствует элемент <option>, поэтому браузер не считает <select> пустым. Это объясняет, почему select:empty { display: none; } не срабатывает.

    Рабочие способы скрыть пустой select

    1. JavaScript проверка при печати

    Самый надёжный метод - использовать JavaScript для анализа количества выбранных опций прямо перед печатью. В Joomla часто применяются кастомные JS-библиотеки для мультивыбора, поэтому можно повесить обработчик на событие beforeprint.

    window.addEventListener('beforeprint', function() {
        var selects = document.querySelectorAll('select[multiple]');
        selects.forEach(function(select) {
            var selectedCount = select.selectedOptions.length;
            if (selectedCount === 0) {
                select.style.display = 'none';
            } else {
                select.style.display = '';
            }
        });
    });
    window.addEventListener('afterprint', function() {
        var selects = document.querySelectorAll('select[multiple]');
        selects.forEach(function(select) {
            select.style.display = '';
        });
    });

    Этот скрипт скрывает пустые поля <select> только при печати, а после завершения печати возвращает их видимость.

    2. CSS-медиа-запрос print с дополнительным классом

    Если вы можете модифицировать шаблон Joomla, добавьте в разметку условный класс. Например, при рендеринге поля проверяйте количество выбранных значений на сервере (PHP) и присваивайте класс empty-select. Затем в CSS пропишите:

    @media print {
        select.empty-select {
            display: none;
        }
    }

    Этот подход требует доработки кода компонента или модуля, но он полностью исключает использование JavaScript.

    3. Использование атрибута data-* и CSS attr()

    Можно динамически проставлять атрибут data-count через JS при изменении выбора. После этого в CSS используйте:

    @media print {
        select[data-count='0'] {
            display: none;
        }
    }

    Этот метод удобен, если вы уже используете JavaScript для управления мультивыбором в Joomla.

    Особенности реализации в Joomla

    В Joomla кастомный select с мультивыбором часто создаётся через системные плагины или расширения (например, Chosen или Select2). В таких случаях оригинальный элемент <select> может быть скрыт, а отображается его JS-копия. Тогда вам нужно скрывать именно визуальный контейнер, а не сам <select>. Проверьте, какой DOM-элемент отвечает за отображение списка, и применяйте скрипты к нему.

    Заключение

    Скрыть пустой <select> в Joomla при печати стандартным CSS-псевдоклассом :empty невозможно из-за особенностей DOM. Используйте JavaScript-обработчики событий печати, серверную проверку с добавлением класса или динамические атрибуты данных. Выберите метод, который лучше всего вписывается в архитектуру вашего сайта на Joomla.

    Часто задаваемые вопросы