OpenCart订单跟踪无需登录

时间:2015-10-10 20:15:49

标签: opencart tracking

我正在使用opencart 1.5.6.3,我正在尝试显示包含2个字段的页面。 1个字段将用于电子邮件,另一个字段用于订单ID。因此,客户无需登录即可直接查看订单状态。

提前感谢。

1 个答案:

答案 0 :(得分:1)

经过这么多尝试,我得到了解决方案。

添加新文件 目录>控制器>帐户> guest.php

<?php class ControllerAccountGuest extends Controller {
private $error = array();

public function index() {

$this->language->load('account/guest');

$this->document->setTitle($this->language->get('heading_title'));

$this->data['breadcrumbs'] = array();

$this->data['breadcrumbs'][] = array(
    'text'      => $this->language->get('text_home'),
  'href'      => $this->url->link('common/home'),           
    'separator' => false
); 

    $this->data['breadcrumbs'][] = array(
        'text'      => $this->language->get('text_account'),
        'href'      => $this->url->link('account/account', '', 'SSL'),
        'separator' => $this->language->get('text_separator')
    );

$this->data['heading_title'] = $this->language->get('heading_title');

$this->data['entry_email'] = $this->language->get('entry_email');
$this->data['entry_ip'] = $this->language->get('entry_ip');
$this->data['entry_order_id'] = $this->language->get('entry_order_id');

$this->data['text_err'] = $this->language->get('text_err');
$this->data['text_ip'] = $this->language->get('text_ip');
$this->data['text_order_id'] = $this->language->get('text_order_id');    

$this->data['button_continue'] = $this->language->get('button_continue');

    $this->data['action']   = $this->url->link('account/guest/info', '', 'SSL');        
    $this->data['continue'] = $this->url->link('account/guest', '', 'SSL');

if (isset($this->request->get['email'])) {
        $this->data['email'] = $this->request->get['email'];
    } else {
        $this->data['email'] = '';
    }

if (isset($this->request->get['ip'])) {
        $this->data['ip'] = $this->request->get['ip'];
    } else {
        $this->data['ip'] = '';
    }

    if (isset($this->request->get['order_id'])) {
        $this->data['order_id'] = $this->request->get['order_id'];
    } else {
        $this->data['order_id'] = '';
    }

    // Nacteni chybovych hlaseni
$err = array(
  'email'    => false,
  'ip'       => false,
  'order_id' => false,
);
if (isset($this->request->get['err'])) {
        $err_temp = explode('|', $this->request->get['err']);
  foreach ($err_temp as $value) {
    $err[$value] = true;
  } // foreach
    }
$this->data['err'] = $err;

    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/account/guest_login.tpl')) {
        $this->template = $this->config->get('config_template') . '/template/account/guest_login.tpl';
    } else {
        $this->template = 'default/template/account/guest_login.tpl';
    }

    $this->children = array(
        'common/column_left',
        'common/column_right',
        'common/content_top',
        'common/content_bottom',
        'common/footer',
        'common/header' 
    );

    $this->response->setOutput($this->render());                
}

public function info() { 

    $err = false;    
$url = '';

    if ( isset($this->request->post['email']) AND strlen($this->request->post['email']) > 4 ) {
        $email = $this->request->post['email'];
  $url .= '&email=' . $this->request->post['email'];
    } else {
        $email = '';
  $err = ( $err ? $err . '|' . 'email' : 'email' );
    }

    /*
    if (isset($this->request->post['ip'])) {
        $ip = $this->request->post['ip'];
  $url .= '&ip=' . $this->request->post['ip'];
    } else {
        $ip = '0';
  $err = ( $err ? $err . '|' . 'ip' : 'ip' );
    }
    */

if ( isset($this->request->post['order_id']) AND is_numeric($this->request->post['order_id']) ) {
        $order_id = $this->request->post['order_id'];
  $url .= '&order_id=' . $this->request->post['order_id'];
    } else {
        $order_id = '0';
  $err = ( $err ? $err . '|' . 'order_id' : 'order_id' );
    }

    if ($err) {
  $url .= '&err=' . $err;
  $this->redirect($this->url->link('account/guest', 'token=' . $this->session->data['token'] . $url, 'SSL'));
}

$this->language->load('account/guest_history');

    $this->load->model('account/guest');

    //$order_info = $this->model_account_guest->getOrder($order_id, $email, $ip);
    $order_info = $this->model_account_guest->getOrder($order_id, $email);

    if ($order_info) {

        $this->document->setTitle($this->language->get('text_order'));

        $this->data['breadcrumbs'] = array();

        $this->data['breadcrumbs'][] = array(
            'text'      => $this->language->get('text_home'),
            'href'      => $this->url->link('common/home'),         
            'separator' => false
        ); 

    $this->data['breadcrumbs'][] = array(
        'text'      => $this->language->get('text_account'),
        'href'      => $this->url->link('account/account', '', 'SSL'),
        'separator' => $this->language->get('text_separator')
    );      

        $this->data['heading_title'] = $this->language->get('text_order');

        $this->data['text_order_detail'] = $this->language->get('text_order_detail');
        $this->data['text_invoice_no'] = $this->language->get('text_invoice_no');
        $this->data['text_order_id'] = $this->language->get('text_order_id');
        $this->data['text_date_added'] = $this->language->get('text_date_added');
        $this->data['text_shipping_method'] = $this->language->get('text_shipping_method');
        $this->data['text_shipping_address'] = $this->language->get('text_shipping_address');
        $this->data['text_payment_method'] = $this->language->get('text_payment_method');
        $this->data['text_payment_address'] = $this->language->get('text_payment_address');
        $this->data['text_history'] = $this->language->get('text_history');
        $this->data['text_comment'] = $this->language->get('text_comment');
        $this->data['text_action'] = $this->language->get('text_action');
        $this->data['text_selected'] = $this->language->get('text_selected');
        $this->data['text_reorder'] = $this->language->get('text_reorder');
        $this->data['text_return'] = $this->language->get('text_return');

        $this->data['column_name'] = $this->language->get('column_name');
        $this->data['column_model'] = $this->language->get('column_model');
        $this->data['column_quantity'] = $this->language->get('column_quantity');
        $this->data['column_price'] = $this->language->get('column_price');
        $this->data['column_total'] = $this->language->get('column_total');
        $this->data['column_date_added'] = $this->language->get('column_date_added');
        $this->data['column_status'] = $this->language->get('column_status');
        $this->data['column_comment'] = $this->language->get('column_comment');

        $this->data['button_continue'] = $this->language->get('button_continue');

        $this->data['action'] = $this->url->link('account/order/info', 'order_id=' . $order_id , 'SSL');

        if ($order_info['invoice_no']) {
            $this->data['invoice_no'] = $order_info['invoice_prefix'] . $order_info['invoice_no'];
        } else {
            $this->data['invoice_no'] = '';
        }

        $this->data['order_id'] = $order_id ;
        $this->data['date_added'] = date($this->language->get('date_format_short'), strtotime($order_info['date_added']));

        if ($order_info['shipping_address_format']) {
            $format = $order_info['shipping_address_format'];
        } else {
            $format = '{firstname} {lastname}' . "\n" . '{company}' . "\n" . '{address_1}' . "\n" . '{address_2}' . "\n" . '{city} {postcode}' . "\n" . '{zone}' . "\n" . '{country}';
        }

    $find = array(
        '{firstname}',
        '{lastname}',
        '{company}',
        '{address_1}',
        '{address_2}',
        '{city}',
        '{postcode}',
        '{zone}',
        '{zone_code}',
    '{country}'
        );

        $replace = array(
        'firstname' => $order_info['shipping_firstname'],
        'lastname'  => $order_info['shipping_lastname'],
        'company'   => $order_info['shipping_company'],
        'address_1' => $order_info['shipping_address_1'],
        'address_2' => $order_info['shipping_address_2'],
        'city'      => $order_info['shipping_city'],
        'postcode'  => $order_info['shipping_postcode'],
        'zone'      => $order_info['shipping_zone'],
            'zone_code' => $order_info['shipping_zone_code'],
    'country'   => $order_info['shipping_country']  
        );

        $this->data['shipping_address'] = str_replace(array("\r\n", "\r", "\n"), '<br />', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '<br />', trim(str_replace($find, $replace, $format))));

        $this->data['shipping_method'] = $order_info['shipping_method'];

        if ($order_info['payment_address_format']) {
    $format = $order_info['payment_address_format'];
    } else {
            $format = '{firstname} {lastname}' . "\n" . '{company}' . "\n" . '{address_1}' . "\n" . '{address_2}' . "\n" . '{city} {postcode}' . "\n" . '{zone}' . "\n" . '{country}';
        }

    $find = array(
        '{firstname}',
        '{lastname}',
        '{company}',
        '{address_1}',
        '{address_2}',
        '{city}',
        '{postcode}',
        '{zone}',
            '{zone_code}',
    '{country}'
        );

        $replace = array(
        'firstname' => $order_info['payment_firstname'],
        'lastname'  => $order_info['payment_lastname'],
        'company'   => $order_info['payment_company'],
        'address_1' => $order_info['payment_address_1'],
        'address_2' => $order_info['payment_address_2'],
        'city'      => $order_info['payment_city'],
        'postcode'  => $order_info['payment_postcode'],
        'zone'      => $order_info['payment_zone'],
            'zone_code' => $order_info['payment_zone_code'],
    'country'   => $order_info['payment_country']  
        );

        $this->data['payment_address'] = str_replace(array("\r\n", "\r", "\n"), '<br />', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '<br />', trim(str_replace($find, $replace, $format))));

  $this->data['payment_method'] = $order_info['payment_method'];

        $this->data['products'] = array();

        $products = $this->model_account_guest->getOrderProducts($order_id );

  foreach ($products as $product) {
            $option_data = array();

            $options = $this->model_account_guest->getOrderOptions($order_id , $product['order_product_id']);

    foreach ($options as $option) {
      if ($option['type'] != 'file') {
                    $option_data[] = array(
                        'name'  => $option['name'],
                        'value' => (strlen($option['value']) > 20 ? substr($option['value'], 0, 20) . '..' : $option['value']),
                    );
                } else {
                    $filename = substr($option['value'], 0, strrpos($option['value'], '.'));

                    $option_data[] = array(
                        'name'  => $option['name'],
                        'value' => (strlen($filename) > 20 ? substr($filename, 0, 20) . '..' : $filename)
                    );                      
                }
    } // foreach

    $this->data['products'][] = array(
                'order_product_id' => $product['order_product_id'],
      'name'             => $product['name'],
      'model'            => $product['model'],
      'option'           => $option_data,
      'quantity'         => $product['quantity'],
      'price'            => $this->currency->format($product['price'], $order_info['currency_code'], $order_info['currency_value']),
                'total'            => $this->currency->format($product['total'], $order_info['currency_code'], $order_info['currency_value']),
                'selected'         => isset($this->request->post['selected']) && in_array($result['order_product_id'], $this->request->post['selected'])
    );
  }

  $this->data['totals'] = $this->model_account_guest->getOrderTotals($order_id );

        $this->data['comment'] = $order_info['comment'];

        $this->data['histories'] = array();

        $results = $this->model_account_guest->getOrderHistories($order_id );

    foreach ($results as $result) {
        $this->data['histories'][] = array(
        'date_added' => date($this->language->get('date_format_short'), strtotime($result['date_added'])),
        'status'     => $result['status'],
        'comment'    => nl2br($result['comment'])
        );
    } // foreach

    $this->data['continue'] = $this->url->link('account/order', '', 'SSL');

        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/account/guest_history.tpl')) {
            $this->template = $this->config->get('config_template') . '/template/account/guest_history.tpl';
        } else {
            $this->template = 'default/template/account/guest_history.tpl';
        }

        $this->children = array(
            'common/column_left',
            'common/column_right',
            'common/content_top',
            'common/content_bottom',
            'common/footer',
            'common/header' 
        );

        $this->response->setOutput($this->render());        

} else {

        $this->document->setTitle($this->language->get('text_order'));

  $this->data['heading_title'] = $this->language->get('text_order');

  $this->data['text_error'] = $this->language->get('text_error');

  $this->data['button_continue'] = $this->language->get('button_continue');

        $this->data['breadcrumbs'] = array();

        $this->data['breadcrumbs'][] = array(
            'text'      => $this->language->get('text_home'),
            'href'      => $this->url->link('common/home'),
            'separator' => false
        );

    $this->data['breadcrumbs'][] = array(
        'text'      => $this->language->get('text_account'),
        'href'      => $this->url->link('account/account', '', 'SSL'),
        'separator' => $this->language->get('text_separator')
    );          

  $this->data['continue'] = $this->url->link('account/order', '', 'SSL');

        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/error/not_found.tpl')) {
            $this->template = $this->config->get('config_template') . '/template/error/not_found.tpl';
        } else {
            $this->template = 'default/template/error/not_found.tpl';
        }

        $this->children = array(
            'common/column_left',
            'common/column_right',
            'common/content_top',
            'common/content_bottom',
            'common/footer',
            'common/header' 
        );

        $this->response->setOutput($this->render());                
}} // info

private function validate() {
    if (!isset($this->request->post['selected']) || !isset($this->request->post['action']) || !$this->request->post['action']) {
        $this->error['warning'] = $this->language->get('error_warning');
    }

    if (!$this->error) {
  return true;
} else {
  return false;
}       
} // validate } ?>

将另一个新文件添加到目录&gt;模型&GT;帐户&GT; guest.php

<?php class ModelAccountGuest extends Model { //public function getOrder($order_id, $email, $ip) { public function getOrder($order_id, $email) {

    $order_query = $this->db->query("
  SELECT *
  FROM `" . DB_PREFIX . "order`
  WHERE order_id = '" . (int)$order_id . "'
    AND email = '" . $this->db->escape($email) . "'
    AND order_status_id > '0'
"); // AND ip = '" . $this->db->escape($ip) . "'

    if ($order_query->num_rows) {

        $country_query = $this->db->query("
    SELECT * 
    FROM `" . DB_PREFIX . "country` 
    WHERE country_id = '" . (int)$order_query->row['shipping_country_id'] . "'
  ");

        if ($country_query->num_rows) {
            $shipping_iso_code_2 = $country_query->row['iso_code_2'];
            $shipping_iso_code_3 = $country_query->row['iso_code_3'];
        } else {
            $shipping_iso_code_2 = '';
            $shipping_iso_code_3 = '';              
        }

        $zone_query = $this->db->query("
    SELECT * 
    FROM `" . DB_PREFIX . "zone` 
    WHERE zone_id = '" . (int)$order_query->row['shipping_zone_id'] . "'
  ");

        if ($zone_query->num_rows) {
            $shipping_zone_code = $zone_query->row['code'];
        } else {
            $shipping_zone_code = '';
        }

        $country_query = $this->db->query("
    SELECT * 
    FROM `" . DB_PREFIX . "country` 
    WHERE country_id = '" . (int)$order_query->row['payment_country_id'] . "'
  ");

        if ($country_query->num_rows) {
            $payment_iso_code_2 = $country_query->row['iso_code_2'];
            $payment_iso_code_3 = $country_query->row['iso_code_3'];
        } else {
            $payment_iso_code_2 = '';
            $payment_iso_code_3 = '';               
        }

        $zone_query = $this->db->query("
    SELECT * 
    FROM `" . DB_PREFIX . "zone` 
    WHERE zone_id = '" . (int)$order_query->row['payment_zone_id'] . "'
  ");

        if ($zone_query->num_rows) {
            $payment_zone_code = $zone_query->row['code'];
        } else {
            $payment_zone_code = '';
        }

        return array(
            'order_id'                => $order_query->row['order_id'],
            'invoice_no'              => $order_query->row['invoice_no'],
            'invoice_prefix'          => $order_query->row['invoice_prefix'],
            'store_id'                => $order_query->row['store_id'],
            'store_name'              => $order_query->row['store_name'],
            'store_url'               => $order_query->row['store_url'],                
            'customer_id'             => $order_query->row['customer_id'],
            'firstname'               => $order_query->row['firstname'],
            'lastname'                => $order_query->row['lastname'],
            'telephone'               => $order_query->row['telephone'],
            'fax'                     => $order_query->row['fax'],
            'email'                   => $order_query->row['email'],
            'shipping_firstname'      => $order_query->row['shipping_firstname'],
            'shipping_lastname'       => $order_query->row['shipping_lastname'],                
            'shipping_company'        => $order_query->row['shipping_company'],
            'shipping_address_1'      => $order_query->row['shipping_address_1'],
            'shipping_address_2'      => $order_query->row['shipping_address_2'],
            'shipping_postcode'       => $order_query->row['shipping_postcode'],
            'shipping_city'           => $order_query->row['shipping_city'],
            'shipping_zone_id'        => $order_query->row['shipping_zone_id'],
            'shipping_zone'           => $order_query->row['shipping_zone'],
            'shipping_zone_code'      => $shipping_zone_code,
            'shipping_country_id'     => $order_query->row['shipping_country_id'],
            'shipping_country'        => $order_query->row['shipping_country'], 
            'shipping_iso_code_2'     => $shipping_iso_code_2,
            'shipping_iso_code_3'     => $shipping_iso_code_3,
            'shipping_address_format' => $order_query->row['shipping_address_format'],
            'shipping_method'         => $order_query->row['shipping_method'],
            'payment_firstname'       => $order_query->row['payment_firstname'],
            'payment_lastname'        => $order_query->row['payment_lastname'],             
            'payment_company'         => $order_query->row['payment_company'],
            'payment_address_1'       => $order_query->row['payment_address_1'],
            'payment_address_2'       => $order_query->row['payment_address_2'],
            'payment_postcode'        => $order_query->row['payment_postcode'],
            'payment_city'            => $order_query->row['payment_city'],
            'payment_zone_id'         => $order_query->row['payment_zone_id'],
            'payment_zone'            => $order_query->row['payment_zone'],
            'payment_zone_code'       => $payment_zone_code,
            'payment_country_id'      => $order_query->row['payment_country_id'],
            'payment_country'         => $order_query->row['payment_country'],  
            'payment_iso_code_2'      => $payment_iso_code_2,
            'payment_iso_code_3'      => $payment_iso_code_3,
            'payment_address_format'  => $order_query->row['payment_address_format'],
            'payment_method'          => $order_query->row['payment_method'],
            'comment'                 => $order_query->row['comment'],
            'total'                   => $order_query->row['total'],
            'order_status_id'         => $order_query->row['order_status_id'],
            'language_id'             => $order_query->row['language_id'],
            'currency_id'             => $order_query->row['currency_id'],
            'currency_code'           => $order_query->row['currency_code'],
            'currency_value'          => $order_query->row['currency_value'],
            'date_modified'           => $order_query->row['date_modified'],
            'date_added'              => $order_query->row['date_added'],
            'ip'                      => $order_query->row['ip']
        );
    } else {
        return false;   
    }
} // getOrder


public function getOrderProducts($order_id) {
    $query = $this->db->query("
  SELECT * 
  FROM " . DB_PREFIX . "order_product 
  WHERE order_id = '" . (int)$order_id . "'
");

    return $query->rows;
} // getOrderProducts

public function getOrderOptions($order_id, $order_product_id) {
    $query = $this->db->query("
  SELECT * 
  FROM " . DB_PREFIX . "order_option 
  WHERE order_id = '" . (int)$order_id . "' AND order_product_id = '" . (int)$order_product_id . "'
");

    return $query->rows;
} // getOrderOptions

public function getOrderTotals($order_id) {
    $query = $this->db->query("
  SELECT * 
  FROM " . DB_PREFIX . "order_total 
  WHERE order_id = '" . (int)$order_id . "' 
  ORDER BY sort_order
");

    return $query->rows;
} // getOrderTotals 

public function getOrderHistories($order_id) {
    $query = $this->db->query("
  SELECT date_added, os.name AS status, oh.comment, oh.notify 
  FROM " . DB_PREFIX . "order_history oh 
  LEFT JOIN " . DB_PREFIX . "order_status os ON oh.order_status_id = os.order_status_id 
  WHERE oh.order_id = '" . (int)$order_id . "' 

    AND os.language_id = '" . (int)$this->config->get('config_language_id') . "' 
  ORDER BY oh.date_added
"); // AND oh.notify = '1' 

    return $query->rows;
}   // getOrderHistories

public function getOrderDownloads($order_id) {
    $query = $this->db->query("
  SELECT * 
  FROM " . DB_PREFIX . "order_download 
  WHERE order_id = '" . (int)$order_id . "' 
  ORDER BY name
");

    return $query->rows; 
} // getOrderDownloads  

public function getTotalOrders() {
$query = $this->db->query("
  SELECT COUNT(*) AS total 
  FROM `" . DB_PREFIX . "order` 
  WHERE customer_id = '" . (int)$this->customer->getId() . "' AND order_status_id > '0'
");

    return $query->row['total'];
} // getTotalOrders

public function getTotalOrderProductsByOrderId($order_id) {
    $query = $this->db->query("
  SELECT COUNT(*) AS total 
  FROM " . DB_PREFIX . "order_product 
  WHERE order_id = '" . (int)$order_id . "'
");

    return $query->row['total'];
} // getTotalOrderProductsByOrderId } // class ?>

现在将语言文件添加到目录&gt;语言&GT;英语&GT;帐户&GT;

<?php // Heading $_['heading_title'] = 'Order Tracking'; // Text $_['text_account']  = 'Account'; // Entry $_['entry_email'] = 'E-Mail Address:'; $_['entry_ip']  = 'IP Address:'; $_['entry_order_id'] = 'Order Number:'; $_['text_err'] = '<span style="color:red;"> <<< </span>'; $_['text_ip']              = 'eg. 123.345.456.678 &nbsp;-&nbsp;Find this on you order email in the \'Order Details\' section:'; $_['text_order_id']        = 'eg. 123 &nbsp;-&nbsp;Find this on you order email in the \'Order Details\' section:'; // Error $_['error_login'] = 'Warning: No match for E-Mail Address and/or Order Number.'; ?>

现在将tlp文件添加到目录&gt;视图&gt;主题&GT;默认&GT;模板&GT;帐户&GT; guest_login.tlp with form action and submit button然后添加这个java脚本:

<script type="text/javascript"><!-- $('#login input').keydown(function(e) {
if (e.keyCode == 13) {
    $('#login').submit();
} }); //--></script>

现在添加另一个文件以显示结果。目录和GT;视图&gt;主题&GT;默认&GT;模板&GT;帐户&GT; guest_history.tlp

使用自定义主题检查OpenCart 1.5.6.3。