Подвох в модуле uc_price_per_role

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

Аватар пользователя Mirocow Mirocow 31 мая 2010 в 21:51

Есть такой замечательный модуль uc_price_per_role, и всем он был бы хорош если только не один маленький нюанс.
Как то мне пришлось делать магазин и надо было назначить для определенных ролей свою цену на товар. Была создана роль Оптовик и для этой роли для определенных товаров была выставлена оптовая цена. Я про этот модуль почти уже забыл но тут, как всегда в самый не подходящий момент всплыл глюк, а может и фича этого модуля. Дело в том что если установлена роль, а для нее цена не задана то ставится именно цена назначенная для этой роли, те 0.
В общем как всегда напильник помог.

Начинаю разбираться, что не так. В модуле uc_price_per_role.module есть функция uc_price_per_role_find_price, отвечающая за проверку есть ли для нужной нам роли цена или нет.

function uc_price_per_role_find_price($prices) {
  global $user;

  $enabled = variable_get('uc_price_per_role_enabled', array());
  $weights = variable_get('uc_price_per_role_weights', array());
  asort($weights);

  // Check for a chosen role in the price selection block first.
  if (user_access('access price selection block') && $_SESSION['price_role'] && isset($prices[$_SESSION['price_role']])) {
    return $prices[$_SESSION['price_role']];
  }

  // Otherwise, look for a matching role.
  foreach ($weights as $rid => $weight) {
    if (isset($user->roles[$rid]) && $enabled[$rid] && isset($prices[$rid])) {
      return $prices[$rid];
    }
  }

  return FALSE;
}

Такое поведение вызывает вот эта строка
 if (isset($user->roles[$rid]) && $enabled[$rid] && isset($prices[$rid]))

Те если цена определена и если она даже = 0 то все равно считается что цена есть

Ну а вот так легко подобное поведение исправить на то как нам надо.

function uc_price_per_role_find_price($prices) {
  global $user;

  $enabled = variable_get('uc_price_per_role_enabled', array());
  $weights = variable_get('uc_price_per_role_weights', array());
  asort($weights);

  // Check for a chosen role in the price selection block first.
  if (user_access('access price selection block') && $_SESSION['price_role'] && isset($prices[$_SESSION['price_role']])) {
    return $prices[$_SESSION['price_role']];
  }

  // Otherwise, look for a matching role.
  foreach ($weights as $rid => $weight) {
    if (isset($user->roles[$rid]) && $enabled[$rid] && (float)$prices[$rid]) {
      return $prices[$rid];
    }
  }

  return FALSE;
}

Те мы преобразовали строку вида "0.00" в число с плавающей точкой и по правилам PHP любое значение 0 = FALSE
Вот и вывод не используйте dev версии
Хотя и модуль очень нужный и хороший

Комментарии