Revision 347

Date:
2013/05/17 20:16:39
Author:
ahitrov
Revision Log:
New datatype - multimedia_multi - for multi-file storages (a-la images)
Files:

Legend:

 
Added
 
Removed
 
Modified
  • utf8/core/comps/contenido/components/inputs/multimedia_new.msn

     
    10 10 <div id="<% $attr %>_url_loader" style="display:none; background:#d0d0d0; padding:2px;">&nbsp;URL:&nbsp;<input
    11 11 id="<% $attr %>_ext_url" type="text" name="<% $attr %>.ext_url" style="width:81%;font-family:arial;font-size:9pt;"></div>
    12 12 </td></tr>
    13 % if ( exists($MULTI->{filename}) )
    14 % {
    13 % if ( exists($MULTI->{filename}) ) {
    15 14 % my $TYPE = 'unknown';
    16 % if (length($MULTI->{ext}) > 0)
    17 % {
    18 % if (-e $keeper->{state}->{mason_comp}.'/contenido/i/icons/'.$MULTI->{ext}.'.gif')
    19 % {
    15 % if (length($MULTI->{ext}) > 0) {
    16 % if (-e $keeper->{state}->{mason_comp}.'/contenido/i/icons/'.$MULTI->{ext}.'.gif') {
    20 17 % $TYPE = $MULTI->{ext};
    21 18 % }
    22 19 % }
    23 <tr><td style="font-size:95%;"><% $MULTI->{filename} %></td></tr>
    20 <tr><td style="font-size:90%;"><a href="<% $MULTI->{filename} %>" target="_blank"><% $MULTI->{sourcename} || $MULTI->{filename} %></a></td></tr>
    24 21 <tr><td>
    25 22
    26 23 <table border="0" width="100%"><tr>
    27 24 <td align="right"><a href="<% $MULTI->{filename} %>"><img src="/contenido/i/icons/<% $TYPE %>.gif" width="36" height=36" hspace="5" border="0"></a></td>
    28 25 <td>
    29 <font size="-1" color="#888888">Тип: <% uc($MULTI->{ext}) %><br>
    26 <font style="font-size:90%" color="#888888">Тип: <% uc($MULTI->{ext}) %><br>
    30 27 Размер: <% int($MULTI->{size}/1024) %> Кб
    31 28 </font>
    32 29 </td>
     
    35 32 </td></tr>
    36 33 % }
    37 34 %
    38 % foreach my $iattr (sort (@{ $iattrs }))
    39 % {
    35 % foreach my $iattr (sort (@{ $iattrs })) {
    40 36 % next if ( ($iattr eq 'filename') || ($iattr eq 'mini') || ($iattr eq 'width') || ($iattr eq 'height') );
    41 37 <tr><td><font size="-1" color="#888888"><% $ATTRNAMES->{$iattr} %> (<% $iattr %>):</font></td></tr>
    42 38 <tr><td><input type="text" name="<% $attr %>.<% $iattr %>" size="60" value="<% html_escape($MULTI->{$iattr}) %>" style="width:95%;font-family:arial;font-size:9pt;"></td></tr>
     
    60 56 <%INIT>
    61 57
    62 58 my $iattrs = $prop->{iattrs};
    63 $iattrs ||= [];
    59 $iattrs ||= ['alt'];
    64 60
    65 61 my $ATTRNAMES = {
    66 'alt' => 'Подпись',
    62 'alt' => 'Название',
    67 63 'btext' => 'Текст до картинки',
    68 64 'atext' => 'Текст после картинки',
    69 65 'url' => 'Ссылка с картинки',
  • utf8/core/comps/contenido/components/object_form.msn

     
    40 40
    41 41 my $prop = $properties[$_];
    42 42 my $name = $prop->{attr};
    43 next if ($prop->{hidden} == 1) || ($prop->{type} eq 'image') || ($prop->{type} eq 'external') || ($prop->{type} =~ /^array/i) || ($prop->{type} =~ /^image/) || ($prop->{type} eq 'multimedia') || ($prop->{type} eq 'multimedia_new') || ($prop->{type} eq 'audio');
    43 next if ($prop->{hidden} == 1) || ($prop->{type} eq 'image') || ($prop->{type} eq 'external') || ($prop->{type} =~ /^array/i) || ($prop->{type} =~ /^image/) || ($prop->{type} eq 'multimedia') || ($prop->{type} eq 'multimedia_new') || ($prop->{type} eq 'multimedia_multi') || ($prop->{type} eq 'audio');
    44 44
    45 45 </%perl>
    46 46 <tr><td height="8"></td></tr>
     
    162 162 MULTI => $MULTI,
    163 163 options => $options,
    164 164 &>
    165 % } elsif ($prop->{type} eq 'multimedia_new')
    166 % {
    165 % } elsif ($prop->{type} eq 'multimedia_new') {
    167 166 % my $MULTI = $object->get_image( $prop->{attr} );
    168 167
    169 168 <& "/contenido/components/inputs/multimedia_new.msn",
     
    172 171 attr => $prop->{attr},
    173 172 MULTI => $MULTI,
    174 173 options => $options,
    175 &>
    176 % } elsif ($prop->{type} eq 'audio')
    177 % {
    174 &>
    175
    176 % } elsif ($prop->{type} eq 'multimedia_multi') {
    177 % my $FILES = $object->get_image( $prop->{attr} );
    178 % if (ref($FILES) ne 'HASH') { next };
    179 % my $MN = $FILES->{maxnumber}+0;
    180 % for my $mn (1..$MN) {
    181 % my $MULTI = $FILES->{'file_'.$mn};
    182 <& "/contenido/components/inputs/multimedia_new.msn",
    183 rusname => $prop->{rusname},
    184 prop => $prop, object=>$object,
    185 attr => $prop->{attr}.'_'.$mn,
    186 MULTI => $MULTI,
    187 options => $options,
    188 &>
    189
    190 % }
    191 % my $ME = exists $prop->{empty_slots} ? $prop->{empty_slots} : 3;
    192 % $ME = ($ME + $FILES->{maxnumber}) >= 100 ? 0 : (100 - $FILES->{maxnumber} < $ME ? 100 - $FILES->{maxnumber} : $ME );
    193 % for my $mn (1..$ME) {
    194
    195 <& "/contenido/components/inputs/multimedia_new.msn",
    196 rusname => $prop->{rusname},
    197 prop => $prop, object=>$object,
    198 attr => $prop->{attr}.'_'.($MN+$mn),
    199 MULTI => {},
    200 options => $options,
    201 &>
    202
    203 % }
    204 % } elsif ($prop->{type} eq 'audio') {
    178 205 % my $MULTI = $object->get_image( $prop->{attr} );
    179 206
    180 207 <& "/contenido/components/inputs/audio.msn",
  • utf8/core/comps/contenido/components/set_multimedia_new.msn

     
    27 27 }
    28 28 if ($upload) {
    29 29
    30 my $BIN = $object->_store_binary( $upload, attr => $prop->{attr} );
    30 my $BIN = $object->_store_binary( $upload, attr => $prop->{attr}, prop => $prop );
    31 31
    32 32 if ( ref $BIN eq 'HASH' && exists $BIN->{filename} ) {
    33 33 $object->_delete_binary( $default );
  • utf8/core/comps/contenido/components/set_properties.msn

     
    101 101
    102 102 if ($SETS->{'_delete_multi.'.$name} == 1)
    103 103 {
    104 my $BINARY = eval ('my '.$object->{ $name });
    105 Contenido::File::remove($BINARY->{"filename"});
    106 $object->{$name} = '';
    104 my $BINARY = $object->get_image( $name );
    105 $object->_delete_binary( $BINARY );
    106 $object->$name('');
    107 107 } else {
    108 108 my $MULTI = undef;
    109 109 if (length($object->{ $name }) > 8)
     
    124 124
    125 125 if ($SETS->{'_delete_multi.'.$name} == 1)
    126 126 {
    127 my $BINARY = eval ('my '.$object->{ $name });
    128 Contenido::File::remove($BINARY->{"filename"});
    129 $object->{$name} = '';
    127 my $BINARY = $object->get_image( $name );
    128 $object->_delete_binary( $BINARY );
    129 $object->$name('');
    130 130 } else {
    131 131 my $MULTI = undef;
    132 132 if (length($object->{ $name }) > 8)
     
    141 141 }
    142 142 }
    143 143
    144 } elsif ($prop->{type} eq 'multimedia_multi') {
    145 # --------------------------------------------------------------------------------------
    146 # А вот это уже сложнее - составление блока из всех файлов...
    147
    148 my $FILES = $object->get_image( $name );
    149 if ( ref($FILES) ne 'HASH' ) {
    150 $FILES = {};
    151 $FILES->{maxnumber} = 0;
    152 };
    153
    154 # Теперь надо просмотреть все аргументы - а вдруг это то, что нам нужно...
    155 foreach my $arg (keys(%{ $SETS }))
    156 {
    157 # Разбиваем все на части, отделяем...
    158 my ($partname,undef) = split(/\./,$arg);
    159 $partname =~ /^(.+)_(\d+)$/;
    160 my ($localname,$number) = ($1, $2);
    161 if ( ($localname eq $prop->{attr}) && ($number > 0) && ( $arg eq $localname.'_'.$number )) {
    162 # Ура! Нашли элемент!
    163
    164 my $partname = $localname.'_'.$number;
    165
    166 if ($SETS->{'_delete_multi.'.$partname} == 1) {
    167 $object->_delete_binary( $FILES->{'file_'.$number} );
    168 delete $FILES->{'file_'.$number};
    169 } else {
    170 my $MULTI = undef;
    171 if (exists($FILES->{'file_'.$number})) {
    172 $MULTI = $FILES->{'file_'.$number};
    173 };
    174 $MULTI = $m->comp('/contenido/components/set_multimedia_new.msn', default=>$MULTI, field=>$partname, SETS=>$SETS, object=>$object, prop => $prop);
    175 if (exists($MULTI->{filename})) {
    176 $MULTI->{number} = $number;
    177 $FILES->{'file_'.$number} = $MULTI;
    178 $FILES->{maxnumber} = $number if ($number > $FILES->{maxnumber});
    179 }
    180 }
    181 }
    182 }
    183
    184 if ( scalar(keys(%{ $FILES })) > 0) {
    185 my $maxnumber = 0;
    186 for ( 1..100 ) {
    187 $maxnumber = $_ if exists $FILES->{"file_$_"} && $_ > $maxnumber;
    188 }
    189 $FILES->{maxnumber} = $maxnumber;
    190 $object->$name( $object->_serialize($FILES) );
    191 }
    192
    144 193 } elsif ( $prop->{type} eq 'audio' ) {
    145 194 # --------------------------------------------------------------------------------------
    146 195 # Добавление одного объект Мультимедиа
  • utf8/core/lib/Contenido/File.pm

     
    428 428 return unless ref $prop;
    429 429
    430 430 my $filename = '/binary/'.$object->get_file_name() || return;
    431 my $orig_name = '';
    432 if ( ref $input eq 'Apache::Upload' ) {
    433 $orig_name = $input->filename();
    434 } elsif ( !ref $input ) {
    435 $orig_name = $input;
    436 }
    437 if ( $orig_name ) {
    438 if ( $orig_name =~ /\\([^\\]+)$/ ) {
    439 $orig_name = $1;
    440 } elsif ( $orig_name =~ /\/([^\/]+)$/ ) {
    441 $orig_name = $1;
    442 }
    443 }
    431 444 if ( $prop->{softrename} ) {
    432 445 my $oid = $object->id || int(rand(10000));
    433 my $orig_name = '';
    434 if ( ref $input eq 'Apache::Upload' ) {
    435 $orig_name = $input->filename();
    436 } elsif ( !ref $input ) {
    437 $orig_name = $input;
    438 }
    439 446 if ( $orig_name ) {
    440 if ( $orig_name =~ /\\([^\\]+)$/ ) {
    441 $orig_name = $1;
    442 } elsif ( $orig_name =~ /\/([^\/]+)$/ ) {
    443 $orig_name = $1;
    444 }
    445 $orig_name =~ s/[\ \t]/_/g;
    446 $orig_name = $oid.'_'.$orig_name;
    447 my $set_name = $orig_name;
    448 $set_name =~ s/[\ \t]/_/g;
    449 $set_name = $oid.'_'.$set_name;
    447 450 $filename =~ s/\/([^\/]+)$//;
    448 451 my $fname = $1;
    449 unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
    450 $orig_name = translit( $orig_name );
    452 unless ( $set_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
    453 $set_name = translit( $set_name );
    451 454 }
    452 warn "\n\n\n\n\nNew Name: [$orig_name]\n\n\n\n\n" if $DEBUG;
    453 unless ( $orig_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
    454 $orig_name = $fname;
    455 warn "\n\n\n\n\nNew Name: [$set_name]\n\n\n\n\n" if $DEBUG;
    456 unless ( $set_name =~ /^[a-zA-Z_\d\.\-\,]+$/ ) {
    457 $set_name = $fname;
    455 458 }
    456 $filename .= '/'.$orig_name;
    459 $filename .= '/'.$set_name;
    457 460 $filename =~ s/\.([^\.]+)$//;
    458 461 }
    459 462 }
     
    491 494
    492 495 my $BINARY;
    493 496 if ( store($filename.'.'.$ext, $filename_tmp.'.'.$ext) ) {
    494 @{$BINARY}{"filename", "ext", "size"} = (
    495 $filename.".".$ext, $ext, $size
    497 @{$BINARY}{"filename", "ext", "size", "sourcename"} = (
    498 $filename.".".$ext, $ext, $size, $orig_name
    496 499 );
    497 500
    498 501 unlink $filename_tmp.'.'.$ext if -e $filename_tmp.'.'.$ext;
    499 502
    500 503 if ( $ext =~ /(rar|7z|zip|arc|lha|arj|cab)/ ) {
    501 504 $BINARY->{type} = 'archive';
    502 } elsif ( $ext =~ /(doc|rtf)/ ) {
    505 } elsif ( $ext =~ /(doc|docx|rtf)/ ) {
    503 506 $BINARY->{type} = 'doc';
    504 } elsif ( $ext eq 'xls' ) {
    507 } elsif ( $ext =~ /(xls|xlsx)/ ) {
    505 508 $BINARY->{type} = 'xls';
    506 509 } elsif ( $ext =~ /(mdb|ppt)/ ) {
    507 510 $BINARY->{type} = 'msoffice';
    508 } elsif ( $ext =~ /(pdf)/ ) {
    511 } elsif ( $ext =~ /(pdf|fb2|djvu)/ ) {
    509 512 $BINARY->{type} = 'ebook';
    510 } elsif ( $ext eq 'psd' ) {
    511 $BINARY->{type} = 'psd';
    513 } elsif ( $ext =~ /(psd|cdr)/ ) {
    514 $BINARY->{type} = 'graphics';
    515 } elsif ( $ext eq 'ico' ) {
    516 $BINARY->{type} = 'icon';
    512 517 } elsif ( $ext =~ /(exe|msi|cab)/ ) {
    513 518 $BINARY->{type} = 'executable';
    514 519 } else {
  • utf8/core/lib/Contenido/Object.pm

     
    641 641 if ( exists $opts{attachments} && $opts{attachments} ) {
    642 642 my @props = $self->structure();
    643 643 if ( @props ) {
    644 @props = grep { $_->{type} =~ /^(image|images|multimedia_new)$/ } @props;
    644 @props = grep { $_->{type} =~ /^(image|images|multimedia_new|multimedia_multi)$/ } @props;
    645 645 foreach my $prop ( @props ) {
    646 646 my $att = $self->get_image($prop->{attr});
    647 647 if ( $prop->{type} eq 'image' ) {
     
    677 677 if ( ref $att && exists $att->{filename} && $att->{filename} ) {
    678 678 Contenido::File::remove( $att->{filename} );
    679 679 }
    680 } elsif ( $prop->{type} eq 'multimedia_multi' ) {
    681 for ( 1..100 ) {
    682 next unless exists $att->{"file_$_"};
    683 my $file = $att->{"file_$_"};
    684 if ( ref $file && exists $file->{filename} && $file->{filename} ) {
    685 Contenido::File::remove( $file->{filename} );
    686 }
    687 }
    680 688 }
    681 689 }
    682 690 }
     
    1200 1208 # Вычищает все мини-копии
    1201 1209 #
    1202 1210 # Формат использования:
    1203 # $document->_store_image( $image_attr_structure )
    1211 # $document->_delete_image( $image_attr_structure )
    1204 1212 # ----------------------------------------------------------------------------
    1205 1213 sub _delete_image {
    1206 1214 my $self = shift;
     
    1210 1218 }
    1211 1219
    1212 1220 # ----------------------------------------------------------------------------
    1213 # Метод _store_binary() сохраняет произвольный бинарный файл, привязанную к полю multimedia или multimedia_new
    1221 # Метод _store_binary() сохраняет произвольный бинарный файл, привязанную к полю multimedia_multi или multimedia_new
    1214 1222 #
    1215 1223 # Формат использования:
    1216 1224 # $document->_store_binary( INPUT, attr => 'fieldname' )

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

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

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

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

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