خیریه
خیریه

تبلیغات

تابحال شده، به یک باگ یا مشکل در برنامه‏ای بر بخورید که تنها برای شما یا شرایط شما باگ باشد نه سایر استفاده کنندگان آن برنامه؟ اگر برای شما پیش نیامده، برای من خیلی پیش آمده است؛ نمونه اش هم در این هفته پیش آمد. یکی از مواردی که در فروشگاه ساز مجنتو وجود دارد این است که، نمی توانید محصولی با قیمت بیش از ۱۰۰,۰۰۰,۰۰۰ واحد پولی تعریف کنید.

اگر این واحد پولی را ریال در نظر بگیرید، مبلغ ۱۰ میلیون تومان برای وسایل بزرگ امکان پذیر است؛ حتماً می گویید که از واحد تومان استفاده کنیم؟! بله می شود، ولی باز هم محدودیت ۱۰۰ میلیون تومان وجود دارد!

شاید فکر کنید که این قیمت در یک فروشگاه اینترنتی خیلی عجیب است؟! بله همینطور است؛ من هم همین فکر را میکردم. ولی یکی از مشتریان میخواست که بتواند این مبالغ را در فروشگاهش داشته باشد. حالا بگذریم از دلایل این موضوع که نرخ برابری واحد پول ما(ريال) در برابر پولهای دیگر خیلی بچشم می‏آید. با توجه به اینکه در یک فروشگاه اینترنتی خارجی مبالغ بیش از صد میلیون دلار(به ریال: سیصدوسی میلیارد تومان!) مبادله نمی شود، ولی امکان دارد جمع مبالغ یک فاکتور به این حد برسد! حالا از این جزئیات که بگذریم به رفع مشکل میرسیم.

یک مورد معمول، برای سوالاتی که در مجنتو پیش می آید، جستجو در اینترنت(غیر فارسی) است. ولی وقتی این مشکل خاص شما و واحد پولی‏تان باشد چه؟ به نتیجه ای نخواهید رسید و باید خودتان دست بکار شوید.

مشکل: افزایش تعداد ارقام مبالغ در مجنتو یا رفع محدودیت قیمت در مجنتو.

راه حل: همیشه قبل از راه‏حل‏های برنامه نویسی، مطمئن شوید که جداول دیتابیس قادر به نگهداری دیتای موردنظر هستند یا خیر. با توجه به جداول ذخیره سازی قیمت ها در مجنتو به این نتیجه رسیدم که مبالغ بیش از ۹۹,۹۹۹,۹۹۹ را نمیتوان ذخیره سازی کرد.(محدودیت مقادیر decimal)

پس اولین مورد افزایش فضای ذخیره سازی در دیتابیس مجنتو است. فکر می کنید که مشکل حل شده؟ خیر تازه اول مشکلات است. تعداد جداولی که باید بررسی و تصحیح شوند خیلی زیاد است. دو راه پیشرو داریم: یکی تغییر تک تک فیلدها و دیگری استفاده از یک ساختار مناسب جهت تغییر اتوماتیک فیلدهای دیتابیس.

ابتدا لیست جداولی که باید تغییر کنند را از نمودار پایگاه داده مجنتو(magento database diagram) بدست می آوریم.

دانلود نمودار پایگاه داده مجنتو(magento database diagram)

دیتابیس دیاگرام مجنتو

شما باید جداول ناحیه های مشخص شده‏ی Product، EAV و Sales را بررسی و مقادیر decimal(12,4) را به decimal(24,4) تغییر دهید. بطور دقیقتر جداول Entity، Entity Detail را بررسی و تغییر دهید.

در کل حدود ۲۱۰ فیلد از دیتابیس باید تغییر کنند و اکثر آنها کلماتی مثل price، amount، discount و tax را در نام خود دارند. مقادیر مربوط به موجودی یا qty را لازم نیست تغییر دهید.

اگر تنها جمع فاکتور و سفارشهایتان به این رقم می رسد باید جداول بخش Sales را بروز کنید.

راه حل اتوماتیک برای تغییر نوع فیلدهای دیتابیس:

اگر دیتابیس شما SQL SERVER باشد:


declare @schema nvarchar(255)
declare @table nvarchar(255)
declare @col nvarchar(255)
declare @dtype nvarchar(255)
declare @sql nvarchar(max)
declare maxcols cursor for
select
c.TABLE_SCHEMA,
c.TABLE_NAME,
c.COLUMN_NAME,
c.DATA_TYPE
from
INFORMATION_SCHEMA.COLUMNS c
inner join INFORMATION_SCHEMA.TABLES t on
c.TABLE_CATALOG = t.TABLE_CATALOG
and c.TABLE_SCHEMA = t.TABLE_SCHEMA
and c.TABLE_NAME = t.TABLE_NAME
and t.TABLE_TYPE = 'BASE TABLE'
where
c.DATA_TYPE like 'decimal%'
and c.CHARACTER_MAXIMUM_LENGTH = -1
open maxcols
fetch next from maxcols into @schema, @table, @col, @dtype
while @@FETCH_STATUS = 0
begin
set @sql = 'alter table [' + @schema + '].[' + @table +
'] alter column [' + @col + '] ' + @dtype + '(24,4)'
exec sp_executesql @sql
fetch next from maxcols into @schema, @table, @col, @dtype
end
close maxcols
deallocate maxcols

روش مورد استفاده در php هم که ساده است، باید تمامی جداول دیتابیس را گرفته و در یک حلقه، فیلدهای موردنظر را تغییر نوع دهید. ابتدا با این query تمامی جداول و فیلدهای مورد نظر را گرفته و با دستور ALTER آنها را تغییر دهید.


SELECT TABLE_NAME,COLUMN_NAME, COLUMN_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_type LIKE 'decimal%'
AND TABLE_SCHEMA = 'magento_database_name'

راه دیگر نوشتن یک procedure در mysql است که مانند SQL SERVER تغییرات لازم را بدهد.

تنها کار باقی مانده این است که محدودیت تعداد ارقام را در مجنتو تغییر داده تا دیتای مورد نظر بدرستی ذخیره شوند. برای اینکار لازم است فایل Data.php را در مسیر app/code/core/Mage/Sales/Helper/Data.php باز کرده و مقدار ثابت MAXIMUM_AVAILABLE_NUMBER را از ۹۹۹۹۹۹۹۹ به ۹۹۹۹۹۹۹۹۹۹۹۹ تغییر دهید.

حال میتوانید مقادیر بیش از ۱۰۰ میلیون ریال را نیز پشتیبانی کنید.

«برای اطلاع از بروزرسانی ها و مطالب جدید در کانال ما عضو شوید»