Не раз я слышал просьбу попросить Userpoints сделать очки дробными(в основном ради подсчета денег).
Собственно, решил рассказать, как это сделать для последней версии.
Для начала редактируем базу: сделаем очки дробными с 2 знаками после запятой:
CREATE TABLE `userpoints` (
`pid` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL default '0',
`points` decimal(10,2) NOT NULL default '0.00',
`max_points` decimal(10,2) NOT NULL default '0.00',
`last_update` int(11) NOT NULL default '0',
`tid` int(11) NOT NULL default '0',
PRIMARY KEY (`pid`),
KEY `last_update` (`last_update`),
KEY `uid_tid` (`uid`,`tid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
-- --------------------------------------------------------
--
-- Структура таблицы `userpoints_txn`
--
CREATE TABLE `userpoints_txn` (
`txn_id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL default '0',
`approver_uid` int(11) NOT NULL default '0',
`points` decimal(10,2) NOT NULL default '0.00',
`time_stamp` int(11) NOT NULL default '0',
`status` tinyint(4) NOT NULL default '0',
`description` text,
`reference` varchar(128) default NULL,
`expirydate` int(11) NOT NULL default '0',
`expired` tinyint(4) NOT NULL default '0',
`parent_txn_id` int(11) NOT NULL default '0',
`tid` int(11) NOT NULL default '0',
`entity_id` int(11) NOT NULL default '0',
`entity_type` varchar(32) default NULL,
`operation` varchar(32) default NULL,
PRIMARY KEY (`txn_id`),
KEY `operation` (`operation`),
KEY `reference` (`reference`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=65 ;
Дальше откроем userpoints.module и редактором стираем все (int)
После чего ищем редактором в этом же файле %d и заменяем на %f, где вставляются в базу дробные поинты.
Вуаля
Комментарии
начинающий
подскажите пожалуйста что за база. Конкретно - файл..?
в смысле?
открываешь базу через phpmyadmin и вноси изменения
спасибо
CREATE TABLE `userpoints_txn` (
`txn_id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL default '0',
`approver_uid` int(11) NOT NULL default '0',
`points` decimal(10,2) NOT NULL default '0.00',
`time_stamp` int(11) NOT NULL default '0',
`changed` int(11) NOT NULL default '0',
`status` tinyint(4) NOT NULL default '0',
`description` text,
`reference` varchar(128) default NULL,
`expirydate` int(11) NOT NULL default '0',
`expired` tinyint(4) NOT NULL default '0',
`parent_txn_id` int(11) NOT NULL default '0',
`tid` int(11) NOT NULL default '0',
`entity_id` int(11) NOT NULL default '0',
`entity_type` varchar(32) default NULL,
`operation` varchar(32) default NULL,
PRIMARY KEY (`txn_id`),
KEY `operation` (`operation`),
KEY `reference` (`reference`),
KEY `status` (`status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=65;
Вот так вот будет точнее, потому что в самом свежем модуле используется ещё и эта поле, которое выделено жирным.
egorovanton, Можно подробнее об этом поле , ведь по умолчанию оно именно так и выглядит . Да и зачем в нём что то менять `changed` отображает время последнего изменения/обновления транзакции/операции . ?
а какой нить патч или мод есть чтобы не править???
Все работает! Почти...
Не записываются правильно поинты в журнал. Отсекаются где то все данные после точки. ТО есть если было добавлено 0.50 поинтов, то в журнале записывается 0. Хотя общий подсчет верен. Уже весь файл просмотрел ни как не могу найти где же собака зарыта. В БД в userpoints_txn так же записываются данные без учета десятичных. То есть там записываются данные 0.00
Для полной поддержки дробных поинтов нужно еще изменить запрос к БД в фале модуля. заменить
на
(txn_id, uid, approver_uid, points, time_stamp, changed, status, description, reference, expirydate, expired, parent_txn_id, tid, entity_id, entity_type, operation)
VALUES (%d, %d, %d, %f, %d, %d, %d, '%s', %d, %d, %d, %d, %d, %d, '%s', '%s')",
$params['txn_id'],
$params['uid'],
$params['approver_uid'],
$params['points'],
$params['time_stamp'],
$params['changed'],
$params['status'],
$params['description'],
$params['reference'],
$params['expirydate'],
$params['expired'],
$params['parent_txn_id'],
$params['tid'],
$params['entity_id'],
$params['entity_type'],
$params['operation']
);
Актуально для 7