Userpoints: дробные поинты

Аватар пользователя Stalker-g2 Stalker-g2 21 июня 2008 в 20:34

Не раз я слышал просьбу попросить 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, где вставляются в базу дробные поинты.
Вуаля

источник

0 Thanks

Комментарии

Аватар пользователя egorovanton egorovanton 14 февраля 2010 в 21:25

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;

Вот так вот будет точнее, потому что в самом свежем модуле используется ещё и эта поле, которое выделено жирным.

Аватар пользователя partyzantm partyzantm 7 мая 2011 в 18:40

egorovanton, Можно подробнее об этом поле , ведь по умолчанию оно именно так и выглядит . Да и зачем в нём что то менять `changed` отображает время последнего изменения/обновления транзакции/операции . ?

Аватар пользователя t-m-p t-m-p 3 февраля 2013 в 17:29

Все работает! Почти...
Не записываются правильно поинты в журнал. Отсекаются где то все данные после точки. ТО есть если было добавлено 0.50 поинтов, то в журнале записывается 0. Хотя общий подсчет верен. Уже весь файл просмотрел ни как не могу найти где же собака зарыта. В БД в userpoints_txn так же записываются данные без учета десятичных. То есть там записываются данные 0.00

Аватар пользователя t-m-p t-m-p 3 февраля 2013 в 20:34

Для полной поддержки дробных поинтов нужно еще изменить запрос к БД в фале модуля. заменить

$ret = drupal_write_record('userpoints_txn', $params);

на

$ret = db_query ("INSERT INTO {userpoints_txn}
      (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']
     
    );