По просьбе пользователей создал статью в которой мы будем привязывать к товарам 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>
вот впринципе и все.
Комментарии
Нет добавились поля в админ панели. Но это пока что
Спасибо!!!
Сейчас попробую обновить VM до последней версии.
Должно помочь ?
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 ''
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 ''
Понятно что слишком много символов в строку вносится, а как исправить так и не нашел.
Я попал на этот сайт, потому что ищу способ, чтобы при оформлении заказа к определенному способу оплаты привязывался определенный способ доставки.
Как сказал один человек на одном форуме: "А то как-то не красиво, при самовывозе — оплата наложенным платежем".
Если ли возможность как-то этого избежать?