Темплейты: Управление потоком (v 1.x)
Условия
Синтаксис
Начало или продолжение условного оператора:
( 'if' | 'elif' ) [ 'not' ] [ 'empty' ] ( VARIABLE | 'rtl' ) ( 'if' | 'elif' ) '(' any-c++-expression ')'
Блок else:
'else'
Каждый блок if/else должен заканчиваться оператором end
. Например:
<% if not empty username %> <h1>Hello <% username %></h1> <% else %> <h1>Hello Visitor</h1> <% end %> <% if ( content.n % 2==0 ) %> <% n %> is odd. <% elif ( content.n % 3 ==0) % > <% n %> can be divided by 3 without reminder. <% end %>
Описание
Это обычный оператор if
/else if
. Вы можете определить условия:
- Указанием переменной или сойства, проверяемых на истинность (true - прим. пер.).
- Указанием ключевого слова
empty
- можно проверить, является ли специфичный STL-контейнер пустым, вызвав его функцию-членempty()
. - Вы можете инвертировать результат с помощью
not
. - Вы также можете проверить, ссылается ли текущая локаль на язык Right-To-Left, такой как Hebrew, Arabic или Persian, указав ключевое слово
rtl
. Это условие фактически проверяет в словаре переводится ли строка "LTR" как "RTL". - Вы можете указать произвольное условное выражение C++ в круглых скобках
()
. примечание: Не забудьте при ссылках на переменные содержимого темплейта использовать префиксcontent.
.
Блок foreach
Синтаксис
Основной цикл:
'foreach' ['as' IDENTIFIER ] NAME 'in' VARIABLE
В случае пустой коллекции:
'empty'
Определите центральную часть:
'item' 'separator'
Например:
<% foreach student in students %> <ul> <% item %> <li><% student.id %>, <% student.name %></li> <% end %> </ul> <% empty %> <h2>No students</h2> <% end %>
Вы можете указать разделитель для элементов между блоками separator
и item
:
<% foreach student in students %> <% separator %>, <% item %><% student.name %><% end %> <% end %>
Сгенерирует список типа: "Ron, John, Moshe"
Описание
Цикл foreach
создает for-цикл, итерирующий любую STL-коллекцию. Данное имя ссылается на тип, возвращаемый итератором. Например, если студенты - это std::list<student_t>
, то студент
в этом примере определяется как student_t &student
.
Проверка типов
Система темплейтов использует один из следующих методов автоматического определения типов:
- C++0x
auto
- C++0x
decltype
- GCC-стиль
typeof
или__typeof__
Хотя бы один из них должен поддерживаться компилятором для корректной генерации темплейта без использования ключевого слова as
.
Но некоторые компиляторы, наиболее известные - MSVC8, MSVC9, все еще не поддерживают автоматическое определение типов. Поэтому, должен быть четко указан конкретный тип итератора.
Например:
<% foreach student as students_type::iterator in students %>
, должен обеспечить корректное решение для компилятора MSVC и student
- будет переменной типа students_type::iterator::value_type
Тело
Оператор empty
- эквивалент "else", поэтому:
<% foreach a in b %> <ul> <% item %><% a %><% end %> </ul> <% empty %> nothing <% end %>
Генерируется в код типа:
if(!content.b.empty()) { out()<<"<ul>"; for(auto a_it=content.b.begin();a_it!=content.b.end();++a_it) { auto &a=*a_it; out()<<a; } out()<<"</ul>"; }else{ out()<<"nothing"; }
Вы должны предусмотреть блоки <% item %>...<% end %>
для каждого оператора foreach
.
Если используется separator
- он должен быть добавлен между блоками separator
и item
.
Рендеринг произвольной формы
Система форм CppCMS предоставляет несколько опций для рендеринга widget'ов форм, но иногда необходим произвольный рендеринг. В этом случае может использоваться foreach
, для итераций по cppcms::form
как по обычной коллекции.
Например, рендеринг c разделителем "новая строка":
<% foreach w in form %> <% separator %><br/><% item %> <% if w.has_message() %><% w.message() %>:<% end %> <% form input w %> <% if not w.valid() %>:<% w.error_message() %><% end %> <% end %> <% end %>