В этом кейсе я расскажу, как получить всю информацию о совершенном заказе на странице "Спасибо за заказ".

Думаю, многие уже успели столкнуться с проблемой в Virtuemart 2, которая заключается в том, что в макете страницы «Спасибо за заказ» (той, которая появляется, когда пользователь подтверждает заказ) нет практически ничего. В этом кейсе я расскажу, как получить на ней всю информацию о совершенном заказе.

На самом деле, решение очень простое, но его я не встретил ни на одном форуме, в том числе, на официальном. Алгоритм следующий:

  1. Переопределяем макет страницы «Спасибо за заказ» в используемый шаблон Joomla. Для этого копируем файл components/com_virtuemart/views/cart/tmpl/order_done.php в папку templates/ВАШ_ШАБЛОН /html/com_virtuemart/cart. Если каких-то каталогов не хватает, создаем их вручную. После этого работаем только с файлом, который находится в папке с шаблоном.
  2. В файле order_done.php добавляем следующий код:
<?php require_once(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'orders.php');$order = VirtueMartModelOrders::getOrder($this->cart->virtuemart_order_id);?>

Посмотреть значения, ставшие доступными, можно вставив ниже код:

<pre><?php print_r($order); ?></pre>

Пример вывода данных:

<?php echo $order['details']['ST']->order_number ?> /*номер заказа*/<?php echo $order['details']['ST']->created_on ?>   /*дата заказа*/

и т.д.

Об авторе
Об авторе
Wedal (Виталий). Веб-разработчик полного цикла (Full Stack). Создатель и автор сайта Wedal.ru.
Основной профиль – создание сайтов и расширений на CMS Joomla.

Добавить комментарий

Для отправки комментария введите код с картинки:
Защитный код
Обновить

Комментарии  

+1 # Андрей. 02.05.2013 21:01
Спасибо за статью,при добавлении кода в файл order_done.php браузер выдает ошибку,видимо делаю что то
не так,если можно опишите пожалуйста подробней куда вставлять код.
Ответить | Ответить с цитатой | Цитировать
+1 # Wedal 04.05.2013 07:17
Андрей, какая ошибка?
Ответить | Ответить с цитатой | Цитировать
+1 # Виталий 16.05.2013 19:13
Ваш способ не работает, дополните пожалуйста статью где и после каких строк вставлять код.
Ответить | Ответить с цитатой | Цитировать
-1 # Wedal 17.05.2013 01:45
Виталий, работает. Где вставлять не имеет значения. Важно, чтобы первая строка выполнялась по коду выше, чем остальные.
Ответить | Ответить с цитатой | Цитировать
0 # Ярослав 05.06.2013 13:08
Здравствуйте. Спасибо за подсказку. Но у меня встала задача вывести еще и изображения товаров на странице "Спасибо за заказ". Не подскажите как?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 06.06.2013 02:52
Ярослав, посмотрите с помощью кода, который я привел, значения, ставшие доступными. По-моему там есть и изображения товаров.
Ответить | Ответить с цитатой | Цитировать
0 # Ярослав 06.06.2013 07:34
Цитирую Wedal:
Ярослав, посмотрите с помощью кода, который я привел, значения, ставшие доступными. По-моему там есть и изображения товаров.

Я выводил , к сожалению там нет этого. Открыл модель orders.php, там не тянутся изображения, но я так и не понял из какой модели в корзину берется вывод изображений.
Ответить | Ответить с цитатой | Цитировать
0 # Ярослав 06.06.2013 07:35
тег pre снес компонент комментов. Я выводил print_r(); там нет изображений
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 07.06.2013 03:13
Ярослав, не знаю, поможет ли. В настройках Virtuemart 2 есть опция, позволяющая отображать отображать изображения товаров в корзине. Очень вероятно, что ее активация добавит их и здесь.
Ответить | Ответить с цитатой | Цитировать
0 # Ярослав 07.06.2013 06:30
Цитирую Wedal:
Ярослав, не знаю, поможет ли. В настройках Virtuemart 2 есть опция, позволяющая отображать отображать изображения товаров в корзине. Очень вероятно, что ее активация добавит их и здесь.

Функция включена. Не передает в массив, увы.
Ответить | Ответить с цитатой | Цитировать
0 # Akex 13.06.2013 11:16
Первое: Совет (пример) очень дельный, и мне во многом помог. Но вопрос вот в чем: хочу что бы в письме к админу в заголовке письма приходили не реквизиты (почта, название) магазина, а заказчика. Возможно ли это: подскажите.
Спасибо
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 14.06.2013 06:39
Akex, возможно. Достигается правкой макета письма. Подробно расписывать не буду. Долго да и не по теме данного кейса.
Ответить | Ответить с цитатой | Цитировать
0 # Akex 14.06.2013 08:14
Wedal:
В принципе я понимаю, что ничего невозможного нет, однако вопрос актуальный и очень нужный. Может создадите отдельный кейс. Думаю будет полезно многим.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 17.06.2013 03:23
Akex, тут не кейс нужен и несколько статей по редактированию шаблона Virtuemart 2, аналогично тем, которые я писал для первой версии. Вообще, планирую, но пока некогда.
Ответить | Ответить с цитатой | Цитировать
0 # Stasweb 14.10.2013 07:43
у меня вообще выдает не понятное
http://forum.virtuemart.ru/viewtopic.php?f=37&t=10057
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 16.10.2013 03:02
Stasweb, это непонятное - массив доступных данных, т.е. все то, что вы можете вывести на странице. Он активируется строчкой:
Код:<pre><?php print_r($order); ?></pre>
В нем вы можете посмотреть, как обратиться, чтобы получить те или иные данные. А выводить их нужно строчкой:
Код:<pre><?php echo $order['details']['ST']->order_number ?></pre>
Где вместо order_number нужно подставить данные из скобок того или иного элемента массива, чтобы получить значение.
Ответить | Ответить с цитатой | Цитировать
0 # Stasweb 16.10.2013 08:12
так я и вывожу так
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 17.10.2013 01:56
Stasweb, так а в чем проблема? Если не нужен массив, просто удалите:
Код:<pre><?php print_r($order); ?></pre>
Ответить | Ответить с цитатой | Цитировать
0 # sabio 17.12.2013 11:13
День добрый. Не смог найти откуда вытащить товары, присутствующие в заказе, может кто знает?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 18.12.2013 02:55
sabio, что значит "вытащить товары"? Какие-то определенные данные о товарах, которых нет в $order?
Ответить | Ответить с цитатой | Цитировать
0 # sabio 18.12.2013 07:07
Все данные нашел, не увидел сразу
Ответить | Ответить с цитатой | Цитировать
0 # стас 07.10.2014 11:07
Добрый день! у меня выводить вот так
Array ( [details] => Array ( ) [history] => Array ( ) [items] => Array ( ) [calc_rules] => Array ( ) )
как видно массивы пустые и значений в них нет. вирт 2.6.10. может в новой версии по другому как то?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 08.10.2014 03:17
стас, да. К сожалению в последних версиях Virtuemart 2(начиная с VM 2.6) этот трюк не работает. Пока не могу сказать, чем можно заменить. Как разберусь - обновлю кейс.
Ответить | Ответить с цитатой | Цитировать
0 # Stasweb 14.11.2014 06:50
Так что кто разобрался как выводить в версии 2,6 попробовал вывести пользователя
Код:<?php echo JFactory::getUser($order->virtuemart_user_id)->username;?>
все выводит нормально
Ответить | Ответить с цитатой | Цитировать
0 # андрей456 29.12.2014 20:53
не работает в последней версии виртуемарта. ненужная статья.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 13.01.2015 15:16
Андрей, да, действительно, с версии Virtuemart 2.6, разработчики изменили код в ядре и данный метод перестал работать. Но фейк - нет, просто не актуально для версии Virtuemart, начиная с 2.6.
Ответить | Ответить с цитатой | Цитировать
0 # Margo 10.03.2015 21:57
Так удалось победить в версии 2.6?
Ответить | Ответить с цитатой | Цитировать
0 # Алексей Г. 27.06.2015 08:14
Спасибо! Статья пригодилась!

Возможно, кому-то будет полезно:

Добавил в конец order_done.php следующий код:

Код:// SMS
require_once(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'orders.php');
$order = VirtueMartModelOrders::getOrder($this->cart->virtuemart_order_id);
include_once "smsc_api.php";
list($sms_id, $sms_cnt, $cost, $balance) = send_sms("79191234020", "Заказ на ".round($order['details']['BT']->order_total)." р. ".$order['details']['BT']->first_name." ".$order['details']['BT']->last_name." ".$order['details']['BT']->phone_1." Проверьте email", 0);
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий В.. 01.08.2015 10:02
Подскажите, как вывести фото товара или названия фото данного товара, вывел названия, артикул, ссылку а фото никак не получается.

Код:<?php
defined('_JEXEC') or die('');
echo "<h1 class='vm-page-title'>".JText::_('COM_VIRTUEMART_CART_ORDERDONE_THANK_YOU')."</h1>";

echo $this->html;
echo "<br>";
echo "<h3 class='zakaz'>".JText::_('COM_VIRTUEMART_MAIL_SHOPPER_OTP')."</h3>";
require_once(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'orders.php');
$order = VirtueMartModelOrders::getOrder($this->cart->virtuemart_order_id);
$product_link = JURI::root().'index.php?option=com_virtuemart&view=productdetails&virtuemart_category_id=' . $item->virtuemart_category_id .
'&virtuemart_product_id=' . $item->virtuemart_product_id;
?>




<?php echo $order['details']['BT']->order_number; ?>


<?php echo $order['details']['BT']->email; ?>


<?php echo $order['details']['BT']->first_name; ?>



<?php echo $order['items']['0']->order_item_sku; ?>


<?php echo $order['items']['0']->order_item_name; ?>


<?php echo $product_link; ?><?php echo $order['items']['0']->virtuemart_product_id; ?>



Ответить | Ответить с цитатой | Цитировать
0 # Wedal 03.08.2015 03:49
Дмитрий, добавьте в код строчку:
Код:<pre><?php print_r($order); ?></pre>
и увидите весь массив доступных данных. Если там нет изображения, то его можно получить по ID товара, подключив еще одну модель, по аналогии с тем, как это происходит в файле components/com_virtuemart/views/productdetails/view.html.php
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий. В.В 03.08.2015 09:18
Цитирую Wedal:
Дмитрий, добавьте в код строчку:
Код:<pre><?php print_r($order); ?></pre>
и увидите весь массив доступных данных. Если там нет изображения, то его можно получить по ID товара, подключив еще одну модель, по аналогии с тем, как это происходит в файле components/com_virtuemart/views/productdetails/view.html.php


В нет инф. о фото вообще, в view.html.php не могу найти где по id можно вывести фото.

Подскажите, пожалуйста, где именно копать, какую строчку.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 04.08.2015 03:27
Дмитрий, есть такой вариант:
Код:
require_once(JPATH_VM_ADMINISTRATOR.DS.'models'.DS.'product.php');
$product = VirtueMartModelProduct::getProductSingle($item->virtuemart_product_id);
VirtueMartModelProduct::addImages($product,1);
echo $product->images[0]->file_url_thumb;


Но проще, наверное, запросом в БД:
Код:<?php
$pid= $item->virtuemart_product_id;
$sql="select i.file_url_thumb as image from #__virtuemart_medias as i,
#__virtuemart_product_medias as mi where
i.virtuemart_media_id = mi.virtuemart_media_id and
mi.virtuemart_product_id =".$pid." limit 0,1";

$dbb = JFactory::getDbo();
$dbb->setQuery($sql);
$results = $dbb->loadObjectList();
?>

<img src="<?php echo JURI::root () . $results[0]->image; ?>" alt="<?php echo $item->order_item_name;?>" />
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий D. 08.08.2015 12:58
К сожалению оба варианта не работают, при первом возникает постоянно ошибка, при выборке с базы вообще не работает.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 10.08.2015 04:36
Дмитрий, поправил код первого варианта в комментарии выше. Попробуйте.
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий D.1 10.08.2015 06:30
При подключении данной строки возникает ошибка !!

$product = VirtueMartModelProduct::getProductSingle($item->virtuemart_product_id);
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 11.08.2015 03:30
Дмитрий, какая ошибка?
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий D.2 11.08.2015 20:10
Цитирую Wedal:
Дмитрий, какая ошибка?


На белой странице, без шаблона, выводит Спасибо за заказ и тд.

В консоле выдает Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 12.08.2015 03:27
Дмитрий, включите отображение ошибок(максимум) в общих настройках Joomla. Если ничего не получится, попробуйте, как описано здесь:
http://wedal.ru/uroki-joomla/joomla-faq.html
Ответить | Ответить с цитатой | Цитировать
0 # Макс 10.11.2016 22:59
А как узнать html адрес этой страницы "Спасибо за заказ" , подскажите пожалуйста? Чтобы подключить его в гугл аналитикс.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 11.11.2016 06:31
Макс, components/com_virtuemart/views/cart/tmpl/order_done.php
Не забудьте переопределить текущий макет в шаблон Joomla. Подробнее в этой статье: http://wedal.ru/rasshireniya-joomla/nastrojka-shablona-virtuemart-3.html
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий 07.06.2017 07:29
А какую переменную написать чтобы вывести настраиваемое поля товара, допустим выбранный размер?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 07.06.2017 08:15
Дмитрий, в VM начиная с версии 2.6, кейс не работает.
Ответить | Ответить с цитатой | Цитировать
0 # Дмитрий 07.06.2017 08:21
Цитирую Wedal:
Дмитрий, в VM начиная с версии 2.6, кейс не работает.

у меня 2.6.3 и работает как ни странно (сделал так с артикулом)
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 08.06.2017 05:07
Дмитрий, с какой-то подверсии 2.6.х перестает работать. В комментариях пишут, что в 2.6.10 уже не работает. Ну да ладно. Если у вас переменные выводятся, то посмотрите с помощью вставки:
Код:<pre><?php print_r($order); ?></pre>
есть ли среди них нужные вам настраиваемые поля. Если есть, можно вывести довольно легко, если же нет, то нужно будет сначала получить ID заказанных товаров и по ним получить значения полей.
Ответить | Ответить с цитатой | Цитировать
0 # Guest 18.04.2020 15:56
а по другмоу никаК?
Ответить | Ответить с цитатой | Цитировать
0 # DrShepard 31.05.2022 07:54
Добрый день, Wedal не подскажите как сделать переменную после строки Спасибо за Ваш заказ! Хотим написать дополнительную информацию, как будет правильно это сделать?
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 01.06.2022 11:53
DrShepard, зависит от версии VM и того, что вы хотите там разместить (конкретно - просто текст или данные из только что созданного заказа).
Ответить | Ответить с цитатой | Цитировать
0 # DrShepard 02.06.2022 03:57
VM3 просто текст.
Ответить | Ответить с цитатой | Цитировать
0 # DrShepard 02.06.2022 06:03
Думаю надо ещё уточнить, что простой текст надо перед кнопкой робокассы.
Ответить | Ответить с цитатой | Цитировать
0 # Wedal 06.06.2022 08:11
DrShepard, тогда всё просто. Переопределяется в шаблон макет orderdone, как описано в этой статье, а дальше находите в нем переменную:
Код:$this->html
Именно в ней будет выводиться кнопка Робокассы (по крайней мере должна, если они не придумали у себя в плагине что-то экзотическое). Дальше просто выводите нужный вам текст перед этой переменной.

Также обратите внимание, что в новых VM макетов "Спасибо за заказ" два: orderdone.php и order_done.php. Я, честно говоря, всегда их путаю теперь - какой и когда используется. Пробуйте с одним, если текст не выведется, то с другим.
Ответить | Ответить с цитатой | Цитировать