Очень часто администраторы интернет магазинов на базе 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 ); ?>
Сохраняем файл. Наслаждаемся результатом...