Pull to refresh

Как «криво» убрать отображение копеек из цены в Magento, или пара слов о переопределении стандартных классов

Reading time5 min
Views4.3K
Хочу поделиться работающим (хотя, конечно, несколько кривоватым) решением при необходимости убрать отображение копеек в ценах. Еще раз повторюсь, изменяет только формат отображения, реальные цены не меняются, и это не округление — десятые части просто отбрасываются, поэтому вполне возможен вариант, при котором видимая сумма стоимостей товаров в корзине будет отличаться от реальной суммы, если сложить все столбиком. Избежать этого можно — контролируя отсутствие копеек в ценах товаров при импорте или ручном изменении цены.

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

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

Итак, нам необходимо сделать следующее:
— переопределить класс, отвечающий за вывод форматированной цены;
— создать модуль, который будет этот класс содержать;
— сконфигурировать модуль так, чтобы переопределенный класс вызывался в случаях, при которых ранее активировался оригинальный класс;
— активировать новый модуль в системе.

Все приведенные пути относительны директории, в которую установлен Magento.

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

app
|----- Mage.php
|----- code
|----- design
|----- etc
|----- locale

Mage.php — модуль, описывающий основной класс-хаб системы — Mage
code — весь код
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 апр 09:37 core
drwxrwxr-x 3 vlad www 512 27 апр 02:37 local
%ll -a local
total 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


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

Создайте следующую структуру директорий:

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

//app/code/local/Cifrum:
.
..
CoreC

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


Приведенный в конце список папок - стандартная структура модуля. Я не буду здесь подробно останавливаться на описании, если необходимо, вы можете ознакомиться с книгой php|architect's Guide to Programming with Magento.

В данном случае нас будут интересовать две директории - это etc, в которой мы расположим файл config.xml, и Model, где и будет располагаться описание нашего класса.

Давайте создадим файл Model/Store.php со следующим содержимым:

<?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 without decimals, for rubles only for right now
 *
 */

 // Переопределяем функцию, форматирующую вывод

 public function formatPrice($price, $includeContainer = true)
 {
  if($this->getCurrentCurrency()) {
   $priceReturn = $this->getCurrentCurrency()->format($price, array(), $includeContainer);
    
   //Not the cleanest method but the fastest for now…
   if(preg_match('/руб/i', $priceReturn)) {
    return $this->getCurrentCurrency()->format($price, array('precision' => 0), $includeContainer);
   } else {
    return $priceReturn;
   }
  }

  return $price;
 }
  
}

* This source code was highlighted with Source Code Highlighter.


?>


Как видно, мы берем код стандартной фукнции Mage_Core_Model_Store::formatPrice() и дописываем проверку на вхождение в строку подстроки "руб". Не уверен, что будет работать на всех локалях (быть может, где-то фигурирует просто "р"), однако у меня работает.

Теперь нам необходимо указать, что же именно нужно делать с созданным нами классом. Для этого создаем etc/config.xml и наполняем его следующим:

<?xml version="1.0"?>
<config>
 <modules>

  
  <Cifrum_CoreC>
   <version>0.0.1</version>
   <depends>
    
   </depends>
  </Cifrum_CoreC>
  

 </modules>
 <global>
  <models>

   
   
   <core>
  <rewrite>
   <store>Cifrum_CoreC_Model_Store</store>
  </rewrite>
   </core>
   

  </models>
  <resources></resources>
   <blocks></blocks>
  <corec>
   
  </corec>
 </global>
 <adminhtml>
  <menu></menu>
  <acl></acl>
  <events></events>
  <translate></translate>
 </adminhtml>
 <frontend>
  <routers></routers>
  <events></events>
  <translate></translate>
  <layout></layout>
 </frontend>
 <default>
  <config_vars>
   
  </config_vars>
 </default>
</config>


* This source code was highlighted with Source Code Highlighter.



Опять-таки, структура файла стандартная, нам нужно не все. Важные моменты я выделил комментариями. Вначале описываем название и версию нашего модуля, а ниже переопределяем с помощью тега системный вызов класса store модуля core.

Однако это не все. Нам нужно указать системе, что у нас есть новый модуль, активировать его.
Как вы помните, системные конфиги лежат в app/code/etc. Создаем и открываем файл app/etc/modules/Cifrum_All.xml, который в моем случае содержит описание всех модулей пакета Cifrum.

<?xml version="1.0"?>
<config>
 <modules>
  <Cifrum_CoreC>
   <active>true</active>
   <codePool>local</codePool>
  </Cifrum_CoreC>
 </modules>
</config>

* This source code was highlighted with Source Code Highlighter.



На этом, собственно, все. Обновив страницу магазина, мы увидим, что десятые части рублей исчезли.

P.S. Если кто-то даст приглашение, то смогу отреагировать на возможные вопросы или уточнения.
P.P.S. Прошу прощения за дикую смесь русских и английских комментариев - русские добавил по ходу написания статьи, для себя писал английские.
Tags:
Hubs:
-1
Comments8

Articles