как выполняется расчет цены в opencart

#php #opencart

#php #opencart

Вопрос:

В open cart я создавал модуль, и мне нужно было знать, как выполняется расчет цен, и я наткнулся на этот код

 $price = $this->currency->format($this->tax->calculate($result['price'], 
        $result['tax_class_id'], $this->config->get('config_tax')));
if ((float)$result['special']) {
    $special = $this->currency->format($this->tax->calculate(
        $result['special'], 
        $result['tax_class_id'], $this->config->get('config_tax')));
} else {
    $special = false;
}                       
if ($this->config->get('config_tax')) {
    $tax = $this->currency->format((float)$result['special'] ? 
           $result['special'] : $result['price']);
} else {
    $tax = false;
}
  

На самом деле я не понял, что здесь происходит на самом деле, поскольку я вижу, что на самом деле нет разницы между $price и $special $tax и the и the, но должна быть причина, по которой это реализовано таким образом.

Я уверен, что мне здесь чего-то не хватает, кто-нибудь объяснит мне, как выполняется расчет цены в opencart?

Комментарии:

1. привет, мой вопрос не нуждается в доработке, поскольку на него нужен ответ, я действительно благодарен вам за доработку, но у кого-нибудь есть идея?

2. Я пересмотрел, потому что это было невозможно прочитать. Я думаю, что трудно ответить без контекста. Одно я могу сказать вам наверняка, поскольку я вижу тест с плавающей точкой if ((float)$result['special']) , это было написано неопытным программистом. Чтобы попытаться решить, вы должны увидеть, откуда берется этот результат [«специальный»], вывести значения и посмотреть на $this-> tax-> calculate method.

3. это написал не я, это часть исходного кода opencart, который я нашел, и я не могу понять, почему существует 3 переменные, в то время как я вижу, что они могут быть одной с общим значением, и почему $ special является float ?? у вас есть какие-нибудь идеи?

4. opencart основан на mvc, поэтому реализация этих функций находится в других файлах, которые не имеют отношения к моему модулю, и мне не нужно их редактировать, потому что я испорчу другие материалы, которые их используют

5. Я понимаю, что это часть opencart, и вы не можете изменять функции в других файлах, но вы должны взглянуть на них, чтобы понять. Также попробуйте распечатать значения и попытаться разобраться в них. Я не могу использовать только эти строки кода.

Ответ №1:

Из чтения исходного кода я понял следующее: $price , $special и $tax — это переменные, которые передаются в представление для отображения.

 $price = $this->currency->format($this->tax->calculate($result['price'], 
        $result['tax_class_id'], $this->config->get('config_tax')));
  

У каждого товара есть цена, поэтому $price она всегда установлена. $price это; базовая цена с применимыми налоговыми классами и применяемым налогом.

 if ((float)$result['special']) {
    $special = $this->currency->format($this->tax->calculate(
        $result['special'], 
        $result['tax_class_id'], $this->config->get('config_tax')));
} else {
    $special = false;
}                       
  

Товар может быть в специальном разделе. Если это так, то $special устанавливается базовая специальная цена с тем же набором налоговых расчетов, которые применяются к ней. (чтобы код просмотра мог отображать как оригинал, так и СПЕЦИАЛЬНОЕ! цена рядом)

 if ($this->config->get('config_tax')) {
    $tax = $this->currency->format((float)$result['special'] ? 
           $result['special'] : $result['price']);
} else {
    $tax = false;
}
  

Не во всех установках настроен налог. Если это так, то $tax устанавливается в качестве базовой или специальной базовой цены. (чтобы код просмотра мог отображать, сколько стоит товар до уплаты налогов. (немного нелогично, что $tax это цена без каких-либо налогов на нее)

Имеет смысл? Если вам нужно узнать больше о том, как рассчитывается цена, посмотрите более внимательно на tax->calculate() . В противном случае это

 $taxed_price = $special ? $special : $price; 
$untaxed_price = (float)$result['special'] ? $result['special'] : $result['price'];
  

Комментарии:

1. да, на самом деле, calculate получает только tax_id и запрашивает у базы данных применяемую ставку налога, и я думаю, что глупо, что необлагаемая налогом цена называется $ tax, вот почему я не смог этого понять

Ответ №2:

Просто краткое примечание к ответу мистера Трика. Тремя параметрами $this-> tax->calculate() являются

$value, $tax_class_id, $calculate = true

Третий из которых не является обязательным, но в исходном коде он получает глобальное конфигурационное значение того, следует ли применять налог (поскольку вы можете отключить его в настройках). Стоит также отметить, что объект tax менялся между версиями (я думаю, что последним он менялся в версии 1.5.1.2), поэтому, если вы хотите сделать его обратно совместимым, это стоит учитывать

Комментарии:

1. не хочу показаться грубым, но мне НАПЛЕВАТЬ НА ОБРАТНУЮ СОВМЕСТИМОСТЬ :), просто шучу, я поддержу это : p

2. Ха-ха, ну, если вы планируете его перепродавать, вам лучше всего быть готовым к совместимости как минимум с 1.4.9 🙂

3. на самом деле это уже продано клиенту (поэтому я делаю это как специальный модуль для его собственного opencart, нет необходимости в обратной настройке) 🙂