Куда идем?

Думаю, многие уже успели столкнуться с проблемой в 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
Спасибо за статью,при добавлении кода в файл order_done.php браузер выдает ошибку,видимо делаю что то
не так,если можно опишите пожалуйста подробней куда вставлять код.
1
Андрей, какая ошибка?
1
Ваш способ не работает, дополните пожалуйста статью где и после каких строк вставлять код.
-1
Виталий, работает. Где вставлять не имеет значения. Важно, чтобы первая строка выполнялась по коду выше, чем остальные.
0
Здравствуйте. Спасибо за подсказку. Но у меня встала задача вывести еще и изображения товаров на странице "Спасибо за заказ". Не подскажите как?
0
Ярослав, посмотрите с помощью кода, который я привел, значения, ставшие доступными. По-моему там есть и изображения товаров.
0

Цитирую Wedal:

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


Я выводил , к сожалению там нет этого. Открыл модель orders.php, там не тянутся изображения, но я так и не понял из какой модели в корзину берется вывод изображений.
0
тег pre снес компонент комментов. Я выводил print_r(); там нет изображений
0
Ярослав, не знаю, поможет ли. В настройках Virtuemart 2 есть опция, позволяющая отображать отображать изображения товаров в корзине. Очень вероятно, что ее активация добавит их и здесь.
0

Цитирую Wedal:

Ярослав, не знаю, поможет ли. В настройках Virtuemart 2 есть опция, позволяющая отображать отображать изображения товаров в корзине. Очень вероятно, что ее активация добавит их и здесь.


Функция включена. Не передает в массив, увы.
0
Первое: Совет (пример) очень дельный, и мне во многом помог. Но вопрос вот в чем: хочу что бы в письме к админу в заголовке письма приходили не реквизиты (почта, название) магазина, а заказчика. Возможно ли это: подскажите.
Спасибо
0
Akex, возможно. Достигается правкой макета письма. Подробно расписывать не буду. Долго да и не по теме данного кейса.
0
Wedal:
В принципе я понимаю, что ничего невозможного нет, однако вопрос актуальный и очень нужный. Может создадите отдельный кейс. Думаю будет полезно многим.
0
Akex, тут не кейс нужен и несколько статей по редактированию шаблона Virtuemart 2, аналогично тем, которые я писал для первой версии. Вообще, планирую, но пока некогда.
0
у меня вообще выдает не понятное
http://forum.virtuemart.ru/viewtopic.php?f=37&t=10057
0
Stasweb, это непонятное - массив доступных данных, т.е. все то, что вы можете вывести на странице. Он активируется строчкой:

Код:

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


В нем вы можете посмотреть, как обратиться, чтобы получить те или иные данные. А выводить их нужно строчкой:

Код:

<pre><?php echo $order['details']['ST']->order_number ?></pre>


Где вместо order_number нужно подставить данные из скобок того или иного элемента массива, чтобы получить значение.
0
так я и вывожу так
0
вот
0
Stasweb, так а в чем проблема? Если не нужен массив, просто удалите:

Код:

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

0
День добрый. Не смог найти откуда вытащить товары, присутствующие в заказе, может кто знает?
0
sabio, что значит "вытащить товары"? Какие-то определенные данные о товарах, которых нет в $order?
0
Все данные нашел, не увидел сразу
0
Добрый день! у меня выводить вот так
Array ( [details] => Array ( ) [history] => Array ( ) [items] => Array ( ) [calc_rules] => Array ( ) )
как видно массивы пустые и значений в них нет. вирт 2.6.10. может в новой версии по другому как то?
0
стас, да. К сожалению в последних версиях Virtuemart 2(начиная с VM 2.6) этот трюк не работает. Пока не могу сказать, чем можно заменить. Как разберусь - обновлю кейс.
0
Так что кто разобрался как выводить в версии 2,6 попробовал вывести пользователя

Код:

<?php echo JFactory::getUser($order->virtuemart_user_id)->username;?>


все выводит нормально
0
не работает в последней версии виртуемарта. ненужная статья.
0
Андрей, да, действительно, с версии Virtuemart 2.6, разработчики изменили код в ядре и данный метод перестал работать. Но фейк - нет, просто не актуально для версии Virtuemart, начиная с 2.6.
0
Так удалось победить в версии 2.6?
0
Спасибо! Статья пригодилась!

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

Добавил в конец 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
Подскажите, как вывести фото товара или названия фото данного товара, вывел названия, артикул, ссылку а фото никак не получается.


Код:

<?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
Дмитрий, добавьте в код строчку:

Код:

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


и увидите весь массив доступных данных. Если там нет изображения, то его можно получить по ID товара, подключив еще одну модель, по аналогии с тем, как это происходит в файле components/com_virtuemart/views/productdetails/view.html.php
0

Цитирую Wedal:

Дмитрий, добавьте в код строчку:

Код:

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


и увидите весь массив доступных данных. Если там нет изображения, то его можно получить по ID товара, подключив еще одну модель, по аналогии с тем, как это происходит в файле components/com_virtuemart/views/productdetails/view.html.php



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

Подскажите, пожалуйста, где именно копать, какую строчку.
0
Дмитрий, есть такой вариант:

Код:


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
К сожалению оба варианта не работают, при первом возникает постоянно ошибка, при выборке с базы вообще не работает.
0
Дмитрий, поправил код первого варианта в комментарии выше. Попробуйте.
0
При подключении данной строки возникает ошибка !!

$product = VirtueMartModelProduct::getProductSingle($item->virtuemart_product_id);
0
Дмитрий, какая ошибка?
0

Цитирую Wedal:

Дмитрий, какая ошибка?



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

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

Цитирую Wedal:

Дмитрий, в VM начиная с версии 2.6, кейс не работает.


у меня 2.6.3 и работает как ни странно (сделал так с артикулом)
0
Дмитрий, с какой-то подверсии 2.6.х перестает работать. В комментариях пишут, что в 2.6.10 уже не работает. Ну да ладно. Если у вас переменные выводятся, то посмотрите с помощью вставки:

Код:

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


есть ли среди них нужные вам настраиваемые поля. Если есть, можно вывести довольно легко, если же нет, то нужно будет сначала получить ID заказанных товаров и по ним получить значения полей.
0
а по другмоу никаК?
0
Добрый день, Wedal не подскажите как сделать переменную после строки Спасибо за Ваш заказ! Хотим написать дополнительную информацию, как будет правильно это сделать?
0
DrShepard, зависит от версии VM и того, что вы хотите там разместить (конкретно - просто текст или данные из только что созданного заказа).
0
VM3 просто текст.
0
Думаю надо ещё уточнить, что простой текст надо перед кнопкой робокассы.
0
DrShepard, тогда всё просто. Переопределяется в шаблон макет orderdone, как описано в этой статье, а дальше находите в нем переменную:

Код:

$this->html


Именно в ней будет выводиться кнопка Робокассы (по крайней мере должна, если они не придумали у себя в плагине что-то экзотическое). Дальше просто выводите нужный вам текст перед этой переменной.

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