Главная > Статьи > VirtueMart способы доставки и способы оплаты, для отдельного (конкретного) товара

VirtueMart способы доставки и способы оплаты, для отдельного (конкретного) товара

5
20.09.2012 22:17

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

   И первым делом мы создадим два дополнительных поля в базе данных которые будут хранить в себе идентификаторы выше указанных свойств товара. Зайдем в наш phpMyAdmin (или любой другой MySQL клиент) выберем нужную нам базу данных и таблицу (префикс вашей базы данных)_virtuemart_products_ru_ru и выполним sql - запрос

ALTER TABLE `tnjl1_virtuemart_products_ru_ru` ADD `pay_method` TEXT NOT NULL ,
ADD `ship_method` TEXT NOT NULL

   Следующим шагом будет создание нужных нам полей в административной части сайта, для этого мы открываем файл administrator\components\com_virtuemart\views\product\tmpl\product_edit_information.php, и вставляем после строк:

<?php echo VmHTML::checkbox('product_special', $this->product->product_special); ?>
</td>
</tr>

    вот такие строки:

<?php echo VmHTML::checkbox('product_special', $this->product->product_special); ?>
</td>
</tr>
<tr class="row<?php echo $i?>">
<td width="21%" >
<div style="text-align:right;font-weight:bold;">
Способы оплаты
</div>
</td>
<td width="79%" >
<?php
if(!empty($this->product_pay_method)){
foreach($this->product_pay_method as $method){
if(isset($method->pay_method)){
$attached_method = $method->pay_method;
$attached_method = explode(',',$attached_method);
}
break;
}
echo JHTML::_('Select.genericlist', $this->product_pay_method, 'pay_method[]', 'size=5 multiple="multiple"', 'virtuemart_paymentmethod_id', 'payment_name', (isset($attached_method) && !empty($attached_method)?$attached_method:null));
}
?>
</td>
</tr>
<tr class="row<?php echo $i?>">
<td width="21%" >
<div style="text-align:right;font-weight:bold;">
Способы доставки
</div>
</td>
<td width="79%" >
<?php
if(!empty($this->product_ship_method)){
foreach($this->product_ship_method as $method){
if(isset($method->ship_method)){
$attached_ship_method = $method->ship_method;
$attached_ship_method = explode(',',$attached_ship_method);
}
break;
}
echo JHTML::_('Select.genericlist', $this->product_ship_method, 'ship_method[]', 'size=5 multiple="multiple"', 'virtuemart_shipmentmethod_id', 'shipment_name',(isset($attached_ship_method) && !empty($attached_ship_method)?$attached_ship_method:null));
}
?>
</td>
</tr>

   Дальше идем в файл administrator\components\com_virtuemart\models\product.php, и добавляем после следующего кода:

$this->searchplugin = JRequest::getInt('custom_parent_id',0);
}

   такое:

$this->searchplugin = JRequest::getInt('custom_parent_id',0);
}
public function getProductPayMethod($id){
$db = JFactory::getDBO();
$return = false;
$sql = "SELECT virtuemart_paymentmethod_id, payment_name".(!empty($id) && $id !==0?",pay_method":"")."
FROM #__virtuemart_paymentmethods_".VMLANG."
".(!empty($id) && $id !==0?"LEFT JOIN #__virtuemart_products_".VMLANG."
ON virtuemart_product_id={$id}":"");
$db->setQuery($sql);
if (!$this->_db->query()){
vmError($this->_db->getErrorMsg());
return $return;
}
$return = $db->loadObjectList();
if(!empty($return)){
return $return;
}
}

public function getProductShipMethod($id){
$db = JFactory::getDBO();
$return = false;
$sql = "SELECT virtuemart_shipmentmethod_id, shipment_name".(!empty($id) && $id !==0?",ship_method":"")."
FROM #__virtuemart_shipmentmethods_".VMLANG."
".(!empty($id) && $id !==0?"LEFT JOIN #__virtuemart_products_".VMLANG."
ON virtuemart_product_id={$id}":"");
$db->setQuery($sql);
if (!$this->_db->query()){
vmError($this->_db->getErrorMsg());
return $return;
}
$return = $db->loadObjectList();
if(!empty($return)){
return $return;
}
}

   После этого нам нужно передавать в шаблон формочки административной панели сами данные которые мы получаем в предыдущем коде и для этого мы делаем следующее, в файле administrator\components\com_virtuemart\views\product\view.html.php меняем строки:

$this->assignRef('product_childs', $product_childs);
$product_parent= $model->getProductParent($product->product_parent_id);

   на теже только с дополнением:

$this->assignRef('product_childs', $product_childs);
$product_parent= $model->getProductParent($product->product_parent_id);
$product_pay_method = $model->getProductPayMethod($product->virtuemart_product_id);
$this->assignRef('product_pay_method', $product_pay_method);
$product_ship_method = $model->getProductShipMethod($product->virtuemart_product_id);
$this->assignRef('product_ship_method', $product_ship_method);

   Потом в файле administrator\components\com_virtuemart\controllers\product.php сделаем правки, что бы наши данные адекватно сохранялись, а правки будут такие - находим в данном файле код:

if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php');
if(Permissions::getInstance()->check('admin')){
$data['product_desc'] = JRequest::getVar('product_desc','','post','STRING',2);
$data['product_s_desc'] = JRequest::getVar('product_s_desc','','post','STRING',2);
}

   и после него добавим несколько строк, что бы массив поля select преобразовать в строку:

if(!class_exists('Permissions')) require(JPATH_VM_ADMINISTRATOR.DS.'helpers'.DS.'permissions.php');
if(Permissions::getInstance()->check('admin')){
$data['product_desc'] = JRequest::getVar('product_desc','','post','STRING',2);
$data['product_s_desc'] = JRequest::getVar('product_s_desc','','post','STRING',2);
}
$data['pay_method'] = implode(',',$data['pay_method']);
$data['ship_method'] = implode(',',$data['ship_method']);

   А также не стоит забывать о модели таблицы базы данных о которой я не раз упоминал в предыдущих статьях, на этот раз она находися здесь administrator\components\com_virtuemart\tables\products.php и в ней ми добавим несколько строк, а именно после :

var $slug = '';

   добавим:

var $slug = '';
var $pay_method = '';
var $ship_method = '';

   так же найдем вот такую строку:

$this->setTranslatable(array('product_name','product_s_desc', 'product_desc','metadesc','metakey','customtitle'));

   и дополним ее:

$this->setTranslatable(array('product_name','product_s_desc', 'product_desc','metadesc','metakey','customtitle','pay_method','ship_method'));

   На этом с административной частью мы закнчили и получили:

   Дальше нам осталось только вывести это все в карточку товара, для этого идем в файл (уже не в административной части) components\com_virtuemart\views\productdetails\view.html.php и находим строку:

$this->assignRef('product', $product);

   и после нее дописываем такое:

$this->assignRef('product', $product);
$this->assignRef('product_ship_m',$product_model->getProductShipMethod($virtuemart_product_id));
$this->assignRef('product_ship_m_c',$product->ship_method);
$this->assignRef('product_pay_m',$product_model->getProductPayMethod($virtuemart_product_id));
$this->assignRef('product_pay_m_c',$product->pay_method);

   ну и естественно сам вывод, я сделал брутально но просто в файле components\com_virtuemart\views\productdetails\tmpl\default.php после таких строк:

if ($this->show_prices and (empty($this->product->images[0]) or $this->product->images[0]->file_is_downloadable == 0)) {
echo $this->loadTemplate('showprices');
}
?>

   добавил такое:

if ($this->show_prices and (empty($this->product->images[0]) or $this->product->images[0]->file_is_downloadable == 0)) {
echo $this->loadTemplate('showprices');
}
?>
<div>
<b>Способы доставки:</b><br/>
<?php
$prod_ship_m = explode(',',$this->product_ship_m_c);
foreach($this->product_ship_m as $method){
if(in_array($method->virtuemart_shipmentmethod_id,$prod_ship_m))
echo $method->shipment_name."<br/>";
}
?>
</div>
<div>
<b>Способы оплаты:</b><br/>
<?php
$prod_pay_m = explode(',',$this->product_pay_m_c);
foreach($this->product_pay_m as $method_p){
if(in_array($method_p->virtuemart_paymentmethod_id,$prod_pay_m))
echo $method_p->payment_name."<br/>";
}
?>
</div>

   вот впринципе и все.

Twitter
Нравится
SocButtons v1.4
 

Комментарии 

 
# Сергей 16.10.2012 11:59
Супер статья...случайно просматривал новые статьи и на нее натолкнулся...уже давно горит вопрос, как описать доставку для конкретных категорий и товаров...а тут сразу решение....
Ответить | Ответить с цитатой | Цитировать
 
 
# Олег 23.11.2012 18:35
Не получилось воплотить на VirtueMart 1.1.9 stable

Нет добавились поля в админ панели. Но это пока что
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 23.11.2012 19:28
Даный сюит для virtuemart 2.0+, простите виноват - забыл указать.
Ответить | Ответить с цитатой | Цитировать
 
 
# Олег 23.11.2012 21:22
Цитирую Roket007:
Даный сюит для virtuemart 2.0+, простите виноват - забыл указать.

Спасибо!!!


Сейчас попробую обновить VM до последней версии.

Должно помочь ?
Ответить | Ответить с цитатой | Цитировать
 
 
# Roket007 24.11.2012 10:39
VM 2.0+ это для joomla 1.7+, а 1.1.9 это для joomla 1.5, потому наверное обновите joomla для начала!
Ответить | Ответить с цитатой | Цитировать
 
 
# irina 20.01.2013 14:17
Попробовала добавить ваш код, возможность выбора доставки появилась, но когда я сохраняю что-либо в настройках virtuemart, появляется вот такая ошибка:

vmError: alterTable CHANGE jos_virtuemart_ products_ru_ru.pay_method :
vmError: alterTable CHANGE jos_virtuemart_ products_ru_ru.ship_method : Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs SQL=ALTER TABLE `jos_virtuemart _ products_ru_ru` CHANGE COLUMN `pay_method` `pay_method` CHAR(255) NOT NULL DEFAULT ''
vmError: Tableupdater updating table jos_virtuemart_ products_ru_ru throws error Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs SQL=ALTER TABLE `jos_virtuemart _ products_ru_ru` CHANGE COLUMN `ship_method` `ship_method` CHAR(255) NOT NULL DEFAULT ''
Ответить | Ответить с цитатой | Цитировать
 
 
# Asmadey 10.04.2013 11:55
Тоже такая же ошибка выходит
vmError: alterTable CHANGE jos_virtuemart_ products_ru_ru.pay_method :
vmError: alterTable CHANGE jos_virtuemart_ products_ru_ru.ship_method : Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs SQL=ALTER TABLE `jos_virtuemart _ products_ru_ru` CHANGE COLUMN `pay_method` `pay_method` CHAR(255) NOT NULL DEFAULT ''
vmError: Tableupdater updating table jos_virtuemart_ products_ru_ru throws error Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs SQL=ALTER TABLE `jos_virtuemart _ products_ru_ru` CHANGE COLUMN `ship_method` `ship_method` CHAR(255) NOT NULL DEFAULT ''

Понятно что слишком много символов в строку вносится, а как исправить так и не нашел.
Ответить | Ответить с цитатой | Цитировать
 
 
# Voldemar 08.11.2013 02:41
Как будет производится расчёт доставки если в корзине два и более товаров с разными способами доставки. Как будет производиться оплата если у товаров в корзине разные способы оплаты.
Ответить | Ответить с цитатой | Цитировать
 
 
# Дмитрий 16.11.2013 14:27
Я пока не понимаю, зачем каждому товару отдельный способ оплаты/доставки. Не сталкивался с таким.
Я попал на этот сайт, потому что ищу способ, чтобы при оформлении заказа к определенному способу оплаты привязывался определенный способ доставки.
Как сказал один человек на одном форуме: "А то как-то не красиво, при самовывозе — оплата наложенным платежем".
Если ли возможность как-то этого избежать?
Ответить | Ответить с цитатой | Цитировать
 
 
# Святослав 23.05.2014 12:41
а можно ли привязать способ оплаты к категории товаров? мне кажется действия немного сократятся...
Ответить | Ответить с цитатой | Цитировать
 

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


Защитный код
Обновить

 

Сторонние

Модуль новостей для Joomla - JU News Ultra
14.11.2011 |  9007
Модуль вывода новостей JU News Ultra - еще один способ...

Новости

Безопасность смартфона — пин-код с текущим временем, Screen Lock – Time Password
IT мир
20.10.2014 |  1156
Любой владелец смартфона всегда с опаской вводит пин-код разблокировки, ведь...
Alien: Isolation — прими участие в фильме «Чужой»
IT мир
20.10.2014 |  1025
Creative Assembly можно поздравить, впрочем, как и геймеров. Игра Alien:...
Серия «кожаных» ноутбуков от Samsung продолжается: Chromebook 2 с пассивным охлаждением
IT мир
20.10.2014 |  940
Samsung продолжило серию «одетых в кожу» ноутбуков. Новая модификация Chromebook...
3D-принтер iBox Nano — компактность, доступность и долговечность
IT мир
20.10.2014 |  1028
Громоздкие и дорогие 3D-принтеры слишком медленно распространяются. Для популяризации 3D-печати...