Главная  /  Правка  /  История  /   /  Область пользователей

Темплейты: Управление потоком (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. Вы можете определить условия:

Блок 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.

Проверка типов

Система темплейтов использует один из следующих методов автоматического определения типов:

  1. C++0x auto
  2. C++0x decltype
  3. 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 %>

Проект

CppCMS является основой веб-разработки для выполнения ресурсоемких приложений.

Размещение

SourceForge.net Logo

Поддержать проект

CppCMS needs You


Навигация

Главная страница



Валидация CSS | Валидация XHTML 1.0