Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.10.2014, 04:35
Интересующийся
Отправить личное сообщение для landerorly Посмотреть профиль Найти все сообщения от landerorly
 
Регистрация: 05.05.2014
Сообщений: 23

как сделать чтобы работало несколько форм
Здравствуйте. Помогите с такой проблемой, есть страница на которой модуль выводит несколько (примерно 5-8) товаров определенной категории, выводятся они циклом foreach в нем я разместил форму загрузки файла на сайт, т.е. в каждом товаре этого модуля появляется возможность "прикрепить" к нему файл. Но возникли проблемы со скриптом (он по большей части отвечал за всякие визуальные составляющие, типо тут вывести надпись об ошибке/успехе, тут скрой/покажи кнопочку и т.д.), так вот он нормально работает только если товар один, а если их больше то все сыпется либо вообще не делается. Как этого избежать, как я понимаю скрипт как-то должен понимать где "кончается" один товар и "начинается" другой, еслиб не цикл можно было назначить классы да написать каждому свой скрипт, а так...
п.с. дааалеко НЕ спец только учусь и постигаю, но вот эту траблу хотелось бы решить...
Ответить с цитированием
  #2 (permalink)  
Старый 09.10.2014, 08:18
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Каждый товар в своей форме что ли? Мило.
Ответить с цитированием
  #3 (permalink)  
Старый 09.10.2014, 08:22
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Ладно, гоните сюда хтмл из своего форича, там небось все коаксиальные поля либо под одинаковым именем, либо все под разными.

И еще, х-ый у вас значит скрипт. И хтмл такой же. Хорошему скрипту по барабану сколько там полей - хоть 100500.
Ответить с цитированием
  #4 (permalink)  
Старый 09.10.2014, 11:48
Интересующийся
Отправить личное сообщение для landerorly Посмотреть профиль Найти все сообщения от landerorly
 
Регистрация: 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");
}

?>
Ответить с цитированием
  #5 (permalink)  
Старый 09.10.2014, 12:09
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от landerorly
просто цыкл выводит несколько товаров, и в каждом из них получается есть форма загрузки.
Где несколько форм? Во всей вашей телеге 1 вхождение на <form
Ответить с цитированием
  #6 (permalink)  
Старый 09.10.2014, 12:21
Интересующийся
Отправить личное сообщение для landerorly Посмотреть профиль Найти все сообщения от landerorly
 
Регистрация: 05.05.2014
Сообщений: 23

ээмм... моих познаний не хватает понять ваш ответ
Ответить с цитированием
  #7 (permalink)  
Старый 09.10.2014, 12:23
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 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.
Ответить с цитированием
  #8 (permalink)  
Старый 09.10.2014, 12:25
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от landerorly
ээмм... моих познаний не хватает понять ваш ответ
Да я понял что вы все это натырили и теперь не понимаете как прикрутить туда хотелки заказчика/начальства.

Натырили старье.
Ответить с цитированием
  #9 (permalink)  
Старый 09.10.2014, 12:32
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 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 (permalink)  
Старый 10.10.2014, 08:56
Интересующийся
Отправить личное сообщение для landerorly Посмотреть профиль Найти все сообщения от landerorly
 
Регистрация: 05.05.2014
Сообщений: 23

я тут покрутил всю эту мою кашу и понял что код javascript применяется только к первому элементу цикла foreach (который формирует "список" товаров в модуле), и в этом вся проблема вроде. почему скрипт перестает работать после первого "прохода"? я видать что-то не знаю?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать, чтобы скрипт работал только если текущий документ iframe? ruslan_mart Общие вопросы Javascript 10 14.01.2015 13:56
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
как сделать чтобы страница не обновлялась? teles Общие вопросы Javascript 5 25.05.2012 11:20
Как сделать чтобы textarea тянулась в высоту при добавлении в нее текста? javasc Общие вопросы Javascript 4 27.03.2012 22:14
Как сделать чтобы ссылки открывались в родительском окне infom@n Общие вопросы Javascript 2 02.10.2011 00:05