Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > CGI скрипт с применением SSI


Автор: MacTep 12.12.2006, 09:31
Нужно написать CGI скрипт, который бы выводил время при помощи технологии SSI. Вот мой код, но он не работает. Подскажите, что не так?
Код

#!/usr/bin/perl -w
print "Content-Type: text/html\n\n";
print "<html>";
print "<br><br><br><br>";
print "<h2 align=center>THIS IS MY <u>SECOND</u> CGI PAGE</h2><br>";
print "<hr width='50%'>";
$data = $ENV{<!--echo var="DATE_LOCAL"-->};
print "Время: $data";

Автор: Ramirez 12.12.2006, 10:18
ээээ.... судя по вашему коду вы пытаетесь сделать все наоборот...

как это обычно работает:

у вас есть html документ с расширением .shtml (обычно), типа:
Код

<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>

<BODY>

Текущее время:

<!--#include virtual="/cgi-bin/date.pl" -->


</BODY>
</HTML>


и есть скрипт date.pl:
Код

#!/usr/bin/perl
print "Content-Type: text/html\n\n";
($mm,$hh) = (localtime)[1,2];
print "$hh : $mm";





Автор: MacTep 12.12.2006, 10:57
А такой конструкцией я разве пользоваться не могу? 
<!--echo var="DATE_LOCAL"-->
Или только в html документах? А в самом скрипте не получится?

Автор: MaxPayne 12.12.2006, 17:06
1) Ты определись что тебе надо - или дата созданий документа или текущее время.
2) Если текущее время, то:
 - на странице вставляешь такую конструкцию: <!--#include virtual="/cgi-bin/jd.cgi"-->
 - сам скрипт jd.cgi выглядит так:

Код

#!/usr/bin/perl
use CGI qw(:all);

($second,$minute,$hour,$day,$month,$year)=localtime;
$year+=1900;
$month++;

print header;
print "$hour:$minute:$second";


Он должен выводить типа "22:00:25". Можете естественно сделать любое размещение инфы.




3) Вот эта конструкция вроде для PHP скриптов <!--echo var="DATE_LOCAL"-->.

Автор: Ramirez 13.12.2006, 10:06
MaxPayne, не путайте человека.

эта конструкция <!--echo var="DATE_LOCAL"-->

для тех случаев когда вы в один файл инклудите другой, и надо передать в него какие-то переменные, например есть шапка header.shtml:

Код

<HTML>
<HEAD>
<TITLE> <!--#echo var="PAGE_TITLE" --> </TITLE>
</HEAD>

<BODY>


и есть, например index.shtml

Код

<!--#set var="PAGE_TITLE" value="ЭТО ЗАГОЛОВОК СТРАНИЦЫ" -->
<!--#include virtual="/includes/header.shtml" -->

а тут идет текст страницы или что угодно...



так вот, когда вы браузером запросите index.shtml, веб сервер включит в него код из файла header.shtml
но сналала он возьмет переменную PAGE_TITLE (обозначенную в index.shtml)
<!--#set var="PAGE_TITLE" value="ЭТО ЗАГОЛОВОК СТРАНИЦЫ" -->

и вставит ее значение в соотв. место в header.shtml

Кстати, конструкция <!--#echo var="DATE_LOCAL" --> выведет текущую дату автоматически без каких либо дополнительных скриптов (если конечно переменную DATE_LOCAL не переопределить), т.к. DATE_LOCAL - это одна из встроенных переменных ssi.

SSI очень удобен например, для вывода повторяющихся элементов кода (ленты новостей например) шаблон новости один, а на странице новостей вы пишете что-то типа:

Код

<!--#set var="NEWS_DATE" value="01.10.2005" -->
<!--#set var="NEWS_TITLE" value="заголовок 1" -->
<!--#set var="NEWS_TEXT" value="текст новости" -->
<!--#include virtual="/ssi/news_item.shtml" -->

<!--#set var="NEWS_DATE" value="28.09.2005" -->
<!--#set var="NEWS_TITLE" value="заголовок 2" -->
<!--#set var="NEWS_TEXT" value="текст новости 2" -->
<!--#include virtual="/ssi/news_item.shtml" -->


т.е. перед каждым включением шаблона news_item.shtml задаются необходимые ему переменные.


MacTep, теоретически, вы может и сможете можете настроить апач таким образом чтобы вывод скрипта потом еще обрабатывался через ssi (не факт конечно, не проверял) и тогда вы сможете использовать в выводе скрипта конструкции типа <!--#echo var="PAGE_TITLE" --> но это будет МЕГА ИЗВРАТ. Зачем тогда перл вообще? Эти переменные предназначены для случая когда вы работаете со статичными шаблонами. 

Вообще, много того, что делается чаще скриптами, для мелких проектов, можно сделать с помощью ssi. Там даже простейшая логика есть:

Код

<!--#if expr="$PAGE_TITLE" -->
<div class="page-title"><!--#echo var="PAGE_TITLE" --></div>
<!--#endif -->


а вообще, http://httpd.apache.org/docs/2.0/howto/ssi.html

Автор: korob2001 13.12.2006, 10:54
Не пойму одного, зачем здесь вообще нужен SSI?  smile 
Код

$date = localtime;  # Если здесь нужно текущее серверное время, всё остальное без изменений

Если же нам нужно какое-нить другое значение, его с таким же успехом можно присвоить переменной и генерировать не тег SSI, а конкретное значение. Ведь страница HTML генерируется программой Perl от начала до конца.

Автор: MacTep 14.12.2006, 11:30
Спасибо всем за ответы. smile SSI нужен был для того, что нужно было показать его использование в лабораторной работе. smile Все сделано. Спасибо! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)