Примеры использования

Далее - примеры использования Rivet. Подразумевается что читатель имеет некоторые знания Tcl. Если же вы его не знаете - не волнуйтесь, это простой язык, и множество как минимум англоязычной документации и учебников доступно в сети. Посмотрите например сюда .

Пример 1. Hello World

Естественно, первым примером будет "Hello World".

Мы предполагаем что к этому моменту Apache сконфигурирован и понимает .rvt файлы, создадим файл hello.rvt в месте где Apache сможет его найдти со следующим содержимым:

<?
puts "Hello World"
?>

Если вы обратитесь к этому файлу через броузер, вы должны увидеть практически чистую страницу с надписью "Helo World" (без кавычек).

Пример 2. Создание таблицы

В следующем, тоже простом примере мы покажем как создать таблицы:

<? puts "<table>\n"
for {set i 1} { $i <= 8 } {incr i} {
    puts "<tr>\n"
    for {set j 1} {$j <= 8} {incr j} {
        set num [ expr $i * $j * 4 - 1]
        puts [ format "<td bgcolor=\"%02x%02x%02x\" > $num $num $num </td>\n" \
		   $num $num $num ]
    }
    puts "</tr>\n"
}
puts "</table>\n" ?>

Если вы вчитаетесь в код, то убедитесь что это чистейший Tcl. Мы можем запустить этот код и вне Rivet - и он будет генерировать такой же HTML!

Результат должен быть похож на:

Пример 3. Доступ к переменным

А тут мы продемонстрируем как обращаться с переменными переданными вам методом POST или GET.

Из такой HTML формы:

     <form action="vars.rvt">
      <table>
	<tbody>
	  <tr>
	    <td><b>Title:</b></td>
	    <td><input name="title"></td>
	  </tr>
	  <tr>
	    <td><b>Salary:</b></td>
	    <td><input name="salary"></td>
	  </tr>
	  <tr>
	    <td><b>Boss:</b></td>
	    <td><input name="boss"></td></tr>
	  <tr>
	    <td><b>Skills:</b></td>
	    <td>
	      <select name="skills" multiple="multiple">
		<option>c</option>
		<option>java</option>
		<option>Tcl</option>
		<option>Perl</option>
	      </select>
	    </td>
	  </tr>
	  <tr>
	    <td><input type="submit"></td>
	  </tr>
	</tbody>
      </table>
    </form>

Мы можем использовать rivet скрипт чтобы получить доступ к этим переменным:

<?
set errlist {}
if { [var exists title] } {
    set title [var get title]
} else {
    set errlist "You need to enter a title"
}

if { [var exists salary] } {
    set salary [var get salary]
    if { ! [string is digit $salary] } {
	lappend errlist "Salary must be a number"
    }
} else {
    lappend errlist "You need to enter a salary"
}

if { [var exists boss] } {
    set boss [var get boss]
} else {
    set boss "Mr. Burns"
}

if { [var exists skills] } {
    set skills [var list skills]
} else {
    lappend errlist "You need to enter some skills"
}

if { [llength $errlist] != 0 } {
    foreach err $errlist {
	puts "<b> $err </b>"
    }
} else {
    puts "Thanks for the information!"
    ?>
    <table>
      <tbody>
	<tr>
	  <td><b>Title:</b></td>
	  <td><? puts $title ?></td>
	</tr>
	<tr>
	  <td><b>Boss:</b></td>
	  <td><? puts $boss ?></td>
	</tr>
	<tr>
	  <td><b>Salary:</b></td>
	  <td><? puts $salary ?></td>
	</tr>
	<tr>
	  <td><b>Skills:</b></td>
	  <td><? puts $skills ?></td>
	</tr>
      </tbody>
    </table>
    <?
}
?>

Первый оператор проверяет что переменная boss была переданна скрипту, и потом что-то делает с этой информацией. Если же такой нет - то в список ошибок добавляется сообщение об этом прискорбном факте.

Во втором куске кода, переменная salary обрабатывается примерно таким же образом, и к тому же еще и проверяется на то является ли она числом.

Если переменная boss не введена - то она заменяется на "Mr. Burns".

А последний кусок кода немножко хитрее, потому что переменная skills - это listbox, и в принципе может иметь несколько значений, и тут мы покажем как с ними поступать.

Скрипт далее проверяет что errlist пустой (а если нет - то информирует вас об ошибках) и говорит что спасибо и все такое.

Пример 4. Закачка файлов (Upload)

Пусть есть такой HTML код upload.html

<form action="foo.rvt" enctype="multipart/form-data" method="post">
<input type="file" name="MyUpload"></input>
<input type="submit" value="Send File"></input>
</form>

Из такого Tcl кода, например, (под названием upload.rvt) мы получаем доступ к загруженному файлу.

<?
upload save MyUpload /tmp/uploadfiles/file1
puts "Saved file [upload filename MyUpload] \
	([upload size MyUpload] bytes) to server"
?>