как сделать чтобы работало несколько форм
Здравствуйте. Помогите с такой проблемой, есть страница на которой модуль выводит несколько (примерно 5-8) товаров определенной категории, выводятся они циклом foreach в нем я разместил форму загрузки файла на сайт, т.е. в каждом товаре этого модуля появляется возможность "прикрепить" к нему файл. Но возникли проблемы со скриптом (он по большей части отвечал за всякие визуальные составляющие, типо тут вывести надпись об ошибке/успехе, тут скрой/покажи кнопочку и т.д.), так вот он нормально работает только если товар один, а если их больше то все сыпется либо вообще не делается. Как этого избежать, как я понимаю скрипт как-то должен понимать где "кончается" один товар и "начинается" другой, еслиб не цикл можно было назначить классы да написать каждому свой скрипт, а так...:help: :help:
п.с. дааалеко НЕ спец :no: только учусь и постигаю, но вот эту траблу хотелось бы решить... |
Каждый товар в своей форме что ли? Мило.
|
Ладно, гоните сюда хтмл из своего форича, там небось все коаксиальные поля либо под одинаковым именем, либо все под разными.
И еще, х-ый у вас значит скрипт. И хтмл такой же. Хорошему скрипту по барабану сколько там полей - хоть 100500. |
да не полей там несколько, поле всего одно загрузка файла на сервер в опр.папку. просто цыкл выводит несколько товаров, и в каждом из них получается есть форма загрузки.
код default.php модуля: ... if ($display_style == "div") { ?> <div class="vmproduct<?php echo $params->get ('moduleclass_sfx'); ?> productdetails"> <?php foreach ($products as $product) { ?> <div class="<?php echo $pwidth ?> <?php echo $float ?>"> <div class="spacer"> <div id="mod_vmprodload_name"><?php echo $product->product_name ?></div> <div id="mod_vmprodload"> <?php if (!empty($product->images[0])) { $image = $product->images[0]->displayMediaThumb ('class="featuredProductImage"', FALSE); } else { $image = ''; } echo JHTML::_ ('link', JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id), $image, array('title' => $product->product_name)); echo '<div class="clear"></div>'; $url = JRoute::_ ('index.php?option=com_virtuemart&view=productdetails&virtuemart_product_id=' . $product->virtuemart_product_id . '&virtuemart_category_id=' . $product->virtuemart_category_id); ?> <a href="<?php echo $url ?>"><?php echo $product->product_name ?></a> <?php echo '<div class="clear"></div> </div>'; ?> <script type="text/javascript"> function hideBtn(){ jQuery('#upload').hide(); jQuery('#res').html("Идет загрузка файла"); } function handleResponse(mes) { jQuery('#upload').show(); if (mes.errors != null) { jQuery('#res').html("Возникли ошибки во время загрузки файла: " + mes.errors); } else { jQuery('#mod_vmprodload_link').css({'display' : 'block'}); jQuery('#mod_vmprodload_name').css({'display' : 'none'}); jQuery('#upl_label').hide(); jQuery('#upl_upload').hide(); jQuery('#res').html("Файл " + mes.name + " загружен"); jQuery('#hiddenframe').addClass('up_frame'); jQuery('#PricesalesPrice_wrap').addClass('PricesalesPrice_wrap'); } } jQuery(function(){ var wrapper = jQuery( ".file_upload" ), inp = wrapper.find( "input#userfile" ), btn = wrapper.find( "span.button" ), lbl = wrapper.find( "mark" ); // Crutches for the :focus style: inp.focus(function(){ wrapper.addClass( "focus" ); }).blur(function(){ wrapper.removeClass( "focus" ); }); var file_api = ( window.File && window.FileReader && window.FileList && window.Blob ) ? true : false; inp.change(function(){ var file_name; if( file_api && inp[ 0 ].files[ 0 ] ) file_name = inp[ 0 ].files[ 0 ].name; else file_name = inp.val().replace( "C:\\fakepath\\", '' ); if( ! file_name.length ) return; if( lbl.is( ":visible" ) ){ lbl.text( file_name ); btn.text( "Выбрать" ); btn.css({'width' : '0px'}); }else btn.text( file_name ); }).change(); }); jQuery( window ).resize(function(){ jQuery( ".file_upload input" ).triggerHandler( "change" ); }); </script> <form action="/lambite/modules/mod_virtuemart_product/tmpl/upload.php" method="post" target="hiddenframe" enctype="multipart/form-data" onsubmit="hideBtn();"> <label id="upl_label" class="file_upload"> <span class="button">Выбрать</span> <mark id="upl_mark">Файл не выбран</mark> <input type="hidden" name="MAX_FILE_SIZE" value="5000000" /> <input type="file" id="userfile" name="userfile" /> </label> <input type="submit" name="upload" id="upl_upload" value="Загрузить" /> </form> <div id="res"></div> <iframe id="hiddenframe" class="" name="hiddenframe" style="width:0px; height:0px; border:0px"></iframe> <?php if ($show_price) { // echo $currency->priceDisplay($product->prices['salesPrice']); if (!empty($product->prices['salesPrice'])) { echo '<div id="PricesalesPrice_wrap" class="">Цена: '.$currency->createPriceDiv ('salesPrice', '', $product->prices, FALSE, FALSE, 1.0, TRUE).'</div>'; } // if ($product->prices['salesPriceWithDiscount']>0) echo $currency->priceDisplay($product->prices['salesPriceWithDiscount']); if (!empty($product->prices['salesPriceWithDiscount'])) { echo '<div class="PricesalesPrice_wrap">Цена со скидкой: '.$currency->createPriceDiv ('salesPriceWithDiscount', '', $product->prices, FALSE, FALSE, 1.0, TRUE).'</div>'; } } ?><div id="mod_vmprodload_link"><a href="<?php echo $url ?>">Продолжить</a></div><?php if ($show_addtocart) { echo mod_virtuemart_product::addtocart ($product); } ?> </div> </div> <?php if ($col == $products_per_row && $products_per_row && $col < $totalProd) { echo " </div><div style='clear:both;'>"; $col = 1; } else { $col++; } } ?> </div> <br style='clear:both;'/>... код обработчика формы upload.php: <?php if(isset($_POST['upload'])){ $whitelist = array(".gif", ".jpeg", ".jpg", ".png"); $data = array(); $error = true; foreach ($whitelist as $item) { if(preg_match("/$item\$/i",$_FILES['userfile']['name'])) $error = false; } if(!$error) { $folder = $_SERVER['DOCUMENT_ROOT'].'/lambite/uploads/user_img/'; $folder1 = '/lambite/uploads/user_img/'; // Генерируем случайное число $file_name = uniqid(rand(10000,99999)); $uploadedFile = $folder.$file_name."_".basename($_FILES['userfile']['name']); if(is_uploaded_file($_FILES['userfile']['tmp_name'])){ if(move_uploaded_file($_FILES['userfile']['tmp_name'],$uploadedFile)){ $data = $_FILES['userfile']; } else { $data['errors'] = "Во время загрузки файла произошла ошибка"; } } else { $data['errors'] = "Проверьте размер или целостность файла"; } } else{ $data['errors'] = 'Вы загружаете запрещенный тип файла'; } //Формируем js-файл $res = '<script type="text/javascript">'; $res .= "var data = new Object;"; foreach($data as $key => $value){ $res .= 'data.'.$key.' = "'.$value.'";'; } $res .= 'window.parent.handleResponse(data);'; $res .= "</script>"; echo $res; echo '<div> <img src="'.$uploadedFile1.'" alt="Ваш оттиск" style="width: 160px; height: 160px; margin: -8px;"> </div>'; } else{ die("ERROR"); } ?> |
Цитата:
|
ээмм... моих познаний не хватает понять ваш ответ
|
В общем formdata у вас конкретно одна, что вы еще называете формой я не понял. И под эту одну форму заточен соответственно процессинг. Если вы хотите добавить туда несколько кнопок file то надо просто добавить в их имя вот такой текст [] - в конец имени. И соответственно во всех скриптах - js и php - обеспечить обработку еще одного измерения массива. А ну да, в js не надо если все сделано на событиях - я из этой каши не понял как сделано. А в php надо.
Вот так надо рендерить, чтобы получилось вот так: <input type="file" id="userfile" name="userfile[]" /> Про id я не знаю, если js на event'ах ему пофигу id, а если нет - то id как name. Затем в php (хрень про whitelist - в газенваген, это все проверяется в рабочем цикле) Код:
foreach($_FILES['userfile'] as $uploadedFile) Она существует в туевой хуче вариантов, у меня в таком, который цепляет файлы в $_POST (гетом как-то не приходилось еще файлы передавать) Код:
public function get_postfiles($table=null) { |
Цитата:
Натырили старье. |
Припоминаю, если несколько кнопок, то все правильно - будет массив с ключом по имени до [], а если кнопка с multiple, то будет 1 массив, но зато поля name, tmp_name, type, etc - станут массивами. Скрипт на php процитированный выше хавает любой вариант и делает из всего что в $_FILES привычный ассоциативный массив типа
file[0]= array(name=>, tmp_name=>... file[1]= array(name=>, tmp_name=>... ... |
я тут покрутил всю эту мою кашу и понял что код javascript применяется только к первому элементу цикла foreach (который формирует "список" товаров в модуле), и в этом вся проблема вроде. почему скрипт перестает работать после первого "прохода"? я видать что-то не знаю?
|
Часовой пояс GMT +3, время: 03:38. |