Часто перед разработчиком стоит задача установить определенный элемент на сайте, который случайным образом выводит информацию. Будь то коллаж в шапке, изречения философов и т.д. Задача тривиальная, но для обычных языков программирования, а если вожможности использовать их нет? Java Script не в счет, зависеть от настроек пользователя в таких задачах - не кошерно. На помощь приходит SSI, хотя, положа руку на сердце, это не те задачи, которые должен выполнять.
Итак, что у нас есть, и что можно сделать:
SSI не может получить список файлов (элементов) из папки, поэтому будем список указывать в коде не динамично;
В SSI нет массивов, значит будем делать превдо массив из переменных;
В SSI нет математических функций, зато есть конкатенация и регулярные выражения;
Нет математики, но есть время, случайное число можно выбирать из секунд (кстати функция rand во многих языках программирования работает именно от времени);
Так как в SSI мы не можем указать диапазон случайной выборки, диапазонами может быть секунды в пределах десятка (10 элементов), в пределах минуты (60 элементов), в пределах сотни (100 элементов), и т.д.;
Ввиду того, что в SSI нет циклов, скрипт должен быть линейным в один проход, будет куча copy/past;
Вот такие дела. Ограничение элементов по количеству элементов - не так страшно, мы же не космический корабль делаем, а все таки костыль. Еще добавок, мы должны иметь полный список элементов, т.е. без пробелов. По ходу проявляется алгоритм:
Проверяем какие есть элементы, а каких нет;
Заполняем недостающие элементы последовательностью из существующих;
В SSI нет математических функций, зато есть конкатенация и регулярные выражения;
Выбираем соответсвующий элемент относительно секунд;
Использовать будем как внешнюю компоненту, т.е. определяем список, вызываем копоненту, получаем переменную:
Компоненту рекомендую делать на 10 элементов, она объемом 14 Кб, а на 60 элементов уже больше 500 Кб, вот так-то (хотя надо подумать над оптимизацией еще).
Компонента:
Конечно, вероятность получения элементов сильно зависит от общего количества элементов, так для списка из трех 9 элементов мы получим последовательность
RND_0 => Значение 0;
RND_1 => Значение 1;
RND_2 => Значение 2;
RND_3 => Значение 3;
RND_4 => Значение 4;
RND_5 => Значение 5;
RND_6 => Значение 6;
RND_7 => Значение 7;
RND_8 => Значение 8;
RND_9 => Значение 0;
Как видно, вероятность показа переменной RND_0 - 1/5, а всех остальных - 1/10.
Еще, после того как компонента отработает, она оставляет за собой много пустых строк, но это можно исправить путем склеивания всех строк компоненты в одну.