Revision 236
- Date:
- 2012/08/30 20:19:18
- Files:
-
- /utf8/plugins/blogs/comps/contenido/blogs/components
- /utf8/plugins/blogs/comps/contenido/blogs/components/blogs_browse.msn (Diff) (Checkout)
- /utf8/plugins/blogs/comps/contenido/blogs/dhandler (Diff) (Checkout)
- /utf8/plugins/blogs/comps/contenido/blogs/document.html (Diff) (Checkout)
- /utf8/plugins/blogs/comps/contenido/blogs/index.html (Diff) (Checkout)
- /utf8/plugins/blogs/lib/blogs/Blog.pm (Diff) (Checkout)
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 }