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 &nbsp;
    43 % }
    44 </td>
    45 %
    46 % for my $col (@$columns) {
    47 % if ($col->{attr} eq '_sort_') {
    48 %
    49 <td width="20px"><% $document->{sorder} %>&nbsp;<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>&nbsp;<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 %>&nbsp;</a>\
    74 %
    75 % } else {
    76 %
    77 <% $name | h %>&nbsp;\
    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 %>&nbsp;</a>\
    88 % } else {
    89 <% $document->id %>&nbsp;\
    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 %>&nbsp;<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 &nbsp;\
    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 || '&nbsp;' %>\
    174 % } elsif ($col->{type} eq 'datetime') {
    175 <td nowrap align="right"><% $document->{$col->{attr}} || '&nbsp;' %>\
    176 % } elsif ($col->{type} eq 'integer') {
    177 <td align="right"><% $document->{$col->{attr}} %>&nbsp;\
    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>&nbsp;\
    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}} : '&nbsp;' %>\
    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()."&sect_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%">&nbsp;</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">Поиск по букве:&nbsp;&nbsp;[<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">Поиск по полю:&nbsp;&nbsp;[<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=" &raquo; " 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 – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.