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

Главные вкладки

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

Брал решение здесь:
http://www.drupal.ru/node/16161

Проблему там описал, здесь повторю (может на форуме быстрее кто то ответит)

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

Комментарии

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

разобрасля в чем проблема. В модуле используется запись в таблицу функцией друпала drupal_write_record
Вот она, по всей видимости рубит десятичные. Создал в модуле прямую запись в БД - записывается дробная часть без проблем. В друпале не профессионал. Хотел спросить - запись корректная для друпала?

$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']
     
    );
Аватар пользователя fil.diesel fil.diesel 10 ноября 2015 в 11:48

Ерундой не занимайтесь... в bd ставите тип float...Далее в файле userpoints.install

 'points' => array(
        'description' => 'Points',
        'type' => 'int',
        'not null' => TRUE,
        'default' => 0,
      ),

меняете на

 'points' => array(
        'description' => 'Points',
        'type' => 'float',
        'precision' => 10,
        'scale' => 2,
        'not null' => TRUE,
        'default' => 0.00,
      ),

аналогично и для max_points. Чистим кэш и наслаждаемся))
А если таблица с данными еще не заполнена заменяем приложенный в атаече userpoints.install и перестанавливаем модуль.. только заведомо нужно его удалить))

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

fil.diesel wrote:
Ерундой не занимайтесь... в bd ставите тип float...Далее в файле userpoints.install

А при чем здесь правка типа в БД? да еще и 'not null' => TRUE,? Это к чему для решения задачи? Если вы не заметили - то типы строк правятся первым делом, но при этом в журнале будет все так же установлено значение целых чисел. Проблема была описана полностью. Прежде чем давать свои советы - потрудитесь вникнуть в проблему. Ерунда - это ваш совет. Для работы я написал что нужно делать. Запрос к БД правильный. А это можно сделать только правя файл самого модуля.

Аватар пользователя Frantsuzzz Frantsuzzz 30 сентября 2020 в 10:36

Все правильно вам посоветовали. drupal_write_record для записи использует данные о структуре таблицы из hook_schema(). Если вы изменили тип колонки в phpmyadmin, то еще необходимо изменить данные в hook_schema. Для этого есть hook_schema_alter.