Revision 3 (by ahitrov@rambler.ru, 2010/03/24 15:19:32) The CORE
<%args>
	$id => undef
	$login => undef
	$ret => undef

	$delete => undef
	$save => undef

	$class => undef
</%args>
<%init>
	unless ($user->check_group(1)) {
		$m->clear_buffer;
		$m->abort(403);
	}

	my $luser;

	# �������� ���������� ������ - �� ������ ���� ����� ����...
	if ($class)
	{
		my @correct_classes = (@{ $state->{available_users} }, 'Contenido::User');
		if (! (grep { $_ eq $class } @correct_classes))
		{
			# ����� �����, �� �� �� ����������
			$class = undef;
		}
	}

	if ($id && ($id>0)) {
		$luser = $keeper->get_user_by_id($id, class=>$class);
	} elsif ($login && (length $login > 0)) {
		$luser = $keeper->get_user_by_login($login, class=>$class);
	}

	if ($class and !ref($luser)) {
		$luser = $class->new($keeper);
	}

	# ��������...
	if (ref $luser && $delete == 1)
	{
		$luser->delete();

		$r->header_out("Location", "/contenido/?set_context=profile-admin");
		$r->status(302);
		$r->send_http_header();
		$m->abort();
	}

	# ���������� ...
	elsif (ref $luser && $save == 1)
	{
		my @groups = $luser->groups();
		my $res = $m->comp('/contenido/components/set_properties.msn', object => $luser, SETS => \%ARGS);
		if ($res != 1)
		{
			# ������, ���� �� ����������...
			warn "Contenido Debug: set_properties.msn ������ $res\n" if ($state->debug());
		}
		$luser->groups(@groups);
		$luser->store();

		$r->header_out("Location", "users.html?id=".$luser->id()."&class=$class");
		$r->status(302);
		$r->send_http_header();
		$m->abort();
	}

</%init>


<& "/contenido/components/header.msn" &>

<& "/contenido/components/naviline.msn" &>

%	if ((!defined $luser || !$luser->login) && (!defined $class || !$class))
%	{
%		if (!defined $class || !$class) {
			<!-- ���� � ������� ������ ������������ ��� �������� -->
			<table width="50%" border="0">
				<tr>
					<td>
						<fieldset>
							<legend>�������� ��� ������������ ��� ��������</legend>
							<& "/contenido/components/new_objects_form.msn", proto => 'users' &>
						</fieldset>
					</td>
				</tr>
			</table>
%		}
%	} elsif (ref $luser) {
		<& "/contenido/components/obj_list_js.msn", object => $luser &>
		<& "/contenido/components/object_form.msn", object => $luser, proto => 'users' &>
%		if ($luser->login) {
			<!-- ������ � ������� -->
			<br>
			<table width="100%" cellspacing="5" cellpadding="0" border="0">
				<tr>
					<td valign=top><& "/contenido/components/user_sections.msn", luser => $luser &></td>
				</tr>
			</table>
			<!-- / ������ � ������� -->
%		}
%	}

</body>
</html>

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

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

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

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

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