09.10.2014, 04:35
|
Интересующийся
|
|
Регистрация: 05.05.2014
Сообщений: 23
|
|
как сделать чтобы работало несколько форм
Здравствуйте. Помогите с такой проблемой, есть страница на которой модуль выводит несколько (примерно 5-8) товаров определенной категории, выводятся они циклом foreach в нем я разместил форму загрузки файла на сайт, т.е. в каждом товаре этого модуля появляется возможность "прикрепить" к нему файл. Но возникли проблемы со скриптом (он по большей части отвечал за всякие визуальные составляющие, типо тут вывести надпись об ошибке/успехе, тут скрой/покажи кнопочку и т.д.), так вот он нормально работает только если товар один, а если их больше то все сыпется либо вообще не делается. Как этого избежать, как я понимаю скрипт как-то должен понимать где "кончается" один товар и "начинается" другой, еслиб не цикл можно было назначить классы да написать каждому свой скрипт, а так...
п.с. дааалеко НЕ спец только учусь и постигаю, но вот эту траблу хотелось бы решить...
|
|
09.10.2014, 08:18
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Каждый товар в своей форме что ли? Мило.
|
|
09.10.2014, 08:22
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Ладно, гоните сюда хтмл из своего форича, там небось все коаксиальные поля либо под одинаковым именем, либо все под разными.
И еще, х-ый у вас значит скрипт. И хтмл такой же. Хорошему скрипту по барабану сколько там полей - хоть 100500.
|
|
09.10.2014, 11:48
|
Интересующийся
|
|
Регистрация: 05.05.2014
Сообщений: 23
|
|
да не полей там несколько, поле всего одно загрузка файла на сервер в опр.папку. просто цыкл выводит несколько товаров, и в каждом из них получается есть форма загрузки.
код 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");
}
?>
|
|
09.10.2014, 12:09
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от landerorly
|
просто цыкл выводит несколько товаров, и в каждом из них получается есть форма загрузки.
|
Где несколько форм? Во всей вашей телеге 1 вхождение на <form
|
|
09.10.2014, 12:21
|
Интересующийся
|
|
Регистрация: 05.05.2014
Сообщений: 23
|
|
ээмм... моих познаний не хватает понять ваш ответ
|
|
09.10.2014, 12:23
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
В общем 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)
$folder.$file_name."_".basename($uploadedFile['name']);
// ну или типа того, я всегда забываю устройство $_FILES |
потому что один раз написал функцию транспозинга и с тех пор не помню как он устроен.
Она существует в туевой хуче вариантов, у меня в таком, который цепляет файлы в $_POST (гетом как-то не приходилось еще файлы передавать)
Код:
|
public function get_postfiles($table=null) {
if(!$table)
$table=$this->table_name;
$post=array();
if(!empty($_POST) && isset($_POST[$table]))
$post=$_POST[$table];
if(!empty($_FILES) && isset($_FILES[$table])) {
foreach($_FILES[$table] as $field=>$values)
foreach($values as $index=>$value)
if(is_array($value))
foreach($value as $i=>$v)
$post[$index][$i][$field]=$v;
else
$post[$index][0][$field]=$value;
}
return (empty($post))?null:$post;
} |
Последний раз редактировалось kostyanet, 09.10.2014 в 12:26.
|
|
09.10.2014, 12:25
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Сообщение от landerorly
|
ээмм... моих познаний не хватает понять ваш ответ
|
Да я понял что вы все это натырили и теперь не понимаете как прикрутить туда хотелки заказчика/начальства.
Натырили старье.
|
|
09.10.2014, 12:32
|
Профессор
|
|
Регистрация: 23.10.2010
Сообщений: 2,718
|
|
Припоминаю, если несколько кнопок, то все правильно - будет массив с ключом по имени до [], а если кнопка с multiple, то будет 1 массив, но зато поля name, tmp_name, type, etc - станут массивами. Скрипт на php процитированный выше хавает любой вариант и делает из всего что в $_FILES привычный ассоциативный массив типа
file[0]= array(name=>, tmp_name=>...
file[1]= array(name=>, tmp_name=>...
...
|
|
10.10.2014, 08:56
|
Интересующийся
|
|
Регистрация: 05.05.2014
Сообщений: 23
|
|
я тут покрутил всю эту мою кашу и понял что код javascript применяется только к первому элементу цикла foreach (который формирует "список" товаров в модуле), и в этом вся проблема вроде. почему скрипт перестает работать после первого "прохода"? я видать что-то не знаю?
|
|
|
|