Calm
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Наконец-то дошли руки. Сразу скажу, что элегантного решения так и не нашел. Первоначальная идея была такая. При создании формы ответа автоматически генерится необходимое кол-во (по разрешенному кол-ву картинок в топике) скрытых (через style) input`ов с типом file. К IB-кнопкам добавляется еще одна '[Image from Disk]'. Создаются два счетчика: Нажатий на '[Image from Disk]' и нажатий на '[Image]' для контроля количества файлов. На onClick для '[Image from Disk]' вешается вызов вида Код: eval("document.REPLIER.file"+$count1+".click()"); | На поле ввода файла (скрытое) на onChange повешать обработку строки и добавление ее в текстовое поле ввода. В парсере эти строки сопоставляются с переданными файлами, файлы закачаваются, ссылки подменяются. Сделал - не работает. При нажатии на submit поле у file просто очищается и ничего не происходит. Абыдно. Пока выкладываю упрощенный вариант, минимум проверок и автоматики. Попробовал - у меня на 3.1.1 работает, но preview забыл глянуть. Привязка дана, наверное, не самая лучшая. В форме поля выводятся, если разрешен upload. А реально закачиваются файлы и вставляются ссылки, если картинки разрешены. Говорю же - упрощенный вариант. Итак ... 1. В PostWords.pm после Код: 'upload_title' => q!Прикрепление файла!, | добавить Код: 'upload_img' => q!Вы можете закачать на сервер картинки, они автоматически будет вставлена в текст сообщения. Максимальный общий размер файлов (в байтах):!, 'upload_title_img' => q!Закачка картинок на сервер!, | 2. В PostView.pm перед Код: вставить Код: function ImageFromDisk(num) { var FoundErrors = ''; var enterURL = eval("document.REPLIER.USR_IMG_"+num+".value"); if (!enterURL) { FoundErrors += "\\n" + error_no_url; } if (FoundErrors) { alert("Error!"+FoundErrors); return; } var ToAdd = "[LOAD_IMG]"+num+"="+enterURL+"[/LOAD_IMG]"; document.REPLIER.Post.focus(); document.REPLIER.Post.value += ToAdd+' '; document.REPLIER.Post.focus(); } | 3. В PostView.pm в Код: после Код: <td bgcolor='$iB::SKIN->{'MISCBACK_ONE'}'><input type='file' size='30' name='FILE_UPLOAD'></td> </tr> | вставить Код: <tr> <td bgcolor='$iB::SKIN->{'MISCBACK_TITLE'}' align='left' colspan='2' id='titlelarge'>$Post::lang->{'upload_title_img'}</td> </tr> <tr> <td bgcolor='$iB::SKIN->{'MISCBACK_ONE'}' align='left' valign='top'>$Post::lang->{'upload_img'} $data</td> <td bgcolor='$iB::SKIN->{'MISCBACK_ONE'}'> <input onchange="ImageFromDisk('1')" name="USR_IMG_1" type="file" size="30"><br> <input onchange="ImageFromDisk('2')" name="USR_IMG_2" type="file" size="30"><br> <input onchange="ImageFromDisk('3')" name="USR_IMG_3" type="file" size="30"><br> <input onchange="ImageFromDisk('4')" name="USR_IMG_4" type="file" size="30"><br> <input onchange="ImageFromDisk('5')" name="USR_IMG_5" type="file" size="30"></td> </tr> | 4. В iTextparser.pm после Код: вставить Код: 5. В iTextparser.pm перед Код: if (($Txt=~ m!(\[FLASH=)(\S+?)(\,)(\S+?)(\])(\S+?)(\[\/FLASH\])!i) and ($iB::INFO->{'ALLOW_FLASH'})) { | вставить Код: while ($Txt =~ s{\[LOAD_IMG\](.+?)\[\/LOAD_IMG\]} { my $file_number = substr($1,0,1); my $file_name = undef; my $test_to_load = "USR_IMG_$file_number"; my $file_to_load = $iB::CGI->param("USR_IMG_$file_number"); my $tmp_load_file = $iB::CGI->tmpFileName($file_to_load); $file_to_load =~ /([^\\\/\:]+)$/; $file_name = $1; $file_name =~ s/[^\w\.]/\_/g; $file_name = "load-$iB::IN{f}-".substr(time, 5,10)."-".$file_name; if ( ($file_name =~ /\.(cgi|pl|js|asp)$/i) or ($file_name =~ /\.php\d{0,2}$/i) ) { $file_name =~ s!\.!-!g; $file_name .= '.txt'; } unless ($iB::INFO->{'PUBLIC_UPLOAD'}) { $iB::INFO->{'PUBLIC_UPLOAD'} = $iB::INFO->{'HTML_DIR'}; $iB::INFO->{'PUBLIC_UPLOAD'} =~ s/non-cgi/uploads/; } $iB::INFO->{'PUBLIC_UPLOAD'} .= '/' unless $iB::INFO->{'PUBLIC_UPLOAD'} =~ m!/$!; chmod(0777, $iB::INFO->{'PUBLIC_UPLOAD'}); my $new_file = $iB::INFO->{'PUBLIC_UPLOAD'}."$file_name"; my ($buffer, $bytes_read, $size); open(OUTFILE, ">$new_file") or die "Cannot upload to $iB::INFO->{'PUBLIC_UPLOAD'}$file_name ($@)"; binmode(OUTFILE); while ($bytes_read = read($file_to_load, $buffer, 2096)) { $size += $bytes_read; print OUTFILE $buffer; } close (OUTFILE); chmod(0777, $new_file); my $main_url = $iB::INFO->{'UPLOAD_URL'}."/$file_name"; qq#<img src="$main_url" border="0" title="">#; }eisgx) {} | Вроде всё. Комментарии желательны, т.к. на перле пишу мало и не так давно. |