Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Page 1 of 3
Как убрать отображение копеек из цены - кривое решение
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 

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

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

При разработке своего интерфейса интернет-магазина передо мной стояла задача не только сделать правильный дизайн и логику, но и обеспечить беспроблемное обновление движка до следующих версий, поэтому редактирование системных файлов я исключил сразу же. Однако 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.

 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 

# pwd
/<Path To Magento>/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 /<Path To Magento>/app/code/local/
.
..
Cifrum

/<Path To Magento>/app/code/local/Cifrum:
.
..
CoreC

/<Path To Magento>/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
  

    
}

?>
 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 

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

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

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

    <!-- 
Описание Ð½Ð°ÑˆÐµÐ³Ð¾ Ð¼Ð¾Ð´ÑƒÐ»Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸ÐµÐ²ÐµÑ€ÑÐ¸ÑÐ·Ð°Ð²Ð¸ÑÐ¸Ð¼Ð¾ÑÑ‚и -->
    <
Cifrum_CoreC>
      <
version>0.0.1</version>
      <
depends>
        <!-- 
no dependencies -->
      </
depends>
    </
Cifrum_CoreC>
    <!-- -->

  </
modules>
  <global>
    <
models>

      <!-- 
а Ð²Ð¾Ñ‚ Ð·Ð´ÐµÑÑŒ Ð¼Ñ‹ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÑÐµÐ¼ -->
      <!-- 
стандартный ÐºÐ»Ð°ÑÑ Ð½Ð° Ð½Ð°Ñˆ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñ‚эга <rewrite> -->
      <
core>
    <
rewrite>
      <
store>Cifrum_CoreC_Model_Store</store>
    </
rewrite>
      </
core>
      <!-- -->

    </
models>
    <
resources></resources>
      <
blocks></blocks>
    <
corec>
      <!-- 
config values -->
    </
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 values -->
    </
config_vars>
  </default>
</
config>

Опять-таки, структура файла стандартная, нам нужно не все. Важные моменты я выделил комментариями. Вначале описываем название и версию нашего модуля, а ниже переопределяем с помощью тега <rewrite> системный вызов класса 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>

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

Если есть вопросы или уточнения - пишите, с удовольствием пообщаюсь.

P.P.S. Прошу прощения за дикую смесь русских и английских комментариев - русские добавил по ходу написания статьи, для себя писал английские.
P.P.S. Блин, более неудобный форум редко встретишь.

 
Magento Community Magento Community
Magento Community
Magento Community
 
udgeen69
Jr. Member
 
Total Posts:  28
Joined:  2009-03-14
 

очень кривое решение. smile Есть в магенте xml файл локальных настроек валюты. Ð’ ней указывается точность цифры после запятой…
заменяете precision=2 на precision=0 и усе…

 
Magento Community Magento Community
Magento Community
Magento Community
 
sprinnet
Sr. Member
 
Avatar
Total Posts:  140
Joined:  2009-01-12
Prague, Czech Republic
 

А где лежит этот чудесный файл?

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

Может это поможет?
http://www.magentocommerce.com/boards/viewthread/32663/

 
Magento Community Magento Community
Magento Community
Magento Community
 
juvefan_vlz
Member
 
Total Posts:  32
Joined:  2008-11-03
 
udgeen69 - 09 May 2009 07:59 AM

очень кривое решение. smile Есть в магенте xml файл локальных настроек валюты. Ð’ ней указывается точность цифры после запятой…
заменяете precision=2 на precision=0 и усе…

Total Commander файлов, с таким текстом не нашёл.

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

Смотрите выше

 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 
udgeen69 - 09 May 2009 07:59 AM

очень кривое решение. smile Есть в магенте xml файл локальных настроек валюты. Ð’ ней указывается точность цифры после запятой…
заменяете precision=2 на precision=0 и усе…

Я, наверное, дурак, но ни одного xml’я не нашел с упоминанием слова precision. Подскажете, где именно лежит чудесный файлик с локальными настройками валюты? Если речь идет о локалях Zend (<magento root>/lib/Zend/Data/Locale/<locale>.xml, то файлики пустые. Посмотрю, можно ли решить эту проблему так - если можно, то будет отлично, хотя и не решает одну из поставленых задач - независимость от обновлений версий. При upgrade необходимо будет помнить, что нужно отредактировать файл.
Если же файл действительно локальный - т.е. лежащий где-то внутри шаблона - буду благодарен за подсказку с местонахождением, т.к., как я уже сказал, ни одного xml со словом precision в текстах нет.

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

Возможно вы имели ввиду local.php?

 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 
alesto - 16 May 2009 02:08 AM

Возможно вы имели ввиду local.php?

Вопроса не понял… local.php - что за файл? Где лежит?

Вообще, одна из основных задач, которую я всегда стараюсь решать с самого начала - это отсутствие хаков оригинального кода, иначе при upgrade версии можно убиться восстанавливать все хаки. Именно поэтому решал так, как описал - через переопределение класса, который выводит цены. Если то же самое можно решить путем правки настроек в конфигурационных файлах (в xml-файлах, которые можно вывести в описание собственного шаблона), то это идеально. Если же нужно править код базовых классов, то это неправильное решение.

Вообще, если почитать то, что находится по ссылке, что Вы привели выше, то там один из разработчиков - Dmitriy - как раз советует переопределить Mage_Core_Model_Store, если необходима особая логика (отличающаяся от локалей Zend). Как Zend работает с локалями, я не разбирался, если честно.

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

Напишу второй раз специално для вас smile

http://www.magentocommerce.com/boards/viewthread/32663/

 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 
alesto - 16 May 2009 08:05 AM

Напишу второй раз специално для вас smile

http://www.magentocommerce.com/boards/viewthread/32663/

А мы точно читаем один текст и делаем это одинаково? И понимаем одинаково? Давайте я попробую описать то, что именно я прочитал в посте, который Вы привели.

Первый автор, quanza, пишет, что он пытается разобраться, почему точность округления валют не меняется при изменении локали, и считает, что нашел причину. Далее следует описание причины - из-за того, что в функцию, которая форматирует вывод в валюте передается пустой массив, а в определении параметра-массива по умолчанию $_options присутствует инициализация поля precision цифрой 2, которая определяет количество знаков после запятой в валюте. Так же он сообщает, что не смог найти место, где и когда подгружаются параметры локали. Так же он говорит, что это начало, и если необходимо, то можно быстро решить проблему с количеством нулей, изменив содержимое функции formatPrice() в классе Mage_Core_Model_Store.
Далее он замечает, что изменение этой функции никак не влияет на админку, т.к. там есть собственная реализация функции форматирования цены.

Dmitriy, член команды разработчиков, отвечает, что они по-умолчанию используют установки локали Zend и замечает, что если необходимо как-то изменить этот механизм, то можно создать собственный модуль и переписать модель Mage_Core_Model_Store. В этом случае необходимо переопределить функции formatPrice() и, возможно, roundPrice(), и реализовать там собственную логику.
Так же он утверждает, что они [разработчики, насколько я понимаю] ищут способ реализовать это в базовом коде.

Далее quanza выводит несколько общего плана фраз о текущем механизме работы с локалью, которые не имеют для решения задачи практического значения.

Собственно, это все. Подскажите, пожалуйста, что я из приведенного поста упустил? В своем решении я реализовал рекомендацию Dmitriy - описал новый класс, являющийся наследником класса Mage_Core_Model_Store, в котором немного изменил логику функции formatPrice(). Если это можно сделать проще, то буду рад, если Вы подскажете конкретные способы. Безусловно, можно было просто отредактировать сам класс Mage_Core_Model_Store, но это означало бы, что при обновлении кода магазина все изменения потерялись бы, что для меня лично недопустимо.

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

А вы пробывали менять значение в файле local.php ?

 
Magento Community Magento Community
Magento Community
Magento Community
 
heathen
Sr. Member
 
Avatar
Total Posts:  100
Joined:  2009-04-07
 
alesto - 16 May 2009 12:18 PM

А вы пробывали менять значение в файле local.php ?

А где находится этот славный файл? Я не вижу такого. :(

 
Magento Community Magento Community
Magento Community
Magento Community
 
alesto
Guru
 
Total Posts:  624
Joined:  2009-03-21
 

попробуйте lib/zend/currency.php

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top
Page 1 of 3