Як «криво» прибрати відображення копійок з ціни в Magento, або кілька слів про перевизначення

Хочу поділитися працюючим (хоча, звичайно, дещо кривуватим) рішенням за необхідності прибрати відображення копійок у цінах. Ще раз повторюся, змінює лише формат відображення, реальні ціни не змінюються, і це не округлення — десяті частини просто відкидаються, тому цілком можливий варіант, за якого видима сума вартості товарів у кошику відрізнятиметься від реальної суми, якщо скласти все стовпчиком. Уникнути цього можна — контролюючи відсутність копійок у цінах товарів під час імпорту чи ручної зміни ціни.

Відразу скажу, що фактично рішення не моє, я підглянув його тут і вирішив правильно оформити.

При розробці свого інтерфейсу інтернет-магазину переді мною стояло завдання не тільки зробити правильний дизайн і логіку, але й забезпечити безпроблемне оновлення движка до наступних версій, тому редагування системних файлів я виключив відразу. Однак Magento надає відмінні кошти для розробки власних розширень, зокрема можливість заміни стандартного функціоналу на власний. Цим ми й займемося.

Отже, нам необхідно зробити таке: - перевизначити клас, який відповідає за виведення форматованої ціни; — створити модуль, який цей клас міститиме; - налаштувати модуль так, щоб перевизначений клас викликався у випадках, при яких раніше активувався оригінальний клас; - активувати новий модуль у системі.

Всі наведені шляхи відносні до директорії, в яку встановлений Magento.

Як я вже говорив, Magento представляє хороші можливості для розробки власних модулів та розширення базового функціоналу. Основна частина робочого коду системи(за винятком бібліотек та фреймворків, на основі яких він написаний) розташована в директоріїapp. Якщо ми заглянемо всередину, то побачимо там такий вміст:

Mage.php- модуль, що описує основний клас-хаб системи - Magecode- весь кодdesign- як видно з назви, тут розташовуються описи дизайну - саме логіка та шаблони виведення блоків; описи безпосередньо css-стилів, скрипти та картинки винесені в окреме місцеetc- конфігураційні файлиlocale- базові мовні файли, або, іншими словами, локалізація виводу; під конкретний інтерфейс локалізований висновок може бути частково чи повністю перевизначений в описах власного інтерфейсу в піддиректоріях design.

Для цього нас цікавить директоріяcode. У ній ми бачимо три стандартні папки:core— містить код основних модулів системи, а такожcommunityтаlocal, які спочатку порожні і призначені для встановлення сторонніх модулів (Community) або розроблених самостійно (local). Насправді різниці між папками ніяких немає, але для зручності власні модулі складатимемо в папку local.

Отже, для початку нам потрібно створити папку, яка міститиме наші модулі. Назва цієї папки буде назвою пакета (package) модулів, які ми розробимо. Т.к. я розробляв модулі під свій проект, у мене папка носить ім'я проекту — Cifrum.

%pwd //app/code %ll -a total 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 community drwxrwxr-x 4 vlad www 512 18 квіт 17 4>drwxrwxr-x 3 vlad www 512 27 кві 02:37 local %l -a local total 6 drwxrwxr-x 3 vladwww 512 27 кві 02:37 . drwxrwxr-x 5 vlad www 512 18 кві 09:37 .. drwxrwxr-x 6 vlad www 512 29 кві 23:48 Cifrum

Далі необхідно створити директорію, в якій буде модуль, одним із класів якого ми і будемо реалізовувати необхідну функціональність. Стандартний модуль, який відповідає за форматування ціни, називаєтьсяCore, тому я назвав свійCoreC.

Створіть таку структуру директорій:

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

//app/code/local/Cifrum/CoreC: . .. Block Helper Model controllers etc sql

Наведений наприкінці список папок – стандартна структура модуля. Я не буду тут детально зупинятися на описі, якщо необхідно, ви можете ознайомитися з книгою phparchitect's Guide to Programming with Magento.

В даному випадку нас будуть цікавити дві директорії - це etc, в якій ми розташуємо файл config.xml, і Model, де і розташовуватиметься опис нашого класу.

Давайте створимо файл Model/Store.php з таким вмістом:

Trying to rewrite Core_Model_Store

// Описуємо новий клас, що успадковує стандартний клас, що контролює роботу з ціною // app/code/core/Mage/Core/Model/Store.php

class Cifrum_CoreC_Model_Store extends Mage_Core_Model_Store

/** * * formatPrice bez decimals, для rubls тільки для правого дня * */

// Перевизначаємо функцію, що форматує висновок

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

//Не cleanest method but the fastest for now... if (preg_match( '/руб/i' ,$priceReturn)) return $ this ->getCurrentCurrency()->format($price, array( 'precision' => 0), $includeContainer); > else < return $priceReturn; > >

* Цей source code був highlighted with Source Code Highlighter.

Як видно, ми беремо код стандартної функції Mage_Core_Model_Store::formatPrice() і дописуємо перевірку на входження в рядок підрядки "руб". Не впевнений, що працюватиме на всіх локалях (може бути, десь фігурує просто "р"), однак у мене працює.

Тепер нам необхідно вказати, що саме потрібно робити зі створеним нами класом. Для цього створюємо etc/config.xml та наповнюємо його наступним:

* Цей source code був highlighted with Source Code Highlighter.

Однак, це не все. Нам потрібно вказати системі, що ми маємо новий модуль, активувати його. Як ви пам'ятаєте, системні конфіги лежать уapp/code/etc. Створюємо та відкриваємо файл app/etc/modules/Cifrum_All.xml, який у моєму випадку містить опис усіх модулів пакета Cifrum.

* Цей source code був highlighted with Source Code Highlighter.

На цьому, власне, все. Поновивши сторінку магазину, ми побачимо, що десяті частини рублів зникли.