简体   繁体   English

基于总订单的折扣

[英]Discount based on total order

Below code become active, when my set quantity is meet. 当满足我的设定数量时,以下代码将变为活动状态。

But if my set quantity is three for eligible discount, in that case if any customer buy four products, its still give discount for three products only. 但是,如果我的设定数量是3个可享受折扣的数量,那么在这种情况下,如果任何客户购买了4种产品,则它仍仅会折扣3种产品。

It wait for another three to give discount. 它等待另外三个打折。 But I want if my set minimum quantity meet, then it will give discount on total orders according to my set percentage. 但是我想如果我的最低数量达到要求,那么它将根据我设定的百分比为总订单提供折扣。

  1. I don't know coding. 我不知道编码。 Can anyone help to fix it with coding? 任何人都可以通过编码来解决它吗?

  2. I am new to stackoverflow. 我是stackoverflow的新手。 If my ability of explaining is wrong, then I am asking your apologies. 如果我的解释能力不对,请问您道歉。

Here is the code. 这是代码。

admin/controller/total/total_discount.php

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

    public function index() {
        $this->load->language('total/total_discount');

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

        $this->load->model('setting/setting');

        if (($this->request->server['REQUEST_METHOD'] == 'POST') && ($this->validate())) {
            $this->model_setting_setting->editSetting('total_discount', $this->request->post);

            $this->session->data['success'] = $this->language->get('text_success');

    $this->response->redirect($this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL'));
        }

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

        $data['text_enabled'] = $this->language->get('text_enabled');
        $data['text_disabled'] = $this->language->get('text_disabled');
        $data['text_each'] = $this->language->get('text_each');
        $data['text_once'] = $this->language->get('text_once');

        $data['entry_count'] = $this->language->get('entry_count');
        $data['entry_percent'] = $this->language->get('entry_percent');
        $data['entry_each'] = $this->language->get('entry_each');
        $data['entry_status'] = $this->language->get('entry_status');
        $data['entry_sort_order'] = $this->language->get('entry_sort_order');

        $data['help_count'] = $this->language->get('help_count');
        $data['help_percent'] = $this->language->get('help_percent');
        $data['help_each'] = $this->language->get('help_each');

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

        if (isset($this->error['warning'])) {
            $data['error_warning'] = $this->error['warning'];
        } else {
            $data['error_warning'] = '';
        }

        $data['breadcrumbs'] = array();

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_home'),
            'href' => $this->url->link('common/dashboard', 'token=' . $this->session->data['token'], 'SSL')
        );

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_total'),
            'href' => $this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL')
        );

        $data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'href' => $this->url->link('total/total_discount', 'token=' . $this->session->data['token'], 'SSL')
        );

        $data['action'] = $this->url->link('total/total_discount', 'token=' . $this->session->data['token'], 'SSL');

        $data['cancel'] = $this->url->link('extension/total', 'token=' . $this->session->data['token'], 'SSL');

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

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

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

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

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

        $data['header'] = $this->load->controller('common/header');
        $data['column_left'] = $this->load->controller('common/column_left');
        $data['footer'] = $this->load->controller('common/footer');

        $this->response->setOutput($this->load->view('total/total_discount.tpl', $data));
    }

    private function validate() {
        if (!$this->user->hasPermission('modify', 'total/total_discount')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }
return !$this->error;
    }
}
?>

admin>language/English/total/total_discount.php

<?php

// Heading
$_['heading_title']    = 'Percent Discount for Big Orders';

// Text
$_['text_edit']       = 'Edit';
$_['text_total']       = 'Order Totals';
$_['text_success']     = 'Success: You have modified Discount total!';
$_['text_each']        = 'Each';
$_['text_once']        = 'Once';

// Entry
$_['entry_count']      = 'Products Count:';
$_['entry_percent']    = 'Percent Discount:';
$_['entry_each']       = 'Discount:';
$_['entry_status']     = 'Status:';
$_['entry_sort_order'] = 'Sort Order:';


//help

$_['help_count']      = 'The products count the order must reach before the discount becomes active.';
$_['help_percent']      = 'of the cheapest product in the order.';
$_['help_each']      = 'for Each X products or just Once.';
// Error
$_['error_permission'] = 'Warning: You do not have permission to modify Discount total!';
?>

admin/view/template/total/total_discount.tpl

<?php echo $header; ?><?php echo $column_left; ?>
<div id="content">
  <div class="page-header">
    <div class="container-fluid">
      <div class="pull-right">
        <button type="submit" form="form-discount" data-toggle="tooltip" title="<?php echo $button_save; ?>" class="btn btn-primary"><i class="fa fa-save"></i></button>
        <a href="<?php echo $cancel; ?>" data-toggle="tooltip" title="<?php echo $button_cancel; ?>" class="btn btn-default"><i class="fa fa-reply"></i></a></div>
      <h1><?php echo $heading_title; ?></h1>
      <ul class="breadcrumb">
        <?php foreach ($breadcrumbs as $breadcrumb) { ?>
        <li><a href="<?php echo $breadcrumb['href']; ?>"><?php echo $breadcrumb['text']; ?></a></li>
        <?php } ?>
      </ul>
    </div>
  </div>
  <div class="container-fluid">
    <?php if ($error_warning) { ?>
    <div class="alert alert-danger"><i class="fa fa-exclamation-circle"></i> <?php echo $error_warning; ?>
      <button type="button" class="close" data-dismiss="alert">&times;</button>
    </div>
    <?php } ?>
    <div class="panel panel-default">
      <div class="panel-heading">
        <h3 class="panel-title"><i class="fa fa-pencil"></i> <?php echo $text_edit; ?></h3>
      </div>
      <div class="panel-body">
      <form action="<?php echo $action; ?>" method="post" enctype="multipart/form-data" id="form-discount" class="form-horizontal">

      <div class="form-group">
            <label class="col-sm-2 control-label" for="input-count"><span data-toggle="tooltip" title="<?php echo $help_count; ?>"><?php echo $entry_count; ?></span></label>
            <div class="col-sm-10">
            <input type="text" name="total_discount_count" value="<?php echo $total_discount_count; ?>" placeholder="<?php echo $entry_count; ?>"  id="input-count" class="form-control" />
            </div>
          </div>

            <div class="form-group">
            <label class="col-sm-2 control-label" for="input-percent"><span data-toggle="tooltip" title="<?php echo $help_percent; ?>"><?php echo $entry_percent; ?>&nbsp;<b>%</b></span></label>
            <div class="col-sm-10">
            <input type="text" name="total_discount_percent" value="<?php echo $total_discount_percent; ?>" placeholder="<?php echo $entry_percent; ?>"  id="input-percent" class="form-control" />
            </div>
          </div>

          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-each"><span data-toggle="tooltip" title="<?php echo $help_each; ?>"><?php echo $entry_each; ?></span></label>
            <div class="col-sm-10">
              <select name="total_discount_each_count" id="input-each" class="form-control">
              <?php if ($total_discount_each_count) { ?>
                <option value="1" selected="selected"><?php echo $text_each; ?></option>
                <option value="0"><?php echo $text_once; ?>></option>
                <?php } else { ?>
                <option value="1"><?php echo $text_each; ?></option>
                <option value="0" selected="selected"><?php echo $text_once; ?></option>
                <?php } ?>
              </select>
            </div>
          </div>


     <div class="form-group">
            <label class="col-sm-2 control-label" for="input-status"><?php echo $entry_status; ?></label>
            <div class="col-sm-10">
              <select name="total_discount_status" id="input-status" class="form-control">
                   <?php if ($total_discount_status) { ?>
                <option value="1" selected="selected"><?php echo $text_enabled; ?></option>
                <option value="0"><?php echo $text_disabled; ?></option>
                <?php } else { ?>
                <option value="1"><?php echo $text_enabled; ?></option>
                <option value="0" selected="selected"><?php echo $text_disabled; ?></option>
                <?php } ?>
              </select>
            </div>
          </div>

          <div class="form-group">
            <label class="col-sm-2 control-label" for="input-sort-order"><?php echo $entry_sort_order; ?></label>
            <div class="col-sm-10">
            <input type="text" name="total_discount_sort_order" value="<?php echo $total_discount_count; ?>" placeholder="<?php echo $entry_sort_order; ?>"  id="input-sort-order" class="form-control" />
            </div>
          </div>
      </form>
      </div>
    </div>
  </div>
</div>
<?php echo $footer; ?>

catalog/language/english/total/total_discount.php

 <?php
$_['text_total_discount'] = 'Discount';
?>

catelog/model/total/total_discount.php

<?php

class ModelTotalTotalDiscount extends Model {
    public function getTotal(&$total_data, &$total, &$taxes) {
        $count = 0;
        $price = 0;
        $prices = array();

        foreach ($this->cart->getProducts() as $product) {
            $count += $product['quantity'];

            for ($i = 0; $i < $product['quantity']; $i++) {
                $prices[] = $product['price'];
            }
        }

        sort($prices);

        if ($count >= (int)$this->config->get('total_discount_count')) {
            if ($this->config->get('total_discount_each_count')) {
                $items_count = floor($count / (int)$this->config->get('total_discount_count'));

                for ($i = 0; $i < $items_count; $i++) {
                    $price += $prices[$i];
                }
            } else {
                $price += $prices[0];
            }

            $this->load->language('total/total_discount');

            $price *= (float)$this->config->get('total_discount_percent') / 100;

            $total_data[] = array(
                'code'       => 'total_discount',
                'title'      => $this->language->get('text_total_discount'),
                'text'       => $this->currency->format(-$price),
                'value'      => -$price,
                'sort_order' => $this->config->get('total_discount_sort_order')
            );

            $total -= $price;
        }
    }
}
?>

This is the intended behaviour - if you buy 3 products you get a %age off the cheapest one, so of course if you want the discount off two products you're going to have to buy 6. 这是预期的行为-如果您购买3种产品,您将获得最便宜产品的%age折扣,因此,当然,如果您想获得两种产品的折扣,则必须购买6。

But you want it so if you buy 3 or more products, you get the discount off each additional product? 但是您想要的是,如果您购买3个或更多产品,您可以从每增加一个产品中获得折扣吗? (eg if you buy 4, you get the discount applied to 2 of them, if you buy 5, the discount is applied to 3, etc. ?) (例如,如果您购买4,则将折扣应用于其中的2;如果您购买5,则将折扣应用于3,以此类推?)

If you're not familiar with coding, I wouldn't really recommend going messing with this (or definitely keep a backup before you do) but the modification I would make is in catalog/model/total/total_discount.php the last file you posted: 如果您不熟悉编码,我不建议您弄乱它(或者一定要先备份),但我要进行的修改是在catalog/model/total/total_discount.php ,最后一个文件发表:

Change the line 换线

$items_count = floor($count / (int)$this->config->get('total_discount_count'));

to

if ($count > (int)$this->config->get('total_discount_count')) {
    $items_count = $count - (int)$this->config->get('total_discount_count');
} else {
    $items_count = 0;
}

The result of this is that if you say 3 products for the discount count, the number of products the discount is applied to will be the number of products in the cart minus 3. (ie 4th, 5th, 6th etc. will have discount applied) 这样的结果是,如果您说3件商品作为折扣计数,则折扣应用到的商品数将是购物车中商品的数量减去3。(例如,第4、5、6等)将应用折扣)

EDIT 编辑

Just reread your question and I now understand you want the discount applied to the entire order if at least X products are ordered? 只需重新阅读您的问题,我现在了解到,如果您至少订购了X件产品,您想将折扣应用于整个订单吗?

If so, then change the same line above to 如果是这样,则将上面的同一行更改为

if ($count >= (int)$this->config->get('total_discount_count')) {
    $items_count = $count;
} else {
    $items_count = 0;
}

Should achieve the desired effect. 应该达到预期的效果。 It won't affect postage, or any other additional charges though. 但这不会影响邮资或其他任何额外费用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM