Опубликовано в: Доработка Virtuemart
19 мая 2011


Добавление нового поля к заказу. Не путать с добавлением поля к товару!

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

Так же можно использовать данный хак, если необходимо заказу задавать какую-либо метку, для использования сотрудниками магазина, например внутри организации. Тот же комментарий, к примеру.

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

Шаг 1. Добавление нового поля в админку.

Я решил добавить поле сразу после номера заказа, чтобы было удобней. На выходе нужно было получить в админке вот такое поле.

Новое поле к заказу - рис. 1

Правим файл /administrator/components/com_virtuemart/html/order.order_print.php

После 87-88 строки

<td><?php printf("%08d", $db->f("order_id"));?></td>
</tr>

нужно вставить код:

<tr>
    <td colspan="2">
         <?php $ps_order_change_html->html_change_track() ?>
    </td>
</tr>

Если сейчас обновить страничку с заказом в админке, то увидим ошибку - Fatal error: Call to undefined method. Это нормально, так и должно быть, ведь мы добавили только вызов функции, а нам нужно написать ещё и саму функцию. Это сделаем в следующем шаге.

 

Шаг 2. Добавление функции html_change_track

Редактируем файл /administrator/components/com_virtuemart/classes/ps_order_change_html.php

После  293-294 строки:

<?php
 }

нужно добавить следующий код:

function html_change_track() {
global $VM_LANG;

$db = new ps_DB;
$q = "SELECT * FROM #__{vm}_orders WHERE order_id='".$this->order_id."'";
$db->query($q);
$db->next_record();
?>
<form method="post" action="">
<?php echo $VM_LANG->_('PHPSHOP_TRACK') ?>:
<input type="text" value="<?php $db->p("order_track") ?>" size="30" name="order_track" />
<input type="submit" value="Обновить" name="Submit" class="button">
<input type="hidden" value="1" name="change_track" />
<input type="hidden" name="page" value="order.order_print" />
<input type="hidden" name="option" value="com_virtuemart" />
<input type="hidden" name="func" value="" />
<input type="hidden" name="order_id" value="" />  
</form>
<?php
}

 

Шаг 3. Добавим языковую константу.

Правим файл /administrator/components/com_virtuemart/languages/common/russian.php

В любое место, после

$langvars = array (

Добавить:

'PHPSHOP_TRACK' => 'Трекинг-номер',
 'PHPSHOP_TRACK_UPD' => ' обновлён',
 'PHPSHOP_TRACK_ERROR' => 'ОШИБКА!',

Теперь нам нужно добавить поле в базу данных.

 

Шаг 4. Добавление нового поля в MySQL

Заходим в phpMyAdmin, выбираем нашу базу и выполняем запрос:

alter table jos_vm_orders add order_track varchar(50) default NULL;

Обновив страничку заказа, можно уже видеть наше поле с кнопкой "Обновить". Однако если ввести данные и нажать кнопку, то никаких изменений не произойдёт. Данные в базу не запишутся. Нужно выполнить ещё одно действие.

 

Шаг 5. Добавим функцию на обновление поля order_track

Редактируем файл /administrator/components/com_virtuemart/classes/ps_order_change.php

После 480-481 строки

$this->reload_from_db = 1 ;
 }

добавим код

function change_track( $order_id, $track ) {
 
 $db = new ps_DB( ) ;
 $q = "UPDATE #__{vm}_orders SET " ;
 $q .= "order_track =  '" . $track . "' " ;
 $q .= "WHERE order_id = '" . $order_id . "'" ;
 $db->query( $q ) ;
 $db->next_record() ;
 $this->recalc_order( $order_id ) ;
 $this->reload_from_db = 1 ;
 }

В районе 1298-1299 строки найдите код:

$vmLogger->info( $VM_LANG->_( 'PHPSHOP_COUPON_DISCOUNT' ) . $VM_LANG->_( 'PHPSHOP_ORDER_EDIT_SOMETHING_HAS_CHANGED' ) ) ;
 }

После него нужно добавить следующий код, чтобы выводить сообщение об успешном обновлении данных:

elseif( vmGet( $_REQUEST, 'change_track' ) != '' )
 if( $ps_order_change->change_track( $order_id, trim( vmGet( $_REQUEST, 'order_track' ) ) ) ) {
 $vmLogger->err( "PHPSHOP_TRACK_ERROR" ) ;
 } else {
 $vmLogger->info( $VM_LANG->_( 'PHPSHOP_TRACK' ) . $VM_LANG->_( 'PHPSHOP_TRACK_UPD' ) ) ;
 }

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

 

Шаг 6. Выведем переменную на странице информации о заказе в личном кабинете покупателя.

Правим файл /components/com_virtuemart/themes/default/templates/pages/account.order_details.tpl.php

После 77 строки добавляем код:

<?php if ($db->f("order_track") != "") { ?>
 <tr> 
     <td>:</td>
     <td><?php echo $db->f("order_track"); ?></td>
 </tr>
 <?php } ?>

На выходе получаем следующее:

Новое поле к заказу - рис.2

 

Чтобы вывести данные на главной странице кабинета пользователя, правим файл /administrator/components/com_virtuemart/classes/ps_order.php

661 строку

$listfields = 'o.order_id,o.cdate,order_total,o.order_status,order_currency';

дописываем, чтобы стало так: 

$listfields = 'o.order_id,o.cdate,order_total,order_track,o.order_status,order_currency';

 

В районе 721 строки находим код:

$listObj->addCell( $tmp_cell );

И ниже дописываем:

if ($db->f("order_track") != "") {
     $tmp_cell = "<strong>".$VM_LANG->_('PHPSHOP_TRACK').":</strong> ".$db->f("order_track");
     $listObj->addCell( $tmp_cell );
 }

На выходе получаем:

Новое поле к заказу - рис. 3

 

 

Вы можете отблагодарить автора:

WMR - R166832041362

WMZ - Z314865156270

QIWI - 9638061071

Яндекс деньги - 41001228750313


Комментарии 
 
#10 Alex 01.05.2012 22:09
Если выводит "Заказ не найден! Он мог быть удален."
Тогда во втором шаге
нужно заменить

на
" />
и должно быть ок
Цитировать
 
 
#9 Руслан 20.03.2012 12:03
Цитирую Андрей:
Не работает! при добавлении Трекинг-номер к заказу выдает ошибку "Заказ не найден! Он мог быть удален."

Аналогичная ошибка.
Цитировать
 
 
#8 Роман Руденко 10.01.2012 18:30
У меня все работает отлично! Автору бооольшой респект!! Аналогичной инструкции в сети нет!!
Благодарю от души!!
Цитировать
 
 
#7 NiceSEO.ru 20.11.2011 03:58
Блин обрезалось) в общем нужно в поле хидден ордер_айди
Цитировать
 
 
#6 NiceSEO.ru 20.11.2011 03:57
У вас ошибочка, на втором шаге вместо
input type="hidden" name="order_id" value="" />
нужно
" />
А вообще спасибо, время сэкономили!
Цитировать
 
 
#5 DidGo 15.11.2011 10:23
Инструкция работоспособна. Реализовано на сайте hobbypower.ru/ - присутствует в моём портфолио.

Возможно, допущена ошибка при написании инструкции. Сегодня проверю - отпишу. Следите за комментариями.
Цитировать
 
 
#4 Андрей 15.11.2011 10:16
Не работает! при добавлении Трекинг-номер к заказу выдает ошибку "Заказ не найден! Он мог быть удален."
Цитировать
 
 
#3 Александр 06.11.2011 16:51
Здравствуйте, сделал все по вашей инструкции. Захожу в админ панель Заказы- Список заказов, кликаю на заказ происходит перезагрузка страницы далее белый экран. Помогите разобраться в чем проблема очень нужно....
Цитировать
 
 
#2 Дмитрий Краев 06.11.2011 15:57
Не совсем понятно что именно Вам требуется.

Насколько я понял - есть две тетради. У одной 12 листов предположим, у второй - 18, соответственно у них разные цены, так?

Но в таком случае Вам данный способ не подходит, потому что тут рассмотрен способ добавления нового поля к заказу, а не конкретному товару.

В Вашем случае нужно использовать свойства товара. Посмотрите вот эту статью - www.didgo.ru/.../
Цитировать
 
 
#1 Михаил 06.11.2011 15:56
Очень интересная статья, то что искал, но есть один вопросик.

Есть каталог-магазин тетрадей. надо чтобы в оформлении заказа выводилось количество листов и соответственно менялась сумма. это возможно сделать?

Спасибо!
Цитировать