Очень часто администраторы интернет магазинов на базе Joomla Virtuemart при просмотре списка поступивших заказов в админке хотят видеть сколько было заказов у каждого клиента. Первый это заказ или повторный? Я покажу как вывести эту информацию.
В итоге получим следующую картинку:
При нажатии на количество заказов попадаем на страницу со списком этих заказов
Хак рассматриваем для virtuemart v.1.1.4, для последующих версий всё также.
Открываем файл \administrator\components\com_virtuemart\html\order.order_list.php
Добавляем колонку и её заголовок:
Находим в районе 98 строки
$VM_LANG->_('PHPSHOP_ORDER_PRINT_NAME') => '',
И поле добавляем:
'Заказы' => '',
После
$dbl =& new ps_DB;
Добавляем
$dbz = new ps_DB;
Находим
$tmp_cell = $db->f('first_name').' '.$db->f('last_name');
if( $perm->check('admin') && defined('_VM_IS_BACKEND')) {
$url = $_SERVER['PHP_SELF']."?page=admin.user_form&user_id=". $db->f("user_id");
$tmp_cell = '<a href="'.$sess->url( $url ).'">'.$tmp_cell.'</a>';
}
$listObj->addCell( $tmp_cell );
После этого добавляем
$lizt = "SELECT count(*) as num FROM #__{vm}_orders WHERE user_id=".$db->f("user_id");
$dbz->query( $lizt );
$dbz->next_record();
if ($dbz->f("num")) {
$z= $dbz->f("num");
$url = $_SERVER['PHP_SELF']."?page=admin.user_orders&user_id=". $db->f("user_id");
$tmp_cell = '<a href="'.$sess->url( $url ).'">'.$z.'</a>';
$listObj->addCell( $tmp_cell);
} else {
$listObj->addCell( 'Нет');
}
Обязательно сохраняем файл в кодировке "UTF без BOM"
в той же папке создаем файл admin.user_orders.php со следующим содержимым:
<?php
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
mm_showMyFileName( __FILE__ );
global $ps_shopper_group, $ps_product;
global $acl, $database;
include_class( 'shopper' );
include_class( 'product' );
if( !isset($ps_shopper_group)) {
$ps_shopper_group = new ps_shopper_group();
}
$user_id = intval( vmGet( $_REQUEST, 'user_id' ) );
$cid = vmRequest::getVar( 'cid', array(0), '', 'array' );
if( !empty($user_id) ) {
$q = "SELECT * FROM #__users AS u LEFT JOIN #__{vm}_user_info AS ui ON id=user_id ";
$q .= "WHERE id=$user_id ";
$q .= "AND (address_type='BT' OR address_type IS NULL ) ";
$q .= "AND gid <= ".$my->gid;
$db->query($q);
$db->next_record();
}
// Set up the CMS General User Information
$row = new mosUser( $database );
$row->load( (int) $user_id );
if ( $user_id ) {
$query = "SELECT *"
. "\n FROM #__contact_details"
. "\n WHERE user_id = " . (int) $row->id
;
$database->setQuery( $query );
$contact = $database->loadObjectList();
$row->name = trim( $row->name );
$row->email = trim( $row->email );
$row->username = trim( $row->username );
$row->password = trim( $row->password );
} else {
$contact = NULL;
$row->block = 0;
}
// check to ensure only super admins can edit super admin info
if ( ( $my->gid < 25 ) && ( $row->gid == 25 ) ) {
vmRedirect( 'index2.php?option=com_users', _NOT_AUTH );
}
$my_group = strtolower( $acl->get_group_name( $row->gid, 'ARO' ) );
if ( $my_group == 'super administrator' && $my->gid != 25 ) {
$lists['gid'] = '<input type="hidden" name="gid" value="'. $my->gid .'" /><strong>Super Administrator</strong>';
} else if ( $my->gid == 24 && $row->gid == 24 ) {
$lists['gid'] = '<input type="hidden" name="gid" value="'. $my->gid .'" /><strong>Administrator</strong>';
} else {
// ensure user can't add group higher than themselves
$my_groups = $acl->get_object_groups( 'users', $my->id, 'ARO' );
if (is_array( $my_groups ) && count( $my_groups ) > 0) {
$ex_groups = $acl->get_group_children( $my_groups[0], 'ARO', 'RECURSE' );
if (!$ex_groups) $ex_groups = array();
} else {
$ex_groups = array();
}
$gtree = $acl->get_group_children_tree( null, 'USERS', false );
// remove users 'above' me
$i = 0;
while ($i < count( $gtree )) {
if (in_array( $gtree[$i]->value, $ex_groups )) {
array_splice( $gtree, $i, 1 );
} else {
$i++;
}
}
$lists['gid'] = vmCommonHTML::selectList( $gtree, 'gid', 'size="10"', 'value', 'text', $row->gid, true );
}
// build the html select list
$lists['block'] = vmCommonHTML::yesnoRadioList( 'block', 'class="inputbox" size="1"', 'value', 'text', $row->block );
// build the html select list
$lists['sendEmail'] = vmCommonHTML::yesnoRadioList( 'sendEmail', 'class="inputbox" size="1"', 'value', 'text', $row->sendEmail );
$canBlockUser = $acl->acl_check( 'administration', 'edit', 'users', $my->usertype, 'user properties', 'block_user' );
$canEmailEvents = $acl->acl_check( 'workflow', 'email_events', 'users', $acl->get_group_name( $row->gid, 'ARO' ) );
// Get the user parameters
if( vmIsJoomla( '1.5' ) ) {
require_once( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_users'.DS.'users.class.php' );
$user =& JUser::getInstance( $user_id );
$params = $user->getParameters(true);
} elseif( file_exists( $mosConfig_absolute_path . '/administrator/components/com_users/users.class.php' ) ) {
require_once( $mosConfig_absolute_path . '/administrator/components/com_users/users.class.php' );
$file = $mainframe->getPath( 'com_xml', 'com_users' );
$params =& new mosUserParameters( $row->params, $file, 'component' );
}
// Set the last visit date
$lvisit = $row->lastvisitDate;
if ($lvisit == "0000-00-00 00:00:00") {
$lvisit = '***' . $VM_LANG->_('VM_USER_FORM_LASTVISIT_NEVER');
}
//First create the object and let it print a form heading
$formObj = &new formFactory( vmCommonHTML::imageTag(VM_THEMEURL.'images/administration/header/icon-48-user.png', 'User Icon', 'absmiddle' )
.' '
. 'Список заказов покупателя' );
//Then Start the form
$formObj->startForm();
$tabs = new vmTabPanel(0, 1, "userform");
$tabs->startPane("userform-pane");
require_once( CLASSPATH . "pageNavigation.class.php" );
require_once( CLASSPATH . "htmlTools.class.php" );
require_once(CLASSPATH.'ps_order_status.php');
$ps_order_status = new ps_order_status;
$q = "";
$list = "SELECT * FROM #__{vm}_orders ";
$count = "SELECT count(*) as num_rows FROM #__{vm}_orders ";
$q .= "WHERE #__{vm}_orders.vendor_id='".$_SESSION['ps_vendor_id']."' AND #__{vm}_orders.user_id=".$user_id." ";
$q .= "ORDER BY #__{vm}_orders.cdate DESC ";
$count .= $q;
$list .= $q;
$db->query($count);
$db->next_record();
$num_rows = $db->f("num_rows");
if( $num_rows ) {
$tabs->startTab( $VM_LANG->_('PHPSHOP_ORDER_LIST_LBL') . ' ('.$num_rows.')', "order-list");
?>
<h3><?php echo $VM_LANG->_('PHPSHOP_ORDER_LIST_LBL') ?> </h3>
<?php
// Create the Page Navigation
$pageNav = new vmPageNav( $num_rows, $limitstart, $limit );
// Create the List Object with page navigation
$listObj = new listFactory( $pageNav );
$listObj->startTable();
// these are the columns in the table
$columns = Array( "#" => "width=\"20\"",
$VM_LANG->_('PHPSHOP_ORDER_LIST_ID') => '',
$VM_LANG->_('PHPSHOP_CHECK_OUT_THANK_YOU_PRINT_VIEW') => '',
$VM_LANG->_('PHPSHOP_ORDER_LIST_CDATE') => '',
$VM_LANG->_('PHPSHOP_ORDER_LIST_MDATE') => '',
$VM_LANG->_('PHPSHOP_ORDER_LIST_STATUS') => '',
$VM_LANG->_('PHPSHOP_ORDER_LIST_TOTAL') => '',
$VM_LANG->_('E_REMOVE') => "width=\"5%\""
);
$listObj->writeTableHeader( $columns );
$db->query($list);
$i = 0;
while ($db->next_record()) {
$listObj->newRow();
// The row number
$listObj->addCell( $pageNav->rowNumber( $i ) );
$url = $_SERVER['PHP_SELF']."?page=order.order_print&limitstart=$limitstart&keyword=".urlencode($keyword)."&order_id=". $db->f("order_id");
$tmp_cell = "<a href=\"" . $sess->url($url) . "\">".sprintf("%08d", $db->f("order_id"))."</a><br />";
$listObj->addCell( $tmp_cell );
$details_url = $sess->url( $_SERVER['PHP_SELF']."?page=order.order_printdetails&order_id=".$db->f("order_id")."&no_menu=1");
$details_url = stristr( $_SERVER['PHP_SELF'], "index2.php" ) ? str_replace( "index2.php", "index3.php", $details_url ) : str_replace( "index.php", "index2.php", $details_url );
$details_link = " <a href=\"javascript:void window.open('$details_url', 'win2', 'status=no,toolbar=no,scrollbars=yes,titlebar=no,menubar=no,resizable=yes,width=640,height=480,directories=no,location=no');\">";
$details_link .= "<img src=\"$mosConfig_live_site/images/M_images/printButton.png\" align=\"center\" height=\"16\" width=\"16\" border=\"0\" /></a>";
$listObj->addCell( $details_link );
$listObj->addCell( strftime("%d-%b-%y %H:%M", $db->f("cdate")));
$listObj->addCell( strftime("%d-%b-%y %H:%M", $db->f("mdate")));
$listObj->addCell( $ps_order_status->getOrderStatusName($db->f("order_status")));
$listObj->addCell( $CURRENCY_DISPLAY->getFullValue($db->f("order_total")));
$listObj->addCell( $ps_html->deleteButton( "order_id", $db->f("order_id"), "orderDelete", $keyword, $limitstart. '&user_id='.$user_id ) );
$i++;
}
$listObj->writeTable();
$listObj->endTable();
$tabs->endTab();
}
$tabs->endPane();
// Add necessary hidden fields
$formObj->hiddenField( 'address_type', 'BT' );
$formObj->hiddenField( 'address_type_name', '-default-' );
$formObj->hiddenField( 'user_id', $user_id );
$funcname = $user_id ? "userUpdate" : "userAdd";
// Write your form with mixed tags and text fields
// and finally close the form:
$formObj->finishForm( $funcname, 'admin.user_list', $option );
?>
Сохраняем файл. Наслаждаемся результатом...

