Все, кто работает c djemscript, рано или поздно приходят к отцам-создателям, с просьбой внедрить в язык процедуры, функции и макросы.
Тут я попробую описать то, как это можно реализовать существующими средствами djemscript на примере простой задачи.
Есть строка, в дибилоформате:
<set str = 'тЕсТоВаЯ сТрОКа'>
Нужно первую букву сделать заглавной, остальные буквы строчными, но в djemscript есть только методы ucase и lcase, а аналога php-шного ucfirst нет.
Попробуем его сделать.
Создаем документ с путем ‘main.system.djemscript.ucfirst’ и добавляем в него код:
<if <var[string_to_process]>>
<set string_to_process = <var[string_to_process].cut(1).ucase> ~ <var[string_to_process].cut(1, <var[string_to_process].len> - 1).lcase>>
</if>
В дизайн шаблоне пишем это:
<set str = 'тЕсТоВаЯ сТрОКа'>
<['main.system.djemscript.ucfirst']._dtpl.eval('str=>string_to_process', 'str<=string_to_process')>
<var[str]>
При интерприкации шаблона djemserver'ом, он заберет дизайн-шаблон документа ‘main.system.djemscript.ucfirst’ и выполнит его, при этом передав значение из локальной переменной ‘str’ текущего дизайн-шаблона во внутреннюю переменную ‘string_to_process’ подгруженного дизайн шаблона. По завершении работы в переменную ‘str’ будет записано значение переменной ‘string_to_process’ из подгруженного дизайн-шаблона.
Можно не создавать отдельный дизайн шаблон, а сохранить инструкции в переменную.
То есть код будет такой:
<set ucfirst = '
<nodjemscript>
<if <var[string_to_process]>>
<set string_to_process = <var[string_to_process].cut(1).ucase> ~ <var[string_to_process].cut(1, <var[string_to_process].len> - 1).lcase>>
</if>
</nodjemscript>
'>
<var[ucfirst].eval('str=>string_to_process', 'str<=string_to_process')>
<var[str]>
И в первом и во втором случае в результате работы в переменную `str` будет записана строка:
Тестовая строка