Прикрепить файл к заказу Virtuemart 2.6.6 + VirtueMart Email Manager 3.1.1 + One Page Checkout 2.0.232.020414

184914ea060782b07e-AttachmentНесколько дней назад, я публиковал специальный плагин Order Upload Pro for Virtuemart, который позволяет прикрепить файл к заказу в Virtuemart 2. К сожалению, в моем случае, данный плагин не смог решить поставленную задачу, а именно, дать возможность юридическим лицам прикрепить реквизиты организации к заказу. Почему не решил? Потому как данный плагин позволяет вкладывать файл только зарегистрированным и авторизированным пользователям (в моем случае регистрация на сайте отсутствовала) и работает он только со стандартной корзиной Virtuemart 2, а у меня стояла корзина OnePage Checkout. Так, что пришлось внести правки в 3 компонента. Сразу хочу предупредить, если Вы хотите организовать поле загрузки файла по этой инструкции, у Вас обязательно должны быть установлены компоненты  One Page Checkout 2.0.232 и VirtueMart Email Manager 3.1.1. На других версиях данных расширений по-сути работать тоже должно, но я не проверял.

С самого начала, создадим папку assets корневой директории сайта, куда поместим файлы:

ajaxfileupload.js, также положите этот файл в корневую директорию сайта.

loading — Иконка загрузки

Создаём папку formupload в корневой директории и помещаем туда файл:

doajaxfileupload.php

Также создаём в этой папка папку files.

Начнем с редактирования файлов компонента One Page Checkout Файл: /components/com_onepage/themes/ваша тема/onepage.logged.tpl.php В моём случае строка: 308 Добавляем в место, где вы хотите выводить форму загрузки файла для авторизованных пользователей.

<script type="text/javascript" src="/assets/ajaxfileupload.js"></script>
<script type="text/javascript">

function ajaxFileUpload()
{

jQuery("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});

jQuery.ajaxFileUpload
(
{
url:'/formupload/doajaxfileupload.php',
secureuri:false,
fileElementId:'fileToUpload',
dataType: 'json',

success: function (data, status)
{

if(typeof(data.error) != 'undefined')
{
if(data.error != '')
{
alert(data.error);
}else
{
alert(data.msg);
jQuery('#reses').append('<li>Файл: <input type="hidden" name="files[] " value="http://ваш-сайт/formupload/'+data.filename+'" /><a href="http://ваш-сайт/formupload/'+data.filename+'">'+data.name+'</a> <a style="cursor:pointer;color:red" onclick="jQuery(this).parent().remove()">Удалить</a></li>');

}
}
},
error: function (data, status, e)
{
alert(e);
}
}
)
return false;

}
</script>
<div id="fileuploadnew" class="opc_section" style="width:100%">
<div class="opc_heading"><span class="opc_title">Загрузить реквизиты</span></div>
<div class="opc_inside">
<div>
<img id="loading" src="/assets/loading.gif" style="display:none;">
<input id="fileToUpload" type="file" size="45" onchange ="ajaxFileUpload();" name="fileToUpload" class="input">
<div style="margin-top:10px" id="reses">

</div>
</div>
</div>

</div>

Файл: /components/com_onepage/themes/ваша тема/onepage.unlogged.tpl.php В моём случае строка: 470 Добавляем в место, где вы хотите выводить форму для не авторизованных пользователей.

<script type="text/javascript" src="/assets/ajaxfileupload.js"></script>
<script type="text/javascript">

function ajaxFileUpload()
{

jQuery("#loading")
.ajaxStart(function(){
$(this).show();
})
.ajaxComplete(function(){
$(this).hide();
});

jQuery.ajaxFileUpload
(
{
url:'/formupload/doajaxfileupload.php',
secureuri:false,
fileElementId:'fileToUpload',
dataType: 'json',

success: function (data, status)
{

if(typeof(data.error) != 'undefined')
{
if(data.error != '')
{
alert(data.error);
}else
{
alert(data.msg);
jQuery('#reses').append('<li>Файл: <input type="hidden" name="files[] " value="http://ваш-сайт/formupload/'+data.filename+'" /><a href="http://ваш-сайт/formupload/'+data.filename+'">'+data.name+'</a> <a style="cursor:pointer;color:red" onclick="jQuery(this).parent().remove()">Удалить</a></li>');

}
}
},
error: function (data, status, e)
{
alert(e);
}
}
)
return false;

}
</script>
<div id="fileuploadnew" class="opc_section" style="width:100%;display:none">
<div class="opc_heading"><span class="opc_title">Загрузить реквизиты</span></div>
<div class="opc_inside">
<div>
<img id="loading" src="/assets/loading.gif" style="display:none;">
<input id="fileToUpload" type="file" size="45" onchange ="ajaxFileUpload();" name="fileToUpload" class="input">
<div style="margin-top:10px" id="reses">

</div>
</div>
</div>

</div>

Файл: /components/com_onepage/overrides/cart_override.php Строка: 570 после $this->getModifiedOrder($order, $cart);

if(!empty($cart->files)){
$dbj = JFactory::getDBO();
$q = "update #__virtuemart_orders SET `files`='".serialize($cart->files)."' where virtuemart_order_id = '".$this->getEscaped($dbj, $orderID)."' limit 1";
$dbj->setQuery($q);
$dbj->query();
}

Строка 730 После: // Send the email

var_dump(file_exists(JPATH_VM_SITE.DS.'views'.DS.'invoice'.DS.'view.html.php'));die;

Файл: /components/com_onepage/controllers/opc.php Строка: 3859 после else $cart->STsameAsBT = 1; (будьте внимательны, в этом файле много похожих строк)

if(!empty($data['files'])){
$cart->files=$data['files'];
}else{
$cart->files=array();
}

Теперь редактируем один файл в компоненте Virtuemart. При обновлении Virtuemart, вероятнее всего данное изменение будет утеряно. Но я думаю внести эти правки повторно не должно составить труда. Но обновлять по-сути после этих правок лучше не надо. Файл: /administrator/components/com_virtuemart/views/orders/tmpl/order.php Строка: 107 (перед закрытием php)

if(!empty($this->orderdetails['details']['ST']->files)){
$files = unserialize($this->orderdetails['details']['ST']->files);
}

Строка 276 (должно получиться так)

<table class="adminlist" cellspacing="0" cellpadding="0">
<thead>
<tr>
<th>Файлы</th>
</tr>
</thead>
<tr>
<td valign="top" align="left" width="50%">
<?php if(!empty($files)){?>
<?php foreach ($files as $file){ ?>
<li><a href="<?php echo $file?>"><?php $ex = explode("/",$file); $dd = array_pop($ex); echo $dd; ?></a>
</li>
<?php }?>
<?php }else{ ?>
Нет файлов
<?php } ?>
</td>

</tr>
</table>

Теперь сделаем так, что бы компонент VirtueMart Email Manager в письмо прикреплял ссылку на файл. Файл: /administrator/components/com_vmemails/helper.php Строка: 142 после $str = str_replace( INTERA_USER_ID, $user_id, $str);

$filesstr="";
if(!empty($order_details->files)){
$filesstr = "<h3>Файлы</h3><ul>";
$filarr = unserialize($order_details->files);
foreach($filarr as $file){
$ex = explode("/",$file);
$dd = array_pop($ex);
$filesstr .= "<li><a href='".$file."'>".$dd."</a></li>";
}
$filesstr .= "</ul>";
}

$str = str_replace( INTERA_ORDER_FILES , $filesstr, $str);

Файл: /administrator/components/com_vmemails/labels.php Строка: в конец файла

define ('INTERA_ORDER_FILES', '[FILES]');

В шаблон письма VirtueMart Email Manager, в нужное место добавить: [FILES]

Теперь необходимо создать поле в таблице ваш-префикс_virtuemart_orders. Для этого заходим в утилиту phpMyAdmin, выбираем нашу базу данных и выполняем команду:

ALTER TABLE `ваш-префикс_virtuemart_orders` ADD COLUMN `files` text

На этом всё! Способ конечно не самый простой, но единственный описанный. Поиски на просторах всемирной паутины, мне не дали абсолютно никаких результатов. Поэтому пришлось решать самостоятельно.


Комментариев: 19 на Прикрепить файл к заказу Virtuemart 2.6.6 + VirtueMart Email Manager 3.1.1 + One Page Checkout 2.0.232.020414

Здравствуйте. Спасибо за статью, но увы пока не заработало, т.к. возникли вопросы что за пути » src=»/assets/ajaxfileupload.js», url:’/formupload/doajaxfileupload.php’, src=»/assets/loading.gif», url:’/formupload/doajaxfileupload.php’, и т.п. «. Я не силен в js (мягко говоря), поэтому можно поподробней что это за файлы где их взять, куда положить, и что там за ссылки на сайт…

Исправил материал. Добавил файлы, которых не хватало. Теперь всё должно работать.

Роман, добрый день. Сделал как вы описали все. Из мозилы идет постоянная загрузка файла, а из хрома выдает «No file was uploaded»…

Не посмотрели? Проблема у меня, я так понимаю, с doajaxfileupload.php файлом. где-то там что-то не отрабатывает. Но я так и не понял где, т.к. не знаком с php. Пытался что-то в интернете найти — бесполезно

пришлось изменить кое-что в doajaxfileupload.php, а именно
$uploaddir = $_SERVER[‘DOCUMENT_ROOT’] . «/formupload/»;
$filename = $tname;

теперь все загружает.. но вот ссылку на файл с письмом не присылает.. подскажите куда дальше смотреть.

Приношу свои извинения, за полу-рабочий вариант решения данной проблемы. Все данные у меня на работе, так, что ответить смогу только на неделе. Потому как на работе тоже хватает дел. Решение будет!

Верните настройки файла и создайте папку files в корне сайта.

здравствуйте. спасибо. вернул все, как у вас. судя по всему, files нужно создавать не в корне, а в папке formupload. тогда все отрабатывается.

но в письме так и не прикрепляется ссылка на этот файл 🙁

Прошу прощения за столь долгий ответ.
Я понял ошибку. Отредактирую материал в ближайшее время. Там несколько ошибок, начиная с правки шаблона оформления заказа и заканчиваю созданием поля files в базе данных.

Боги Юпитера! Заработало! )))) А то я уже запарился сверять время заказа с временем загрузки и смотреть чей где файл.
Спасибо!
Будете проезжать Одинцово, дайте знать, сделаю любой фотосувенир из ассортимента на своем сайте 🙂

p.s.
убрал display:none в /components/com_onepage/themes/ваша тема/onepage.unlogged.tpl.php

Есть еще 2 вопроса:
1. не пойму, куда нужно вставить это в файле doajaxfileupload.php, чтобы заработал транслит. везде уже перевставлял..
$name=strtr($name,»абвгдеёзийклмнопрстуфхъыэ_»,»abvgdeeziyklmnoprstufh’iei»);

$name=strtr($name,»АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_»,»ABVGDEEZIYKLMNOPRSTUFH’IEI»);

$name=strtr($name, array(
«ж»=>»zh», «ц»=>»ts», «ч»=>»ch», «ш»=>»sh»,
«щ»=>»shch»,»ь»=>»», «ю»=>»yu», «я»=>»ya»,
«Ж»=>»ZH», «Ц»=>»TS», «Ч»=>»CH», «Ш»=>»SH»,
«Щ»=>»SHCH»,»Ь»=>»», «Ю»=>»YU», «Я»=>»YA»,
«ї»=>»i», «Ї»=>»Yi», «є»=>»ie», «Є»=>»Ye») );

2. после загрузки файлов к корзине, если нажать на файл, то он открывается в том же окне. где можно прописать, чтобы открывалось по ссылке в новом, не в курсе? a_blank или как там…

Все сделал, как написано в инструкции, но все время идет загрузка файла.
«мой-сайт.ру» заменил на свой.

Роман, а как убрать «Подтверждающее окно» и когда файл выбираешь, надпись «Файл не выбран» остается — Можно как-то все это удалить?

Роман, у Меня отсутствует папка com_onepage «Начнем с редактирования файлов компонента One Page Checkout Файл: /components/com_onepage/themes/ваша тема/onepage.logged.tpl.php «.
onepage установлен.
Скачивал через фтп все файлы с хостинга, через поиск тоже не могу найти.

Скажите, а зачем нужно:
Строка 730 После: // Send the email
var_dump(file_exists(JPATH_VM_SITE.DS.’views’.DS.’invoice’.DS.’view.html.php’));die;
просто пытаюсь сейчас сделать на VirtueMart 3.0.18 + One Page (2.0.314.200616) + Joomla! 3.5.1 Stable
и пока белый экран, вот разбираюсь.

Комментировать