Взял у умного человека, который взял (недоделанную версию) у буржуев, помучился день, и вон есть! ВСЁ работает!
В интернет-магазине VirtueMart для изменения количества товаров на складе необходимо зайти в сам товар в админке. Данное решение изменяет ситуацию. Очень удобно, в итоге должно выглядеть примерно так
и
Вперед! Если пьете пиво, отложите сей труд на потом
Файлы которые надо изменить:
administrator/components/com_virtuemart/html/product.ajax_tools
administrator/components/com_virtuemart/html/product.product_list
administrator/components/com_virtuemart/languages/common/russian.php
Открываем файл product.ajax_tools, находим 82 строку (если у вас не изменялся этот файл) или поиском, после этих строк
vmConnector::sendHeaderAndContent( 200, $content );
break;
Вставляем
case 'getstockform':
include_class('product');
$product_id = intval( vmGet( $_REQUEST, 'product_id' ));
$stock = $ps_product->get_field($product_id,'product_in_stock');
$formName = 'stockForm';
$content = '<form id="'.$formName.'" method="post" name="stockForm">';
$content .= '<table class="adminform"><tr><td><strong>'.$VM_LANG->_('PHPSHOP_PRODUCT_FORM_IN_STOCK').':</strong></td><td><input type="text" name="product_in_stock" value="'.$stock.'" class="inputbox" id="product_in_stock_'.$formName.'" size="11" /></td></tr>';
$content .= '<input type="hidden" name="product_stock_id" value="'.$stock.'" id="product_stock_id_'.$formName.'" />';
$content .= '<input type="hidden" name="product_id" value="'.$product_id.'" />';
$content .= '<input type="hidden" name="func" value="productStockUpdate" />';
$content .= '<input type="hidden" name="ajax_request" value="1" />';
$content .= '<input type="hidden" name="no_html" value="1" />';
$content .= '<input type="hidden" name="vmtoken" value="'.vmSpoofValue($sess->getSessionId()).'" />';
$content .= '<input type="hidden" name="option" value="'.$option.'" />';
$content .= '</form>';
vmConnector::sendHeaderAndContent( 200, $content );
break;
Далее идем в файлproduct.product_list (administrator/components/com_virtuemart/html) и после строк
$search_sql = " (#__{vm}_product.product_name LIKE '%$keyword%' OR \n";
$search_sql .= "#__{vm}_product.product_sku LIKE '%$keyword%' OR \n";
вставляем
$search_sql .= "#__{vm}_product.product_in_stock LIKE '%$keyword%' OR \n";
чуть ниже изменяем следующую строку
$list = "SELECT #__{vm}_category.category_name,#__{vm}_product.product_id,#__{vm}_product.product_name,#__{vm}_product.product_sku,#__{vm}_product.vendor_id,product_publish, product_list, product_full_image, product_thumb_image";
на эту
$list = "SELECT #__{vm}_category.category_name,#__{vm}_product.product_id,#__{vm}_product.product_name,#__{vm}_product.product_sku,#__{vm}_product.product_in_stock,#__{vm}_product.vendor_id,product_publish, product_list, product_full_image, product_thumb_image";
далее находим строки
$VM_LANG->_('PHPSHOP_PRODUCT_PRICE_TITLE') => "width=\"10%\"",
$VM_LANG->_('PHPSHOP_CATEGORY') => "width=\"15%\"" );
изменяем и добавляем вот это
$VM_LANG->_('PHPSHOP_PRODUCT_FORM_IN_STOCK') => "width=\"5%\"",
$VM_LANG->_('PHPSHOP_PRODUCT_PRICE_TITLE') => "width=\"15%\"",
$VM_LANG->_('PHPSHOP_CATEGORY') => "width=\"10%\"" );
после строк
// The product sku
$listObj->addCell( $db->f("product_sku") );
вставляем это
// The product current stock
$tmp_cell = '<span class="editable priceform">'.$db->f("product_in_stock").' ';
$listObj->addCell( $tmp_cell, 'id="'.$db->f('product_id').'" onclick="showStockForm(this.id)" title="'.$VM_LANG->_('PHPSHOP_PRODUCT_FORM_IN_STOCK').'"' );
находим строки
<script type="text/javascript">
var priceDlg = null;
после них вставляем
находим строку
title:'<?php echo $VM_LANG->_('PHPSHOP_PRICE_FORM_LBL')?>',
msg: o.responseText,
buttons: Ext.Msg.OKCANCEL,
fn: handleResult
изменяем
fn: handleResult на
fn: handleResultPriceи добавляем ниже этих строк
fn: handleResultPrice
});
}};
Ext.Ajax.request({method:'GET', url: sUrl, success: callback.success });
}
новый метод
function showStockForm(prodId) {
// define some private variables
var showBtn;
sUrl = '<?php $sess->purl( $mm_action_url .'index3.php?page=product.ajax_tools&task=getStockForm&no_html=1', false, false, true )?>&product_id=' + prodId;
callback = { success : function(o) {
stockDlg = Ext.Msg.show({
width:300,
height:250,
title:'<?php echo $VM_LANG->_('PHPSHOP_PRODUCT_FORM_IN_STOCK')?>',
msg: o.responseText,
buttons: Ext.Msg.OKCANCEL,
fn: handleResultStock
});
}};
Ext.Ajax.request({method:'GET', url: sUrl, success: callback.success });
}
Изменяем название метода function handleResult( btn ) на function handleResultPrice( btn ), далее после измененного нами метода
function handleResultPrice( btn ) {
switch( btn ) {
case 'ok':
submitPriceForm( 'priceForm' );
break;
case 'cancel':
break;
}
}
вставляем еще один
function handleResultStock( btn ) {
switch( btn ) {
case 'ok':
submitStockForm( 'stockForm' );
break;
case 'cancel':
break;
}
}
После строк
upload : function(o){
//Ext.DomHelper.insertHtml( 'beforeEnd', document.body, o.responseText );
showDialog( o.responseText );
}
};
Ext.Ajax.request({method:'POST', url: '<?php echo $_SERVER['PHP_SELF'] ?>', success: callback.success, failure: callback.failure, form: formId});
}
Вставляем несколько методов
function submitStockForm(formId) {
// define some private variables
var dialog, showBtn, hideTask;
function showDialog( content ) {
var msgbox = Ext.Msg.show( {
title: '<?php echo $VM_LANG->_('PEAR_LOG_NOTICE')?>',
msg: content,
autoCreate: true,
width:300,
height:150,
fn: msgBoxClick,
modal: false,
resizable: false,
buttons: Ext.Msg.OK,
shadow:true,
animEl:Ext.get( 'vm-toolbar' )
});
// This Dialog shows the result of the price update. We want it to autohide after 3000 seconds
// Here we need to use "DelayedTask" because we need to cancel the autohide function if the user clicked
// the dialog away
hideTask = new Ext.util.DelayedTask(msgbox.hide, msgbox);
hideTask.delay( 3000 );
}
var msgBoxClick = function(result) {
if( result == 'ok' ) {
hideTask.cancel();
}
};
// return a public interface
var callback = {
success: function(o) {
//Ext.DomHelper.insertHtml( document.body, o.responseText );
showDialog( o.responseText );
},
failure: function(o) {
Ext.Msg.alert('Error!', 'Something went wrong while posting the form data (possibly 404 error).');
},
upload : function(o){
//Ext.DomHelper.insertHtml( 'beforeEnd', document.body, o.responseText );
showDialog( o.responseText );
}
};
Ext.Ajax.request({method:'POST', url: '<?php echo $_SERVER['PHP_SELF'] ?>', success: callback.success, failure: callback.failure, form: formId});
}
function cancelStockForm(id) {
updateStockField( id );
}
function updateStockField( id ) {
sUrl = '<?php $sess->purl( $mm_action_url .'index3.php?option=com_virtuemart&no_html=1&page=product.ajax_tools&task=getstock&formatStock=1', false, false, true )?>&product_id=' + id;
callback = { success : function(o) { Ext.get("stockform-dlg").innerHTML = o.responseText; }};
Ext.Ajax.request({method:'GET', url: sUrl, success:callback.success });
}
ниже находим строку $formName = uniqid('priceForm'); и заменяем ее на
$formPriceName = uniqid('priceForm');
$formStockName = uniqid('stockForm');
и в последнюю строчку файла добавляем
<div id="stockform-dlg"></div>
Этот файл изменен, идем в administrator/components/com_virtuemart/languages/common/russian.php и добавляем строки перевода
'VM_PRODUCT_STOCK_UPDATED' => 'Количество товара обновлено',
'VM_PRODUCT_STOCK_UPDATING_FAILED' => 'Не обновлено, ошибка',
С изменениями файлов - все. Теперь закидываем файл ps_product_stock в классы (administrator/components/com_virtuemart/classes) и регистрируем функцию. Идем в админке VirtueMart - Настройки - Список модулей - admin - Список функций и добавляем функцию
ИМЯ productStockUpdate
ИМЯ КЛАССА ps_product_stock
МЕТОД КЛАССА update
ПРАВА НА ФУНКЦИЮ admin,storeadmin
любуемся результатом.
файлы приложить не могу, поэтому даю ссылки на скачивание (с буржуев):
http://forum.virtuemart.net/archive/index.php?action=dlattach;topic=59460.0;attach=14321http://forum.virtuemart.net/archive/index.php?action=dlattach;topic=59460.0;attach=11357помошники и источники:
http://forum.virtuemart.net и
http://virtuemart-shopscript.comУРА!