VITRAGE: Примеры
· 1. "Распорки"
· 2. Изображения
· 3. "Колонтитулы"
· 4. Ссылки
· 5. Многоязычные сайты
· 6. Организация меню
· 7. Однотипные элементы
· 8. Формы и их обработка
· 9. Случайные операции
· 10. Циклы
· 11. "Ленты" данных
· 12. Внешние скрипты
· 13. Работа с файлами
· 14. "Бесконечный копирайт"
 
Практика
· Немного о стилях парсинга
· Примеры использования
· Работающие сайты
· Хостинги
· Вопросы и ответы
· Задать вопрос
· E-mail
 
Теория
· Компиляция и установка
· Идеология VITRAGE
· Оптимизация HTML
· Создание виртуальных хостов
· Создание структуры доменов
· Ваш собственный язык гипертекстовой разметки
 
О модуле
· Что такое VITRAGE
· История модуля
· Загрузить модуль
· Документация целиком
· Загрузить документацию в формате MS Word
· Слово автора
· English version
 
Технология VITRAGE
Один из витражей города Иркутска
Исходный код
· VHTML-код этой страницы (в новом окне)
· VHTML-код файла vitrage (в новом окне)
 
· Пример 9. Случайные операции

При создании одного из сайтов перед автором модуля возникла следующая задача. "Шапка" сайта формировалась из трех изображений, для каждого из которых существовало три варианта. Эти файлы имели имена 1_1.gif, 1_2.gif, 1_3.gif, 2_1.gif, 2_2.gif, 2_3.gif, 3_1.gif, 3_2.gif и 3_3.gif (первое число в названии - номер изображения, второе - номер варианта). Необходимо было сформировать "шапку" таким образом, чтобы в ней присутствовали три разных изображения, соответствующие трем разным вариантам. Например, набор изображений 1_2.gif, 2_3.gif и 3_1.gif будет допустимым, а набор 1_3.gif, 2_2.gif и 3_3.gif - нет (в наборе присутствуют два файла третьего варианта).

Для решения этой задачи используется возможность работы VITRAGE со случайными операциями, декларируемыми атрибутом %random%.

"Зафиксируем" первые числа имен файлов, то есть будем считать заранее, что файлы в наборе называются 1_?.gif, 2_?.gif, 3_?.gif. Очевидно, что для решения задачи теперь следует лишь получить случайную комбинацию из трех чисел - 1, 2 и 3, которые "дополнят" искомые имена файлов. Допустим, что номера вариантов для трех файлов должны содержаться соответственно в переменных var1, var2 и var3.

Прежде всего, случайным образом определим, какому из файлов будет соответствовать вариант 1, предварительно проинициализировав переменные:

<%vitrage% var1="" var2="" var3="">
<%vitrage% var1=1 var2=1 var3=1 %random%=1>

В результате этих операций одна из переменных var1, var2, var3 примет значение "1", другие же переменные будут иметь значения пустых строк.

Вторым шагом присвоим значение "2" одной из оставшихся переменных. Для определения, какая из переменных уже имеет значение "1", воспользуемся атрибутом условия %parse%:

<%copy% temp1=var1 temp2=var2 temp3=var3>
<%vitrage% var1=2 var2=2 %random%=1 %parse%="$temp3$">
<%vitrage% var1=2 var3=2 %random%=1 %parse%="$temp2$">
<%vitrage% var2=2 var3=2 %random%=1 %parse%="$temp1$">

Мы не можем использовать в качестве условий значения самих переменных var1, var2 и var3, потому что, если условие будет истинным, например, в первом тэге <%vitrage%>, изменится значение одной из двух оставшихся переменных, что повлечет за собой неверное исполнение одного из следующих тэгов.

И, наконец, похожим способом присвоим оставшейся переменной значение "3":

<%vitrage% var1=3 %noparse%="$var1$">
<%vitrage% var2=3 %noparse%="$var2$">
<%vitrage% var3=3 %noparse%="$var3$">

Теперь у нас нет необходимости использовать дополнительные переменные, поскольку при любом выполнении тэгов значение "3" будет присвоено только той переменной, которая до сих пор имела значение "" (пустая строка).

Задача можно решить и с использованием датчика случайных чисел (атрибута %rand%), но в данном случае для организации логики придется описывать дополнительные тэги. Идею этого решения рассмотрим на примере двух файлов и двух вариантов (соответственно, необходимо распределить значения "1" и "2" между переменными var1 и var2).

Итак, описываем новые тэги:

<set1><%vitrage% var2=2></set1>
<set2><%vitrage% var2=1></set2>

и используем один из них после определения варианта для первого файла:

<%vitrage% %rand%=2><%vitrage% var1=$%rand%$><set$var1$>

Начиная с версии VITRAGE 1.20, исходную задачу очень легко можно решить при помощи встроенного атрибута %shuffle%:

<%vitrage% var1=1 var2=2 var3=3 %shuffle%=1>

Задача решена "в один ход". Именно это решение является рекомендуемым для тех, кто использует модуль VITRAGE версии 1.20 и выше.

Не исключены и другие решения (например, случайный выбор из полного набора комбинаций или решение с привлечением Primitive). Вообще говоря, многие практические задачи можно решить с помощью VITRAGE несколькими корректными способами.