10: 00 Все утро сегодня убил (в интернете абсолютно ничего не нашел), но наконец нашел лазейку как сделать два склада на одном сайте ... Joomla 1.5 + 2 склада на VirtueMart
Да вы, батенька, извращенец, однако =)
Всё намного проще:
Реализовать в Joomla остатки по нескольким складам можно гораздо проще.
1) Добавляем в БД пару таблиц:
CREATE TABLE IF NOT EXISTS `jos_vm_product_stock` (
`product_stock_id` int(11) NOT NULL auto_increment,
`product_id` int(11) NOT NULL default '0',
`product_stock` decimal(15,2) default NULL,
`product_stock_vdate` int(11) default NULL,
`product_stock_edate` int(11) default NULL,
`cdate` int(11) default NULL,
`mdate` int(11) default NULL,
`stockroom_id` int(11) default '0',
PRIMARY KEY (`product_stock_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
CREATE TABLE IF NOT EXISTS `jos_vm_stockroom` (
`stockroom_id` int(11) NOT NULL auto_increment,
`stockroom_name` varchar(32) default NULL,
`stockroom_desc` text,
`stockroom_publish` char(1) NOT NULL default 'N',
`stockroom_type` varchar(15) default 'default',
PRIMARY KEY (`stockroom_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2130 ;
И меняем часть кода всего в паре файликов:
Вот этот код будет отвечать за вывод таблицы с остатками по складам в карточке товара:
<tr>
<td colspan="3"><?php
if( $this->get_cfg( 'showAvailability' )) {
echo $product_availability;
}
?>
</td>
<!-- <td colspan="2"><br /><?php echo $addtocart ?></td> -->
</tr>
Его следует подретушировать при необходимости в файле
/public_html/components/com_virtuemart/themes/<у кого какая там тема (как правило, default)>/templates/product_details/flypage.tpl.php
Это сама таблица складов с остатками:
// Yes, we have XX products in stock!
elseif( ($product_in_stock >= 1 && CHECK_STOCK) ) { ?>
<div>
<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_IN_STOCK') ?>:
</div>
<table style="width:100%; margin: 10px 0px 20px; border-collapse: collapse;" border="0" cellspacing="0" cellpadding="3">
<tbody>
<?php
foreach( $product_stockroom['stockroom_name'] as $key => $value ) {
if($product_stockroom['stockroom_stock'][$key] > 0) { ?>
<tr>
<td style="border-top: 1px solid #d1d2d3; border-bottom: 1px solid #d1d2d3;">
<strong>
<?php echo $value; ?>
</strong>
</td>
<td style="border-top: 1px solid #d1d2d3; border-bottom: 1px solid #d1d2d3;">
<?php echo $product_stockroom['stockroom_desc'][$key]; ?>
</td>
</tr>
<?php }} ?>
<!-- <?php echo $product_in_stock ?> -->
</tbody></table>
<span>Остаток товара актуален на начало текущего дня.</span>
<?php
}
Код нужно поменять в файле
/public_html/components/com_virtuemart/themes/<у кого какая там тема (как правило, default)>/templates/common/availability.tpl.php
Ну и, самое главное, аккуратно внедряем новую переменную остатков по складам в сам модуль ядра сайта:
function get_availability($prod_id) {
$html = '';
$availArr = $this->get_availability_data( $prod_id );
if( !empty( $availArr )) {
$tpl = vmTemplate::getInstance();
$tpl->set( 'product_id', $prod_id );
$tpl->set( 'product_available_date', $availArr['product_available_date'] );
$tpl->set( 'product_availability', $availArr['product_availability'] );
$tpl->set( 'product_in_stock', $availArr['product_in_stock'] );
$tpl->set( 'product_stockroom', $availArr['product_stockroom'] );
$html = $tpl->fetch( 'common/availability.tpl.php');
}
return $html;
}
/**
* Retrieves the data related to availability information
*
* @param int $prod_id
* @return array
*/
function get_availability_data( $prod_id) {
$is_parent = $this->parent_has_children( $prod_id );
$availArr = array();
if( !$is_parent ) {
$availArr['product_id'] = $prod_id;
$availArr['product_available_date'] = $this->get_field( $prod_id, 'product_available_date');
$availArr['product_availability'] = $this->get_field( $prod_id, 'product_availability');
$availArr['product_in_stock'] = $this->get_field( $prod_id, 'product_in_stock');
$availArr['product_stockroom'] = $this->get_stockrooms( $prod_id );
}
return $availArr;
}
/**
* Функция вытаскивает склады с ненулевыми остатками
*/
function get_stockrooms($pid) {
$db = new ps_DB;
$q = "SELECT product_stock_id, product_stock FROM #__{vm}_product_stock ";
$q .= "WHERE product_id='$pid' ";
$db->setQuery($q); $db->query();
$i = 0;
$list = Array();
while($db->next_record()) {
$list[$i] = $db->f("product_stock_id");
$GLOBALS['product_info'][$pid]["stockroom"]["stockroom_stock"][$i] = $db->f("product_stock");
$i++;
}
foreach( $list as $key => $value ) {
$db_stock = new ps_DB;
$q_st = "SELECT stockroom_name, stockroom_desc FROM #__{vm}_stockroom ";
$q_st .= "WHERE stockroom_id='$value' ";
$db_stock->query($q_st);
$db_stock->next_record();
if( $db_stock->num_rows() > 0 ) {
$GLOBALS['product_info'][$pid]["stockroom"]["stockroom_name"][$key] = $db_stock->f("stockroom_name");
$GLOBALS['product_info'][$pid]["stockroom"]["stockroom_desc"][$key] = $db_stock->f("stockroom_desc");
}
}
return $GLOBALS['product_info'][$pid]["stockroom"];
}
Тут мне пришлось добавить одну новую функцию и модифицировать пару имевшихся...
Путь файла:
/public_html/administrator/components/com_virtuemart/classes/ps_product.php
И в общем-то, всё.