Как "криво" да премахнете показването на цента от цената в Magento, или няколко думи за заместване на стандартните класове

Искам да споделя работещо (макар и, разбира се, донякъде криво) решение, ако е необходимо, да премахна показването на копейки в цените. Още веднъж, той само променя формата на показване, реалните цени не се променят и това не се закръглява - десетите просто се изхвърлят, така че е напълно възможно видимата сума на стойностите на стоките в кошницата да се различава от реалната сума, ако съберете всичко в колона. Това може да бъде избегнато чрез контролиране на липсата на копейки в цените на стоките по време на вноса или ръчни промени в цените.

Трябва да кажа веднага, че всъщност решението не е мое, шпионирах го тук и реших да го съставя правилно.

Когато разработвах интерфейса си за онлайн магазин, бях изправен пред задачата не само да направя правилния дизайн и логика, но и да осигуря безпроблемно надграждане на двигателя до следващите версии, така че изключих редактирането на системните файлове веднага. Въпреки това, Magento предоставя отлични инструменти за разработване на собствени разширения, включително възможността да замените стандартната функционалност със своя собствена. Това ще направим.

И така, трябва да направим следното:
- замени класа, отговорен за показване на форматираната цена;
- създайте модул, който ще съдържа този клас;
- конфигурирайте модула така, че да бъде извикан замененият клас в случаите, в които първоначалният клас е бил активиран преди това;
- активиране на нов модул в системата.

Всички дадени пътища са спрямо директорията, в която е инсталиран Magento.

Както казах, Magento предоставя добри възможности за разработване на собствени модули и разширяване на основната функционалност. Основната част от работния код на системата (с изключение на библиотеки и рамки, въз основа на които е написана) се намира в директорията ап. Ако погледнем вътре, виждаме следното съдържание:

Mage.php - модул, описващ основния клас-център на системата - Mage
код - всички кодове
дизайн - както подсказва името, тук са разположени описанията на дизайна - точно логиката и шаблоните за извеждане на блокове; описанията на директно css-стилове, скриптове и картинки се преместват на отделно място
и т.н. конфигурационни файлове -
локал - файлове с основен език или, с други думи, локализация на изхода; за конкретен интерфейс, локализираният изход може също да бъде частично или напълно предефиниран в описанията на собствения интерфейс в поддиректориите на дизайна.

За тази задача се интересуваме от директорията код. В него виждаме три стандартни папки: ядро - съдържа кода на основните модули на системата, както и общност и местни, които първоначално са празни и са предназначени за инсталиране на модули на трети страни (общност) или за разработени самостоятелно (локално). Всъщност няма разлики между папките, но за удобство ще поставим нашите собствени модули в локалната папка.

И така, първо трябва да създадем папка, която да съдържа нашите модули. Името на тази папка ще бъде името на пакета модули, които ще разработим. Защото Разработих модули за моя проект, моята папка е кръстена след проекта - Cifrum.

% pwd
// приложение/код
% ll -a
общо 10
drwxrwxr-x 5 vlad www 512 18 април 09:37 .
drwxrwxr-x 6 vlad www 512 29 април 19:30 .
drwxrwxr-x 3 vlad www 512 29 април 19:30 общност
drwxrwxr-x 4 vlad www 512 18 април 09:37 ядро
drwxrwxr-x 3 vlad www 512 27 април 02:37 местно
% ll - местен
общо 6
drwxrwxr-x 3 vlad www 512 27 април 02:37 .
drwxrwxr-x 5 vlad www 512 18 април 09:37 .
drwxrwxr-x 6 vlad www 512 29 април 23:48 Cifrum

След това трябва да създадете директория, в която ще се намира модулът, един от класовете, в който ще внедрим необходимата функционалност. Извиква се стандартният модул, отговорен за форматирането на цените Ядро, така че аз кръстих моята CoreC.

Създайте следната структура на директорията:

% ll -1aR // app/code/local/
.
.
Cifrum

// app/code/local/Cifrum/CoreC:
.
.
Блок
Помощник
Модел
контролери
и т.н.
кв

Списъкът с папки в края е стандартната структура на модула. Няма да навлизам в подробности тук за описанието, ако е необходимо, можете да прочетете книгата php | Ръководство на архитекта за програмиране с Magento.

В този случай ще ни интересуват две директории - това е etc, в което ще поставим файла config.xml и Model, където ще се намира описанието на нашия клас.

Нека създадем файл Model/Store.php със следното съдържание:

Опитва се да пренапише Core_Model_Store

// Ние описваме нов клас, който наследява стандартния клас, който контролира работата с цените
// app/code/core/Mage/Core/Model/Store.php

клас Cifrum_CoreC_Model_Store разширява Mage_Core_Model_Store

/ **
*
* formatЦена без десетични знаци, само за рубли в момента
*
* /

// Заменете функцията, която форматира изхода

public function formatPrice ($ price, $ includeContainer = true)
<
if ($ this -> getCurrentCurrency ()) <
$ priceReturn = $ this -> getCurrentCurrency () -> format ($ price, array (), $ includeContainer);

// Не най-чистият метод, но най-бързият засега ...
if (preg_match ('/ rub/i', $ priceReturn)) return $ this -> getCurrentCurrency () -> format ($ price, array ('precision' => 0), $ includeContainer);
> друго <
return $ priceReturn;
>
>

* Този изходен код беше подчертан с Highlighter на изходния код .

Както можете да видите, ние вземаме кода на стандартната функция Mage_Core_Model_Store: formatPrice () и добавяме проверката за появата на подниза "rub" в низа. Не съм сигурен дали ще работи за всички локали (може би само "p" се появява някъде), но за мен работи.

Сега трябва да уточним какво точно трябва да се направи с класа, който сме създали. За да направите това, създайте etc/config.xml и го попълнете със следното:

* Този изходен код е подчертан с Highlighter на изходния код .

Това обаче не е всичко. Трябва да кажем на системата, че имаме нов модул, да го активираме.
Както си спомняте, системните конфигурации са в приложение/код/​​и т.н.. Създайте и отворете файла app/etc/modules/Cifrum_All.xml, който в моя случай съдържа описание на всички модули на пакета Cifrum.

* Този изходен код е подчертан с Highlighter на изходния код .

Това всъщност е всичко. Чрез опресняване на страницата на магазина ще видим, че десети рубли са изчезнали.