Содержание
Задача
Нужно вывести один блок шаблона (например, форму, баннер, текст) только на страницах с определёнными номерами: page3, page4 … page78.
На всех остальных страницах должен выводиться другой блок.
Такая задача встречается часто: показать другую форму только на нужных страницах, выводить иной текст, менять футер, включать баннеры для определённых URL и так далее.
Почему перечисление страниц — неправильный вариант
Некоторые пытаются сделать условие так:
<?if( $URI_ID$='page3' or $URI_ID$='page4' or $URI_ID$='page5' or ... $URI_ID$='page78' )?> $MFORM_1$ <?else?> $MFORM_3$ <?endif?>
Проблемы такого подхода:
- Код получается огромным и неудобным для чтения.
- При малейшей ошибке или удалённой странице условие ломается.
- Если одна из страниц закрыта правами — проверка может перестать работать.
- Добавление или удаление страниц требует вручную редактировать десятки строк.
На больших списках (20–100 страниц) такое условие превращается в невозможный для поддержки «комбайн».
Как должен работать правильный подход
Страницы типа page3, page4, page78 имеют в $URI_ID$ следующий формат:
pageX pageXX
То есть строка всегда начинается с page, а после неё идёт номер страницы.
Если вырезать первые четыре символа («page»), останется только число:
substr($URI_ID$,4)
Примеры:
- $URI_ID$='page3' → substr(...)=3
- $URI_ID$='page12' → 12
- $URI_ID$='page78' → 78
Теперь можно сравнивать это значение как число и проверять диапазон.
Универсальное решение
Показывать блок на страницах с 3 по 78:
<?if(substr($URI_ID$,4)>=3 and substr($URI_ID$,4)<=78)?> $MFORM_1$ <?else?> $MFORM_3$ <?endif?>
Подробное объяснение по пунктам
1. substr($URI_ID$,4)
Обрезает первые четыре символа строки page.
Остаётся только число страницы — оно и используется в сравнении.
2. Сравнение диапазона
>=3 — номер страницы должен быть не меньше 3.
<=78 — номер страницы должен быть не больше 78.
То есть условие будет истинным на всех страницах от:
page3 page4 ... page78
3. Блоки в условии
Если условие совпало — показывается $MFORM_1$.
Если нет — показывается $MFORM_3$.
Дополнительные примеры использования
Показать блок на страницах с 5 по 15
<?if(substr($URI_ID$,4)>=5 and substr($URI_ID$,4)<=15)?> <!-- ваш контент --> <?endif?>
Показать блок только на страницах с номером больше 20
<?if(substr($URI_ID$,4)>20)?> <!-- контент --> <?endif?>
Показать блок только на страницах до 10
<?if(substr($URI_ID$,4)<=10)?> <!-- контент --> <?endif?>
Показать блок на страницах, кроме 1-й
<?if(substr($URI_ID$,4)!=1)?> <!-- контент --> <?endif?>
Показать блок только на чётных страницах
<?if(substr($URI_ID$,4)%2=0)?> <!-- чётные --> <?endif?>
Показать блок на страницах, которые делятся на 5
<?if(substr($URI_ID$,4)%5=0)?> <!-- каждая пятая страница --> <?endif?>
Как адаптировать под любую структуру URL
Если страницы имеют вид:
- page3 → работает сразу
- page12 → работает сразу
- files-15 → можно использовать substr($URI_ID$,6)
- news25 → можно использовать substr($URI_ID$,4)
Если структура другая — правится только число в substr.
Важные нюансы
- Условные операторы работают только в шаблонах модулей, а не в статических страницах вида index.html.
- Все страницы внутри диапазона должны быть доступны по правам.
- Если какая-либо страница закрыта или удалена — условие может работать некорректно.
- $URI_ID$ должен содержать ID страницы в стандартном виде (pageX).
Итог
Использование substr() позволяет не перечислять десятки страниц вручную.
Код становится компактным, управляемым и легко адаптируемым под любые диапазоны и любые задачи.
Это решение полностью избавляет от длинных цепочек or и позволяет надёжно выводить любой блок только на нужных страницах.
Лицензия: CC BY-SA 4.0
Автор: Юрий Герук
Комментарии