Revision 8 (by ahitrov@rambler.ru, 2010/03/29 11:46:38) Contenido UTF-8 core files
<select name="<% $name %>" id="<% $name %>_select" style="width: 37%;" onchange="<% $name %>_changed();">
% if ($prop->{allow_null}) {
	<option value="" <% defined $check ? '' : 'selected' %>>--- не указано ---</option>
% }
% for my $sm (@{ $status_map }) {
	<option value="<% $sm->[0] %>" <% (defined($check) && ($check eq $sm->[0])) ? 'selected' : '' %>><% defined $sm->[1] ? $sm->[1] : "$sm->[0] [unknown value]" %></option>
% }
</select>

<table id="<% $name %>_prev_table" style="width: 37%; display: none;" cellspacing="0" cellpadding="0" border="0">
	<tr>
		<td width="100%" id="<% $name %>_prev_text" class="bb undo" style="padding: 3px;"></td>
		<td style="padding-left: 3px; vertical-align: top;"><a href="#" onclick="return <% $name %>_undo();" title="Отменить изменения"><img src="/contenido/i/undo-19x19.gif" width="19" height="19" class="bb gb"></a></td>
	</tr>
</table>

<script type="text/javascript">
	var <% $name %>_prev_value = document.getElementById('<% $name %>_select').selectedIndex;

	function <% $name %>_changed() {
		var t = document.getElementById('<% $name %>_prev_table');
		if (document.getElementById('<% $name %>_select').selectedIndex==<% $name %>_prev_value) {
			if (t.style.display!='none') {
				t.style.display = 'none';
			}
			return;
		}
		if (t.style.display=='none') {
			t.style.display = '';
		}
	}

	function <% $name %>_undo() {
		document.getElementById('<% $name %>_select').selectedIndex = <% $name %>_prev_value;
		<% $name %>_changed();
		return false;
	}

	var s = document.getElementById('<% $name %>_select');
	document.getElementById('<% $name %>_prev_text').innerHTML = s.options.item(s.selectedIndex).innerHTML || '&nbsp;';
</script>

<%ARGS>
	$name  => undef
	$check => undef
	$mode  => 'view'
	$prop  => {}
</%ARGS>
<%INIT>
    # тут надо копию массива... иначе push @{$status_map} ломает default значения в $prop->{cases} или в $keeper->default_status() 
    my $status_map = [ @{ref $prop->{cases} eq 'ARRAY' ? $prop->{cases} : $keeper->default_status()} ];
	if ($mode eq 'get') {
		return $status_map;
	}
	if (defined $check) {
		unless (grep {$_->[0] eq $check} @{$status_map}) {
			push @{$status_map}, [$check, "$check [unknown value]"];
		}
	}
</%INIT>

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

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

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

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

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