#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, нет необходимости в обратной настройке) 🙂