Revision 236
Date:
2012/08/30 20:19:18
Author:
ahitrov
Revision Log:
Blog admin - first
Bugs
Files:
Legend:
Added
Removed
Modified
utf8/plugins/blogs/comps/contenido/blogs/components/blogs_browse.msn
1
<script type="text/javascript">
2
<!--
3
var aIDs = new Array (<% scalar @$documents ? join (',', map { $_->id } @$documents) : '' %>);
4
function delete_check () {
5
for ( var i = 0; i < aIDs.length; i++ ) {
6
var sFieldName = 'delete_' + aIDs[i] + '_id';
7
var oField = document.forms['section_browse'].elements[sFieldName];
8
if ( oField.checked ) {
9
oField.checked = 0;
10
} else {
11
oField.checked = 1;
12
}
13
}
14
}
15
//-->
16
</script>
17
<form name="section_browse" action="sections.html" method="POST">
18
<table width="100%" border="0" cellpadding="4" cellspacing="0" class="tlistdocs">
19
<tr bgcolor="#efefef">
20
<th><a href="javascript:delete_check()" onclick="delete_check(); return false;"><img src="/contenido/i/actions/delete.gif" width="14" height="17" alt="Удаление документов" align="absmiddle" border="0" hspace="1"></a></th>
21
%
22
% foreach (@$columns) {
23
<th><% $_->{shortname} || $_->{rusname} %></th>
24
% }
25
%
26
</tr>
27
%
28
% unless (@$documents) {
29
<tr><td align="center" colspan="<% scalar @$columns %>">Документы не найдены</td></tr>
30
% }
31
% foreach my $document (@$documents) {
32
%
33
% next unless ref($document);
34
% my $document_access = $document->can_write( $user->id );
35
%
36
<tr valign="top">
37
<td nowrap>\
38
% if ($document_access) {
39
% $delete_status = 1;
40
<input type="checkbox" name="<% 'delete_'.$document->id.'_id' %>">
41
% } else {
42
43
% }
44
</td>
45
%
46
% for my $col (@$columns) {
47
% if ($col->{attr} eq '_sort_') {
48
%
49
<td width="20px"><% $document->{sorder} %> <a
50
href="document_move.html?id=<% $document->{id} %>&move=up&s=<% $id %><% $params_unsection ? '&'.$params_unsection : '' %>"><img
51
src="/contenido/i/ico-up-9x10.gif" border=0 alt="Переместить документ на шаг вверх"></a> <a
52
href="document_move.html?id=<% $document->{id} %>&move=down&s=<% $id %><% $params_unsection ? '&'.$params_unsection : '' %>"><img
53
src="/contenido/i/ico-down-9x10.gif" border=0 alt="Переместить документ на шаг вниз"></a>\
54
%
55
% } elsif ($col->{attr} eq 'dtime') {
56
%
57
<td nowrap><& "/contenido/components/show_dtime.msn", dtime=>$document->{dtime} &>\
58
%
59
% if ($document->{ctime} ne $document->{mtime}) {
60
% my $colortime = '#c66';
61
%
62
<div style="color:<% $colortime %>;"><& "/contenido/components/show_dtime.msn", dtime=>$document->{mtime} &></div>\
63
%
64
% }
65
%
66
% } elsif ($col->{attr} eq 'name') {
67
%
68
<td><span<% $document->contenido_status_style ? ' style="' . $document->contenido_status_style . '"' : '' %> class="<% $document->status ? '':'hiddensect' %>">\
69
%
70
% my $name=$document->name ? $document->name : 'Безымянный документ N'.$document->id;
71
% if ($document_access) {
72
%
73
<a<% $document->contenido_status_style ? ' style="' . $document->contenido_status_style . '"' : '' %> href="document.html?id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>"><% $name | h %> </a>\
74
%
75
% } else {
76
%
77
<% $name | h %> \
78
%
79
% }
80
%
81
</span>\
82
%
83
% } elsif ($col->{attr} eq 'id') {
84
%
85
<td><span class="<% $document->status ? '':'hiddensect' %>">\
86
% if ($document_access) {
87
<a href="document.html?id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>"><% $document->id %> </a>\
88
% } else {
89
<% $document->id %> \
90
% }
91
</span>\
92
%
93
% } elsif ( exists $col->{inline} && $col->{inline} ) {
94
% $inline_status = 1;
95
% my $attr = $col->{attr};
96
% if ( $col->{type} =~ /^(string|integer|float)$/ && $col->{inline} ) {
97
% my $style = $col->{inline_style} ? $col->{inline_style} : ($col->{type} =~ /^(integer|float)$/ ? 'text-align:right; ' : '' );
98
<td><input type="text" name="<% 'update_'.$document->id.'_'.$attr %>" value="<% $document->$attr %>" style="<% $col->{inline_width} ? 'width:'.$col->{inline_width}.'px;' : 'width:65px; ' %> <% $col->{inline_style} || '' %>">
99
% } elsif ($col->{type} eq 'checkbox') {
100
% my $checked = $document->$attr ? ' checked' : '';
101
<td align="center"><input type="checkbox" name="<% 'update_'.$document->id.'_'.$attr %>"<% $checked %>>
102
% } elsif ($col->{type} eq 'select') {
103
% my $options = {};
104
% if ($toopi && (ref($toopi) eq 'HASH') && (exists($toopi->{$document->class}))) {
105
% %{ $options } = %{ $toopi->{$document->class} };
106
% }
107
% my $values = $options->{$col->{attr}};
108
<td><select name="<% 'update_'.$document->id.'_'.$attr %>">
109
% if ( ref $values eq 'ARRAY' ) {
110
% foreach my $val ( @$values ) {
111
% my $selected = $val eq $document->$attr ? ' selected' : '';
112
<option value="<% $val %>"<% $selected %>><% $val %>
113
% }
114
% }
115
</select>
116
% } elsif ($col->{type} eq 'status') {
117
% my $cases = $col->{cases};
118
% if ( ref $cases eq 'ARRAY' ) {
119
<td><select name="<% 'update_'.$document->id.'_'.$attr %>" style="<% $col->{inline_width} ? 'width:'.$col->{inline_width}.'px;' : '' %> <% $col->{inline_style} || '' %>">
120
% foreach my $case ( @$cases ) {
121
% my $selected = $case->[0] eq $document->$attr ? ' selected' : '';
122
<option value="<% $case->[0] %>"<% $selected %>><% $case->[1] %>
123
% }
124
</select>
125
% }
126
% }
127
%
128
% } elsif ($col->{attr} eq 'class') {
129
%
130
<td><% $document->class_name %> <font color="#999999">(<% $document->class %>)</font>\
131
%
132
% } elsif ($col->{type} eq 'datetime') {
133
%
134
<td nowrap><& "/contenido/components/show_dtime.msn", dtime=>$document->{$col->{attr}} &>\
135
%
136
% } elsif ($col->{attr} eq '_act_') {
137
%
138
<td nowrap>\
139
% if ($document_access) {
140
%
141
<a href="document.html?id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>" title="Редактировать документ"><img
142
src="/contenido/i/actions/edit.gif" width="15" height="17" alt="Редактировать документ" align="absmiddle" border="0" hspace="1"></a>\
143
<a href="document.html?clone=1&id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>" title="Копировать документ"><img
144
src="/contenido/i/actions/copy.gif" width="15" height="17" alt="Копировать документ" align="absmiddle" border="0" hspace="1"></a>\
145
<a href="confirm.html?id=<% $document->id %>&action=documents_deletion&from=<% $section->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>" title="Удалить документ"><img
146
src="/contenido/i/actions/delete.gif" width="14" height="17" alt="Удалить документ" align="absmiddle" border="0" hspace="1"></a>\
147
% if ( $document->status != 0 ) {
148
<a href="document.html?deactivate=1&id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>" title="Скрыть/деактивировать документ"><img
149
src="/contenido/i/actions/deactivate.gif" width="14" height="17" alt="Скрыть/деактивировать документ" align="absmiddle" border="0" hspace="1"></a>\
150
% }
151
% if ( $document->status != 1 ) {
152
<a href="document.html?activate=1&id=<% $document->id %>&class=<% $document->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>" title="Присвоить документу статус=1"><img
153
src="/contenido/i/actions/activate.gif" width="14" height="17" alt="Присвоить документу статус=1" align="absmiddle" border="0" hspace="1"></a>\
154
% }
155
<br>\
156
%
157
% } else {
158
\
159
% }
160
% if ( $inline_status ) {
161
<input type="hidden" name="update_<% $document->id %>_class" value="<% $document->class %>">
162
% }
163
% if ( $delete_status ) {
164
<input type="hidden" name="delete_<% $document->id %>_class" value="<% $document->class %>">
165
% }
166
%
167
<a href="blog.html?id=<% $document->id %>">все записи блога</a><br>
168
% } else {
169
%
170
% if ($col->{type} eq 'date') {
171
% my $date=$document->{$col->{attr}};
172
% $date=~/(\d{4}-\d{2}-\d{2})/;
173
<td nowrap align="right"><% $1 || ' ' %>\
174
% } elsif ($col->{type} eq 'datetime') {
175
<td nowrap align="right"><% $document->{$col->{attr}} || ' ' %>\
176
% } elsif ($col->{type} eq 'integer') {
177
<td align="right"><% $document->{$col->{attr}} %> \
178
% } elsif ($col->{type} eq 'lookup' || $col->{type} eq 'pickup') {
179
<td align="left">\
180
% my $id = $document->{$col->{attr}};
181
% if ($id) {
182
% my ($doc)=$keeper->get_documents( ( ref($col->{lookup_opts}) ? %{$col->{lookup_opts}} : () ), id=>$id);
183
% if ($doc) {
184
<a href="document.html?id=<% $doc->id %>&class=<% $doc->class %><% $params_unclassed ? '&'.$params_unclassed : '' %>"><% $doc->name || $doc->id %></a> \
185
% } else {
186
<span class="hiddensect"><% $document->{$col->{attr}} %>???</span>\
187
% }
188
% } else {
189
<span class="hiddensect">NULL</span>\
190
% }
191
% } elsif ($col->{type} eq 'status') {
192
% my $status_map = ref $col->{cases} eq 'ARRAY' ? $col->{cases} : $keeper->default_status();
193
% my ($doc_status) = grep { $_->[0] eq $document->{$col->{attr}} } @$status_map;
194
% $doc_status ||= [$document->{$col->{attr}}, 'Неизвестный'];
195
<td nowrap><% $doc_status->[1].'('.$doc_status->[0].')' %>\
196
% } else {
197
<td><% defined($document->{$col->{attr}}) ? $document->{$col->{attr}} : ' ' %>\
198
% }
199
% }
200
</td>
201
%
202
% } #- for @columns
203
%
204
</tr>
205
% } #- foreach @documents
206
</table>
207
<input type="hidden" name="id" value="<% $section->id %>">
208
% if ( ref $filter eq 'HASH' ) {
209
% while ( my ($key, $value) = each %$filter ) {
210
% next if $key eq 's';
211
<input type="hidden" name="<% $key %>" value="<% $value |h %>">
212
% }
213
% }
214
% if ( $inline_status || $delete_status ) {
215
<div style="text-align:right; padding:10px 0;">
216
% if ( $inline_status ) {
217
<input type="submit" name="update" value="Сохранить изменения" class="input_btn">
218
% }
219
% if ( $delete_status ) {
220
<input type="submit" name="delete" value="Удалить выбранные" class="input_btn" onclick="return confirm('Все отмеченные позиции будут удалены');">
221
% }
222
</div>
223
% }
224
</form>
225
<%args>
226
227
$section => undef
228
$documents => undef
229
$columns => undef
230
$id => undef
231
$filter => undef
232
233
</%args>
234
<%init>
235
236
return unless ref $documents eq 'ARRAY';
237
return unless ref $columns eq 'ARRAY';
238
return unless ref $section;
239
240
my $toopi = $project->documents();
241
my $inline_status = 0;
242
my $delete_status = 0;
243
my $params = ref $filter eq 'HASH' ? join ('&', map { $_.'='.$filter->{$_} } keys %$filter ) : '';
244
my $params_unclassed = ref $filter eq 'HASH' ? join ('&', map { $_.'='.$filter->{$_} } grep { $_ ne 'class' } keys %$filter ) : '';
245
my $params_unsection = ref $filter eq 'HASH' ? join ('&', map { $_.'='.$filter->{$_} } grep { $_ ne 's' } keys %$filter ) : '';
246
247
248
</%init>
utf8/plugins/blogs/comps/contenido/blogs/dhandler
2
2
<%init>
3
3
4
4
my $call;
5
if ( $r->uri eq '/contenido/blogs/' ) {
6
$call = 'index.html';
5
if ( $r->uri eq '/contenido/blogs/' || $r->uri eq '/contenido/blogs/sections.html' ) {
6
$call = 'index.html';
7
$r->content_type('text/html');
7
8
} else {
8
9
&abort404;
9
10
}
utf8/plugins/blogs/comps/contenido/blogs/document.html
1
%# vim:syn=mason
2
<& "/contenido/components/header.msn" &>
3
<& "/contenido/components/naviline.msn", sect_id => $owner->id &>
4
5
% if ($error) {
6
<div align="center" style="font-size:110%; color:red;">
7
<% $error %>
8
</div>
9
<br><br>
10
% }
11
12
% if (!ref($document)) {
13
% if ($id) {
14
<div align="center" style="font-size:110%; color:red;">
15
Документ с идентификатором <% $id %> не найден
16
</div>
17
<br><br>
18
% } elsif ($class) {
19
<!-- Блок с выбором нового документа для создания -->
20
<table width="50%" border="0"><tr><td>
21
<fieldset>
22
<legend>Выберите тип документа для создания</legend>
23
<& "/contenido/components/new_objects_form.msn", proto => 'documents', sect_id => $owner->id &>
24
</fieldset>
25
</td></tr></table>
26
% } else {
27
<div align="center" style="font-size:110%; color:red;">
28
Не верный вызов документа!!! (отсутствуют id и class одновременно)
29
</div>
30
<br><br>
31
% }
32
33
% } else {
34
35
<& "/contenido/components/obj_list_js.msn", object => $document &>
36
<& "/contenido/components/object_form.msn",
37
object => $document,
38
proto => 'documents',
39
sect_id => $owner->id,
40
clone => $clone,
41
filter_params => \%filter_params,
42
&>
43
% if (ref($document) && ($document->id))
44
% {
45
46
<!-- Связи и привязки к рубрикам -->
47
48
<br>
49
50
<table width="100%" cellspacing="5" cellpadding="0" border="0">
51
<tr>
52
<td width=50% valign=top>\
53
<& "/contenido/components/document_sections.msn", document => $document &>\
54
<& "/contenido/components/user_sections.msn", luser => $document &>\
55
% if ( $m->comp_exists ("/contenido/components/pbase_rubrics.msn") ) {
56
<& "/contenido/components/pbase_rubrics.msn", document => $document &>\
57
% }
58
</td>
59
<td width=50% valign=top>\
60
% if ( $m->comp_exists ("/contenido/components/pbase_links.msn") ) {
61
<& "/contenido/components/pbase_links.msn", document => $document &>\
62
% }
63
<iframe id="links" src="document_links.html?id=<% $document->id() %>&class=<% $document->class() %>" width="100%" height="700" frameborder="0"></iframe>
64
65
</td>
66
</tr>
67
</table>
68
69
<!-- / Связи и привязки к рубрикам -->
70
71
% }
72
% }
73
74
</body>
75
</html>
76
<%ARGS>
77
$p => 1
78
$class => undef
79
$sect_id => undef
80
$s_alias => undef
81
$id => undef
82
$delete => undef
83
$save => undef
84
$clone => undef
85
$activate => undef
86
$deactivate => undef
87
</%ARGS>
88
<%INIT>
89
90
&abort404 unless $class;
91
my $error='';
92
### !!! При добавлении переменных в ARGS их надо внести в список исключений в структуре ниже
93
94
my $filter = $m->comp('/contenido/components/context.msn', name => 'filter');
95
96
my $document;
97
my $new;
98
99
if ($id && ($id !~ /\D/) && ($id > 0)) {
100
$document = $keeper->get_document_by_id($id, class=>$class);
101
if ( $clone && exists $document->{'attributes'}->{'dtime'} ) {
102
$document->dtime(undef);
103
}
104
} elsif ( ($class) && (length($class)>0) && (! ref($document)) ) {
105
$document = new $class ($keeper);
106
$new = 1;
107
unless ( $save ) {
108
my @properties = $document->structure();
109
foreach my $prop ( @properties ) {
110
my $attr = $prop->{attr};
111
### !!! Если не стандартная переменная, то можем инициализировать
112
if ( exists $ARGS{$attr} && ! grep { $prop->{attr} eq $_ } qw( class sect_id id delete save clone s_alias activate deactivate p s use_section alpha alpha_search search_by search ) ) {
113
$document->$attr($ARGS{$attr});
114
}
115
}
116
}
117
}
118
&abort404 unless ref $document;
119
120
my @props = $document->structure();
121
my %filter_params;
122
if ($ARGS{use_section} && !grep { $_->{attr} eq 'use_section' } @props ) {
123
$filter_params{use_section} = $ARGS{use_section};
124
$filter_params{class} = $document->class;
125
}
126
$filter_params{alpha} = $ARGS{alpha} if $ARGS{alpha} && !grep { $_->{attr} eq 'alpha' } @props;
127
$filter_params{alpha_search} = $ARGS{alpha_search} if $ARGS{alpha_search} && !grep { $_->{attr} eq 'alpha_search' } @props;
128
$filter_params{search_by} = $ARGS{search_by} if $ARGS{search_by} && !grep { $_->{attr} eq 'search_by' } @props;
129
$filter_params{search} = $ARGS{search} if $ARGS{search} && !grep { $_->{attr} eq 'search' } @props;
130
$filter_params{s} = $ARGS{s} if $ARGS{s} && !grep { $_->{attr} eq 's' } @props;
131
$filter_params{p} = $p if $p > 1;
132
my $return_params = join ('&', map { $_.'='.$filter_params{$_} } grep { $_ ne 's' } keys %filter_params );
133
134
135
if ($s_alias) {
136
$sect_id = $project->s_alias->{$s_alias};
137
}
138
139
if ( (! $sect_id) && (ref($document)) && ($document->id) ) {
140
$sect_id = $document->section();
141
}
142
my $owner = $keeper->get_section_by_id ($sect_id || $Contenido::Section::ROOT || 1);
143
144
if (! ref($owner)) {
145
$owner = $keeper->get_section_by_id ($Contenido::Section::ROOT || 1);
146
}
147
if (! ref($owner)) {
148
warn "Contenido Die: Не могу найти корневую секцию\n";
149
return undef;
150
}
151
152
if (ref($document) && $document->id() && $document->section()) {
153
my $document_access = $user->section_accesses($user, $owner);
154
if ($document_access != 2) {
155
$m->clear_buffer;
156
$m->abort(403);
157
}
158
}
159
160
# Удаление...
161
if (defined($id) && ($id > 0) && ($delete == 1)) {
162
$document->delete( attachments => 1 );
163
164
$m->redirect("sections.html?id=".($filter_params{s} || $owner->id).($return_params ? '&'.$return_params : ''));
165
}
166
167
# Активация...
168
if (defined($id) && ($id > 0) && ($activate == 1)) {
169
$document->status(1);
170
$document->store;
171
172
$m->redirect("sections.html?id=".($filter_params{s} || $owner->id).($return_params ? '&'.$return_params : ''));
173
}
174
175
# Дективация...
176
if (defined($id) && ($id > 0) && ($deactivate == 1)) {
177
$document->status(0);
178
$document->store;
179
180
$m->redirect("sections.html?id=".($filter_params{s} || $owner->id).($return_params ? '&'.$return_params : ''));
181
}
182
183
# Сохранение существующего документа или создание нового...
184
# Кстати, пока никак не обрабатываются связи...
185
elsif ( $save == 1 )
186
{
187
my $clonesource;
188
if ( $clone ) {
189
$clonesource = $keeper->get_document_by_id ($clone,
190
class => $document->class,
191
);
192
}
193
if ($m->comp('/contenido/components/set_properties.msn', object => $document, SETS => \%ARGS) != 1)
194
{
195
# Ошибка, надо бы обработать...
196
warn "Contenido Warning: Не могу установить значения полей!\n";
197
}
198
if ( $clone ) {
199
$m->comp('/contenido/components/clone_attachments.msn', object => $document, source => $clonesource );
200
$document->sections( $clonesource->sections );
201
} elsif ( $new ) {
202
$document->sections( $owner->id, $filter > 0 ? ($filter) : ());
203
}
204
205
206
unless ($document->store()) {
207
# Ошибка, надо бы обработать...
208
$error="Ошибка сохранения ($keeper->{last_error})";
209
} else {
210
211
if ($ARGS{_save_and_leave}) {
212
$m->redirect("sections.html?id=".($filter_params{s} || $owner->id).($return_params ? '&'.$return_params : ''));
213
} elsif ($ARGS{_save_and_again}) {
214
$m->redirect("document.html?class=".$document->class()."§_id=".($filter_params{s} || $owner->id).($return_params ? '&'.$return_params : ''));
215
}
216
217
218
$m->redirect("document.html?id=".$document->id()."&class=".$document->class().(exists $filter_params{s} ? '&s='.$filter_params{s} : '').($return_params ? '&'.$return_params : ''));
219
}
220
}
221
222
</%INIT>
utf8/plugins/blogs/comps/contenido/blogs/index.html
1
1
<& "/contenido/components/header.msn" &>
2
2
<& "/contenido/components/naviline.msn" &>
3
3
4
<p>PLugin [blogs]</p>
4
<script type="text/javascript">
5
<!--
6
function set_create_button( oSelect, sBtnID ) {
7
if ( oSelect.value == '' ) {
8
$('#'+sBtnID).attr('disabled','disabled');
9
} else {
10
$('#'+sBtnID).removeAttr('disabled');
11
}
12
}
13
//-->
14
</script>
5
15
16
<table width="100%" cellspacing="0" cellpadding="0" border="0">
17
<tr valign="top">
18
<td width="35%">
19
20
21
22
</td>
23
<td width="2%"> </td>
24
<td width="65%">
25
26
27
<fieldset>
28
<legend>Документы\
29
% if ($class) {
30
класса <% $class %>\
31
% if ($use_section) {
32
c учетом текущей секции\
33
% }
34
% } else {
35
в разделе\
36
% }
37
% if ( $total > 0 ) {
38
(всего: <% $total %>, показано с <% $first + 1 %> по <% ($first + $n > $total) ? $total : $first + $n %>)
39
% }
40
</legend>
41
42
% if ($total || scalar @documents || defined($alpha) || defined($search) ) {
43
%
44
45
<& "/contenido/components/new_objects_form.msn", proto => 'documents',
46
sect_id => ref $owner ? $owner->id : undef,
47
default => 'blogs::Blog' &>
48
49
<div style="font-size:12px; font-family:Arial;">
50
<table border="0" cellspacing="0" cellpadding="2" width="100%" style="margin:4px 0 0; border:1px solid gray;">
51
<tr bgcolor="#e0e0e0"><th colspan="4">Поиск по букве: [<a href="?id=<% $id %>" style="font-weight:normal;">сброс фильтра</a>]</th></tr>
52
<tr><td style="font-size:12px; font-family:Arial; padding:2px 4px;">
53
<& /inc/alpha.msn, alpha=>$alpha, params=>\%ARGS, &>
54
</td></tr></table>
55
56
% ## Форма поиска. Работает при включенном фильтре класса
57
% ## и описанной для класса функции search_fields
58
% ########################################################
59
% if ( $filter{class} ) {
60
% my $document = $filter{class}->new ($keeper);
61
% my @fields = $document->search_fields;
62
% if ( @fields ) {
63
% my @props = $document->required_properties;
64
<form action="sections.html">
65
<table border="0" cellspacing="0" cellpadding="2" width="100%" style="margin:4px 0; border:1px solid gray;">
66
<tr bgcolor="#e0e0e0"><th colspan="4">Поиск по полю: [<a href="?id=<% $id %>" style="font-weight:normal;">сброс фильтра</a>]</th></tr><tr>
67
<td width="1%" nowrap style="padding:2px 0 2px 4px;"><select name="search_by">
68
% foreach my $field ( @fields ) {
69
% my ($prop) = grep { $_->{'attr'} eq $field } @props;
70
% my $selected = $field eq $search_by ? ' selected' : '';
71
<option value="<% $field %>"<% $selected %>><% ref $prop ? $prop->{'shortname'} || $prop->{'rusname'} : $field %>
72
% }
73
</td><td width="0">:</td>
74
<td width="98%"><input type="text" name="search" value="<% $search %>" style="width:100%"></td>
75
<td width="1%" style="padding:2px 4px 2px 0;"><input type="submit" value=" » " style="border:1px solid gray;"></td>
76
</tr></table>
77
% if ( $id ) {
78
<input type="hidden" name="id" value="<% $id %>">
79
% }
80
% if ( $class ) {
81
<input type="hidden" name="class" value="<% $class %>">
82
% }
83
% if ( $use_section ) {
84
<input type="hidden" name="use_section" value="<% $use_section %>">
85
% }
86
</form>
87
% }
88
% }
89
90
<div style="height:5px"><spacer type="block" height="5"></div>
91
<& /inc/pages_.msn, p=>$p, n=>$n, total=>$total, href=>'sections.html', params=>\%ARGS, &>
92
</div>
93
94
<& /contenido/blogs/components/blogs_browse.msn, documents => \@documents, columns => \@columns, section => $owner, filter => \%filter_params, %ARGS &>
95
96
<div style="font-size:12px; font-family:Arial;">
97
<& /inc/pages_.msn, p=>$p, n=>$n, total=>$total, href=>'sections.html', params=>\%ARGS, &>
98
<div style="height:5px"><spacer type="block" height="5"></div>
99
</div>
100
101
102
% } else {
103
<h4 align="center"><i>---- Нет документов -----</i></h4>
104
% }
105
%
106
107
<& "/contenido/components/new_objects_form.msn", proto => 'documents',
108
sect_id => ref $owner ? $owner->id : undef,
109
default => 'blogs::Blog' &>
110
111
</fieldset>
112
113
114
115
</td>
116
</tr>
117
</table>
118
119
6
120
</body>
7
121
</html>
122
<%args>
123
124
$id => undef
125
$p => 1
126
$class => 'blogs::Blog'
127
$use_section => undef
128
$alpha => undef
129
$alpha_search => undef
130
$search_by => undef
131
$search => undef
132
$update => undef
133
$delete => undef
134
135
</%args>
136
<%init>
137
138
$id = 0 if $id =~ /\D/;
139
my $owner;
140
141
if ( ref $project->s_alias && exists $project->s_alias->{blogs} ) {
142
$owner = $keeper->get_section_by_id( $project->s_alias->{blogs} );
143
} else {
144
$owner = $keeper->get_section_by_id( $Contenido::Section::ROOT );
145
}
146
147
my %filter_params;
148
$filter_params{class} = $class if $class;
149
$filter_params{alpha} = $alpha if $alpha;
150
$filter_params{alpha_search} = $alpha_search if $alpha_search;
151
$filter_params{search_by} = $search_by if $search_by;
152
$filter_params{search} = $search if $search;
153
$filter_params{p} = $p if $p && $p > 1;
154
155
# Фильтры работают в любом случае...
156
my $filter = $m->comp('/contenido/components/context.msn', name => 'filter');
157
my $profile = $m->comp('/contenido/components/context.msn', name => 'profile');
158
159
my (@documents, $total);
160
161
162
my %filter=();
163
my $nothing_found = 0;
164
my %order = (order => ['date','direct']);
165
if (defined $alpha and $alpha ne '') {
166
$filter{ilike}=1;
167
$filter{ $alpha_search || 'name' }="$alpha%";
168
$order{order}=['name','reverse'];
169
delete $order{order_by};
170
}
171
$filter{class} = $class;
172
173
if ( $search_by && defined $search ) {
174
my $doc_class = $class;
175
if ( $doc_class ) {
176
my @props = $doc_class->new( $keeper )->structure();
177
my ($prop) = grep { $_->{attr} eq $search_by } @props if @props;
178
if ( ref $prop && ($prop->{type} eq 'integer' || $prop->{type} eq 'checkbox' ||
179
(($prop->{type} eq 'pickup' || $prop->{type} eq 'lookup') && $search =~ /^\d+$/) ||
180
(exists $prop->{db_type} && $prop->{db_type} =~ /integer\[\]/) )) {
181
$filter{$search_by} = int($search);
182
} elsif ( ref $prop && ($prop->{type} eq 'pickup' || $prop->{type} eq 'lookup') && $search =~ /\D/ ) {
183
my $lookup_opts = $prop->{lookup_opts};
184
if ( ref $lookup_opts && exists $lookup_opts->{class} ) {
185
my $search_field = exists $lookup_opts->{search_by} ? $lookup_opts->{search_by} : 'name';
186
my @ids = $keeper->get_documents (
187
ids => 1,
188
class => $lookup_opts->{class},
189
ilike => 1,
190
$search_field => '%'.$search.'%',
191
);
192
if ( @ids ) {
193
$filter{$search_by} = \@ids;
194
} else {
195
$nothing_found = 1;
196
}
197
}
198
} else {
199
$filter{$search_by}='%'.$search.'%';
200
$filter{ilike} = 1;
201
}
202
} else {
203
$filter{$search_by}='%'.$search.'%';
204
$filter{ilike} = 1;
205
}
206
}
207
$total = $keeper->get_documents(%filter, count=>1);
208
209
my $n = 40;
210
my $first = $n * ($p - 1);
211
($first,$p)=(0,0) if $first > $total;
212
213
unless ( $nothing_found ) {
214
@documents = $keeper->get_documents(%filter, %order, limit=>$n, offset=>$first);
215
}
216
217
# набор колонок таблицы документов...
218
my @columns = ();
219
220
# пытаемся найти колонки, которые документ сам пожелал показать (required_properties -> column)...
221
if ($filter{class} or @documents and $documents[0]) {
222
push @columns,
223
sort {$a->{column} <=> $b->{column}}
224
grep {$_->{column}} ($filter{class} ? $filter{class}->new($keeper)->structure : $documents[0]->structure);
225
}
226
227
# стандартная жопка таблицы...
228
@columns = (@columns,
229
{attr => '_act_', rusname => 'Действия'},
230
);
231
232
</%init>
utf8/plugins/blogs/lib/blogs/Blog.pm
48
48
my $uid = shift;
49
49
return undef unless $uid;
50
50
51
if ( $uid == $self->uid || $self->status == 1 || ($self->status == 2 && $self->is_member($uid)) ) {
51
if ( $uid == $self->uid || $self->status == 1 || $self->status == 3 || ($self->status == 2 && $self->is_member($uid)) ) {
52
52
return 1;
53
53
} else {
54
54
return 0;
…
…
65
65
} elsif ( $self->status == 2 && !$self->is_member($uid) ) {
66
66
return 'блог открыт только для участников сообщества';
67
67
} else {
68
return 'окстись, ты можешь прекрасно все читать...';
68
return 'окстись, всё разрешено';
69
69
}
70
70
}
71
71
72
sub can_comment {
73
my $self = shift;
74
my $uid = shift;
75
return undef unless $uid;
76
77
return undef if $self->status == 3;
78
if ( $uid == $self->uid || $self->status == 1 || ($self->status == 2 && $self->is_member($uid)) ) {
79
return 1;
80
} else {
81
return 0;
82
}
83
}
84
85
sub why_cant_i_comment {
86
my $self = shift;
87
my $uid = shift;
88
return 'не указан пользователь' unless $uid;
89
90
if ( $self->status == 0 ) {
91
return 'блог заблокирован';
92
} elsif ( $self->status == 3 ) {
93
return 'комментирование не разрешено';
94
} elsif ( $self->status == 2 && !$self->is_member($uid) ) {
95
return 'блог открыт только для участников сообщества';
96
} else {
97
return 'окстись, всё разрешено';
98
}
99
}
100
72
101
sub can_write {
73
102
my $self = shift;
74
103
my $uid = shift;
75
104
return undef unless $uid;
76
105
77
106
return 1 if $uid == $self->uid;
107
return 1 if ref $user;
78
108
return 0 unless $self->status;
79
109
if ( $self->type == 2 || ($self->type == 1 && $self->is_member($uid)) || ($self->type == 3 && ref $user) ) {
80
110
return 1;
…
…
95
125
} elsif ( $self->type == 1 && !$self->is_member($uid) ) {
96
126
return 'вы не являетесь участником данного сообщества';
97
127
} else {
98
return 'окстись, ты можешь прекрасно все читать...';
128
return 'окстись, всё разрешено';
99
129
}
100
130
}
101
131
…
…
190
220
my $self = shift;
191
221
192
222
unless ( $self->id ) {
193
if ( $self->status == 3 && ref $user ) {
223
if ( $self->type == 3 && ref $user ) {
194
224
$self->uid( $user->id );
195
225
}
196
226
}
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.