Загрузка файлов в корзине virtuemart 3

Задача: Нужно добавить возможность загрузки файла при оформление заказа в виртуемарт. Например у вас есть интернет магазин футболок на джумале и вы хотите, чтобы при заказе пользователь мог указать картинку, которую он хочет видеть на своей футболке.

Решение: Мы сделаем так, что пользователь сможет добавлять не один файл. У меня установлен компонент "onepage_generic" (заказ в один шаг), поэтому я буду работать в основном с ним. Если у вас нету этого компонента, то не переживайте, вам просто надо будет найти файлы в которых выводятся поля заполняемые пользователем и файлы отвечающие за отправку письма о заказе.

Открываем файл "\plugins\system\onepage_generic\cart\tmpl\default_shopper.php" Перед этой строчкой:

<a id="shiptobutton" class="opg-button opg-width-1-1" href="#" data-opg-modal="<?php echo $target; ?>"><i id="shiptoicon" style="display:none;" class="opg-icon opg-icon-check opg-margin-right"></i><?php echo JText::_('PLG_SYSTEM_VMUIKIT_CHANGE_SHIP_ADDRESS'); ?></a>

Добавляем код:

<label><strong>Выберите рисунок:</strong></label><br>
<input type="file" name="uploadfile[]"><br>	
<span id="df-sk"></span>	
<input type="hidden" id="kolf" value="1" name="kolf"/>
<div class="dobavsk">
	Добавить файл
</div>

Для того, чтобы по нажатию на кнопку "Добавить файл", появлялся новый инпут для добавления файла, найдите файл "\plugins\system\onepage_generic\onepage.js" и добавьте вот этот код:

jQuery(".dobavsk").click(function(){
	var kol = jQuery("#kolf").val();
	kol = parseInt(kol)+1;
	jQuery("#kolf").attr("value", kol);	
	jQuery('<input type="file" name="uploadfile[]"></br>').insertBefore("#df-sk");
});

При клике переменная kol получает значение скрытого инпута, приплюсовывает к этому значению единицу и записывает новый результат в тот же скрытый инпут (зачем вы узнаете ниже), затем идет добавление нового инпута типа file перед элементом с id "df-sk". Теперь надо вставить php код для загрузки файлов на сервер, поэтому открываем в корне index.php и в конце файла пишем:

<?php 
if($_FILES){	
	for($xx=0; $xx<$_POST["kolf"]; $xx++){
		copy($_FILES['uploadfile']['tmp_name'][$xx],"uploads/".basename($_FILES['uploadfile']['name'][$xx]));
	}
}
?>

Наверное index.php не лучший файл для этого, вы возможно найдете другое место для этой операции. $_POST["kolf"] - Это как раз значение нашего скрытого инпута оно содержит количество инпутов типа file, т.е. в цикле выполняется загрузка всех файлов в папку, которая лежит в корне сайта: uploads. Файлы на сервер загружаются, теперь надо сделать так, чтобы эти картинки приходили в письме с заказом. Для этого откройте файл "/components/com_virtuemart/views/invoice/tmpl/invoice_items.php" и например в конце перед закрывающем тегом </table>, добавьте:

<strong>Картинки:</strong></br>
<?php
for($xx=0; $xx<$_POST["kolf"]; $xx++){ ?>
	<img src="http://ваш_сайт/uploads/<?=$_FILES['uploadfile']['name'][$xx];?>"/><br>
<?php
} ?>

Этот код конечно далеко не универсальный и наверное он подойдет не всем, но я думаю, что если перед вами стоит похожая задача, то эта статья будет вам полезна.

Комменатрии
Алексей 07.02.2020 13:40:38
не работает это решение - всё добавилось, но файл не заливается в папку uploads - подскажите в чем проблема ? и если в index.php в корне ваш код вставить, то сайт ложится (без <php? - без ошибок)
Ответить
Станислав 10.02.2020 13:45:26
Алексей, Проверьте какие права стоят на папку uploads, возможно нет прав на запись в эту папку. По поводу того, что вы вставляете код в index.php думаю, что там точно будут какие-то ошибки, так как этот файл как точка входа, туда этот код вставлять не надо
Ответить
Гость 23.02.2021 09:37:47
Здравствуйте! У меня нет такой папки (\plugins\system\onepage_generic) к сожалению. Версия вирту - VirtueMart 3.8.9 10473. Есть ли выход для работы с новой версией ?
Ответить
Добавить комментарий