Revision 296 (by ahitrov, 2013/03/26 17:59:01) Promosite (anthill) project source
<& comps/header.msn &>
<div align="center">
<table width="435" border="0" cellspacing="0" cellpadding="0">
	<tr>
		<td valign="top" align="left">

% if($ARGS{send_ok}) {
<table width="435" cellspacing="0" cellpadding="10" border="0">
	<tr>
		<td><img src="/i/escape/ok.jpg"></td>
		<td align=center class="text">
				Ваша анкета отправлена, спасибо за Ваше участие.
		</td>
	</tr>
</table>
% }

% if(keys(%errors) > 0) {
<table width="435" cellspacing="0" cellpadding="10" border="0">
	<tr>
		<td><img src="/i/escape/error.jpg"></td>
		<td align=center class="text">
				При заполнении анкеты произошли ошибки, неправильно заполненные поля выделены цветом.
		</td>
	</tr>
</table>
% }

% if(!$ARGS{posted} || ($ARGS{posted} && keys(%errors) > 0)) {

<form action="anket.html" method="post">
<input type="hidden" name="posted" value="1">
<table width="435" border="0" cellspacing="0" cellpadding="10">
% my $j = 0;
% foreach my $field (@fields) {
%	my $fname = (keys(%$field))[0];
		<tr bgcolor="<% color('#E9F6FE', '#ffffff') %>"  <%exists($errors{$fname}) ? 'class=required' : ''%> title="<%$errors{$fname}%>">
		<td valign="top" class="text" <% $j == 10 ? ' colspan=2 ' : undef %>><%$fname%>

% if($j != 10) {
		</td><td valign="top" class="text">
% } else { 
	<br><div id="list"><ul>
%}
%	my $index = 1;
%		foreach my $fields (@{$field->{$fname}}) {
%			if($fields->{type} eq 'textarea') {
					<textarea name="<%$fields->{name}%>" rows="<%$fields->{rows}%>"><%$ARGS{$fields->{name}}%></textarea>
%			} elsif($fields->{type} ne 'text') {
%					my $label_id = int rand(999);
%					my @options = ref($ARGS{$fields->{name}}) ? @{$ARGS{$fields->{name}}} : $ARGS{$fields->{name}};
%					my $checked;
%					for my $idx (@options) {
%						if($index == $idx) { $checked = 'checked'; last }
%					}
				<% $j == 10 ? '<li>' : undef %><input id="l<%$label_id%>" type="<%$fields->{type}%>" name="<%$fields->{name}%>" value="<%$index%>" style="<%$fields->{style}%>" <%$checked%>><label for="l<%$label_id%>" >&nbsp;<%$fields->{text}%><br></label><% $j == 10 ? '</li>' : undef %>
%			} else {
%					my $value = $ARGS{$fields->{name}};
%					if(!$value && $fields->{"check"} eq 'http') {
%						$value = 'http://';
%					}
				<input type="<%$fields->{type}%>" name="<%$fields->{name}%>" value="<%$value%>" style="<%$fields->{style}%>"><%$fields->{text}%>
%		}
%		$index++;
% }
% if($j == 10) {
		</ul></div>
%	}
		</td>
	</tr>	
% $j++;
% }
	<tr>
		<td align="right" class="text"><label>
			<input type="submit" name="Submit" value="Отправить анкету">
		</label></td>
		<td valign="top" class="text">&nbsp;</td>
	</tr>
	<tr>
		<td valign="top" class="text"><font color="#CC0000">*</font> Если у тебя нет блога - заведи. Это обязательное
			условие. </td>
		<td valign="top" class="text">&nbsp;</td>
	</tr>
</table>
<br>
</form>
% }


</td>
	</tr>
</table>

</div>


<& comps/footer.msn &>


<%once>
	use Encode;
</%once>

<%init>

my @fields = $m->comp("subs/form-data.msn");

my %errors;
my %data;

my $ic = 'utf8';
my $cd = $ARGS{"Submit"};

for (qw(cp1251 koi8-r utf8)) {
		next unless encode('utf8', decode($_, $cd||'')) eq "Отправить анкету";
		$ic = $_;
		last;
}

for(keys %ARGS)
{
    $ARGS{$_} = encode("utf8", decode($ic, $ARGS{$_}));
}

if($ARGS{posted})
{

#	die Dumper (\%ARGS);

	foreach my $field (@fields) 
	{
		my $fname = (keys(%$field))[0];
		foreach my $fields (@{$field->{$fname}}) 
		{
			if(($fields->{type} eq 'radio') or ($fields->{type} eq 'checkbox')) 
			{
				my @options = ref($ARGS{$fields->{name}}) ? @{$ARGS{$fields->{name}}} : $ARGS{$fields->{name}};
				if($fname eq "Отметь страны/регионы, в которых ты был")
				{
						$data{$fname} = join ", ", map {$_->{text}} (@{$field->{$fname}})[ map {$_ - 1} @options ];
				} else {				
				if(!$options[0])
				{
					$errors{$fname} = "Выберите вариант";
					next;
				}
				else 
				{ 
					$data{$fname} = join ", ", map {$_->{text}} (@{$field->{$fname}})[ map {$_ - 1} @options ];
				}}
			} 
			else 
			{
				my $value = $ARGS{$fields->{name}};
				$value =~ s/\s+$//;
				$value =~ s/^\s+$//;

				if($fields->{check} eq 'int')
				{
					$value =~ s/^0//;
					if($value !~ /^\d+$/)
					{
						$errors{$fname} = "Поле может содержать только цифры";
						next;
					}
					else { push @{$data{$fname}}, $value; }
				}
				elsif($fields->{"check"} eq 'http')
				{
					if($value !~ m!^http://\S{5,}$!) 
					{
						$errors{$fname} = "Некорретная ссылка";
						last;
					} else { 	$data{$fname} = $value 	}
				}
				elsif($fields->{"check"} eq 'email')
				{
					if($value !~ m!^\S+@\S+\.\S+$!) 
					{
						$errors{$fname} = "Неправильный адрес электронной почты";
						last;
					} else {	$data{$fname} = $value }
				}
				else {
					unless(length($value))
					{
						$errors{$fname} = "Поле не заполнено";
						last;
					} else 
					{
						$data{$fname} = $value;
					}
				}
			}
		}
	}

	# Особая проверка на дату, кривовато, но что поделать...
	my $key =  "Дата рождения";
	my $birth_time;

	if(!$errors{$key})
	{
		my($day, $mon, $year) = @{$data{$key}};
		$mon--;

		eval qq{
			\$birth_time = Time::Local::timelocal(0, 0, 0, \$day, \$mon, \$year);
		};

		if($@)
		{
			$errors{$key} = "Ошибочная дата рождения";
		}
	}



	if(keys(%errors) == 0) 
	{
#		проверки на непрохождение анкеты
#		my $age = ((( time() - $birth_time) / 60) / 60) / 24;
#		if(	($age < 7300 || $age > 10950)																		||	# Возраст от 20 до 30 лет
#				($ARGS{education} == 1 or $ARGS{education} == 2)				||	# Образование: среднее, среднее специально
#				($ARGS{digital_photo} == 2)																				||	# Цифровая фотография: нет
#				($ARGS{sickness} == 1)																							||	# Хронические заболевания: да 
#				($ARGS{ready_for_action} == 2)																		||	# Рюкзак, 25 кг на собственном горбу: нет,
#				($ARGS{countries} >= 12))																							# Страны "больше" австралии
#		{
#			# Посылка сообщения о том, что анкета не прошла по критериям 
#				my $msg = $m->comp("comps/sendmail-out-of-restrictions.msn", 
#														from	=> "escape\@rambler-co.ru", 
#														to			=> $data{"E-mail адрес"}, 
#														data		=> \%data, 
#														fields	=>	\@fields
#				);
#				$m->comp("subs/sendmail.msn",
#					msg	=>	$msg
#				);
#		}

		my $msg = $m->comp("comps/sendmail.msn", 
														from	=> "escape\@rambler-co.ru", 
														to			=> "pobeg\@prt.ru", 
														data		=> \%data, 
														fields	=>	\@fields
				);
		
		$m->comp("subs/sendmail.msn",
			msg	=>	$msg
		);

		$r->header_out('Location', "anket.html?send_ok=1");
		$r->status(302);
		$r->send_http_header;
		$m->abort;
	}
}
</%init>

Небольшая справка по веткам

cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.

koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.

utf8 – актуальная ветка, заточенная под UTF-8.

Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.