public function generate(&$pack, &$order, $quantity, &$serials) { if (!isset($pack->coupongen)) { return; } parent::pluginParams($pack->coupongen); if (empty($this->plugin_params->format) || !preg_match_all('#\\\\[|\\\\]|\\[[^]]+\\]\\{.*\\}|\\[.*\\]|.#iU', $this->plugin_params->format, $matches)) { $matches = array(array('[a-zA-Z0-9]{size}')); } $config = hikaserial::config(); $fastRandom = (int) $config->get('use_fast_random', 0); for ($q = 0; $q < $quantity; $q++) { $serial = ''; $serialObj = new stdClass(); if (!HIKASHOP_J16 || $fastRandom) { $stat = @stat(__FILE__); if (empty($stat) || !is_array($stat)) { $stat = array(php_uname()); } mt_srand(crc32(microtime() . implode('|', $stat))); } else { if (empty($this->plugin_params->size) || $this->plugin_params->size == 0) { $this->plugin_params->size = 15; } $rndCpt = 1; $random = JCrypt::genRandomBytes($this->plugin_params->size + 1); $shift = ord($random[0]); } foreach ($matches[0] as $m) { if (strlen($m) == 1) { $serial .= $m; } else { $repeat = 1; $format = $m; if (strpos($m, '{') !== false) { list($format, $repeat) = explode('{', $m); $repeat = trim(trim($repeat, '}')); if (empty($repeat) || (int) $repeat == 0) { $repeat = $this->plugin_params->size; } else { $repeat = (int) $repeat; } } $format = substr($format, 1, -1); $list = ''; $l = strlen($format); for ($i = 0; $i < $l; $i++) { if ($i + 2 < $l) { if ($format[$i + 1] == '-') { $s = $format[$i]; $e = $format[$i + 2]; $s1 = $s >= 'a' && $s <= 'z'; $s2 = $s >= 'A' && $s <= 'Z'; $s3 = $s >= '0' && $s <= '9'; $e1 = $e >= 'a' && $e <= 'z'; $e2 = $e >= 'A' && $e <= 'Z'; $e3 = $e >= '0' && $e <= '9'; if (!$s1 && !$s2 && !$s3) { $list .= $s . '-'; $i++; // Skip '-' continue; } if ($s1 && $e1 || $s2 && $e2 || $s3 && $e3) { if ($s > $e) { $c = $s; $s = $e; $e = $c; } for ($c = $s; $c < $e; $c++) { $list .= $c; } $i += 2; } else { if ($s1 && $e2) { for ($c = $s; $c < 'z'; $c++) { $list .= $c; } for ($c = 'A'; $c < $e; $c++) { $list .= $c; } $i += 2; } else { $list .= $s . '-'; $i++; // Skip '-' } } } else { $list .= $format[$i]; } } else { $list .= $format[$i]; } } $base = strlen($list); if (!HIKASHOP_J16 || $fastRandom) { for ($i = 1; $i <= $repeat; $i++) { $serial .= $list[mt_rand(0, $base - 1)]; } } else { for ($i = 1; $i <= $repeat; $i++) { $serial .= $list[($shift + ord($random[$rndCpt])) % $base]; $shift += ord($random[$rndCpt++]); if ($rndCpt == $this->plugin_params->size) { $rndCpt = 1; $random = JCrypt::genRandomBytes($this->plugin_params->size + 1); $shift = ord($random[0]); } } } } } $discount_id = (int) $this->plugin_params->discount_id; $result = true; if (!$this->test && !empty($discount_id)) { $discountClass = hikaserial::get('shop.class.discount'); $data = $discountClass->get($discount_id); if ($data) { unset($data->discount_id); $data->discount_code = $serial; $data->discount_published = 1; $data->discount_used_times = 0; if (!empty($this->plugin_params->validity_period) && !empty($this->plugin_params->validity_value) && (int) $this->plugin_params->validity_value > 0) { $date_d = date("d"); $date_m = date("m"); $date_y = date("Y"); $v = (int) $this->plugin_params->validity_value; switch ($this->plugin_params->validity_period) { case 'year': $data->discount_end = mktime(0, 0, 0, $date_m, $date_d, $date_y + $v); break; case 'month': $data->discount_end = mktime(0, 0, 0, $date_m + $v, $date_d, $date_y); break; case 'day': $data->discount_end = mktime(0, 0, 0, $date_m, $date_d + $v, $date_y); break; } if (!isset($serialObj->extradata)) { $serialObj->extradata = array(); } $serialObj->extradata['discount_end'] = $data->discount_end; } if (!empty($this->plugin_params->discount_percent)) { $v = hikaserial::toFloat(trim($this->plugin_params->discount_percent)); $product_price = 0; if (!empty($order->cart->products)) { foreach ($order->cart->products as $p) { if ($p->product_id == $pack->product_id || isset($pack->order_product_id) && $p->order_product_id == $pack->order_product_id) { $product_price = hikaserial::toFloat($p->order_product_price); if (!empty($this->plugin_params->discount_percent_tax)) { $product_price += hikaserial::toFloat($p->order_product_tax); } break; } } } if (!empty($product_price)) { if (!empty($order->order_currency_id)) { $data->discount_currency_id = (int) $order->order_currency_id; } else { $data->discount_currency_id = (int) $order->old->order_currency_id; } $data->discount_flat_amount = $product_price * $v / 100; $data->discount_percent_amount = 0.0; } } if (!$discountClass->save($data)) { $result = false; } } } if (!$result) { $app = JFactory::getApplication(); $app->enqueueMessage(JText::_('ERR_CREATING_DISCOUNT_COUPON')); } if (!empty($serialObj) && !empty($serialObj->extradata)) { $serialObj->data = $serial; $serials[] = $serialObj; } else { $serials[] = $serial; } } }
private function generateImage($file_path, $dest_path, $data, $params) { if (!function_exists('gd_info')) { return false; } $gd = gd_info(); if (!isset($gd["GD Version"])) { return false; } $realfilepath = HIKASERIAL_ROOT . $file_path; if (!JFile::exists($realfilepath)) { $realfilepath = null; } if (empty($realfilepath)) { $shopConfig = hikaserial::config(false); $uploadFolder = ltrim(JPath::clean(html_entity_decode($shopConfig->get('uploadfolder'))), DS); $realfilepath = JPATH_ROOT . DS . rtrim($uploadFolder, DS) . DS . $file_path; if (!JFile::exists($realfilepath)) { $realfilepath = null; } } if (empty($realfilepath)) { $realfilepath = $file_path; if (!JFile::exists($file_path)) { $realfilepath = null; } } if (empty($realfilepath)) { return false; } $file_path = $realfilepath; $currencyClass = null; $extension = strtolower(substr($file_path, strrpos($file_path, '.') + 1)); $img = $this->initializeImage($file_path, $extension); if (!$img) { return false; } if (in_array($extension, array('gif', 'png'))) { imagesavealpha($img, true); imagealphablending($img, false); } $font = @$params->default_font; if (!empty($font) && substr($font, 0, 1) != '.' && substr($font, -4) == '.ttf') { $font = HIKASERIAL_MEDIA . 'ttf/' . $font; } else { $font = ''; } if (empty($font) || !file_exists($font)) { $font = HIKASERIAL_MEDIA . 'ttf/opensans-regular.ttf'; } $blackcolor = imagecolorallocatealpha($img, 0, 0, 0, 0); foreach ($data as $d) { if (!is_array($d)) { $d = array('text' => $d); } if (empty($d['text'])) { continue; } if (!empty($d['format']) && $d['format'] != 'raw') { $format = $d['format']; if (substr($format, -1) == '.') { $format .= @$d['format_ex']; } list($format, $format_ex) = explode('.', $format, 2); switch ($format) { case 'date': $d['text'] = hikaserial::getDate((int) $d['text'], $format_ex); break; case 'price': if (empty($currencyClass)) { $currencyClass = hikaserial::get('shop.class.currency'); } $d['text'] = $currencyClass->format(hikaserial::toFloat($d['text']), $params->order->order_currency_id); break; case 'qrcode': $d['text'] = $this->generateImageQrCode($img, $d); break; case 'barcode': $d['text'] = $this->generateImageBarCode($img, $d); break; case 'image': $d['text'] = $this->includeImage($img, $d); break; default: $d['text'] = null; break; } } $localfont = $font; if (!empty($d['font']) && substr($d['font'], 0, 1) != '.' && substr($d['font'], -4) == '.ttf') { $localfont = HIKASERIAL_MEDIA . 'ttf/' . $d['font']; if (empty($localfont) || !file_exists($localfont)) { $localfont = $font; } } if (!empty($d['text'])) { if (!empty($d['color']) && (substr($d['color'], 0, 1) == '#' && strlen(trim($d['color'])) == 7 || strlen(trim($d['color'])) == 6)) { $rgb = str_split(ltrim($d['color'], '#'), 2); $textcolor = imagecolorallocatealpha($img, hexdec($rgb[0]), hexdec($rgb[1]), hexdec($rgb[2]), 0); } else { $textcolor = $blackcolor; } if (empty($d['size'])) { $d['size'] = 12; } if (empty($d['x'])) { $d['x'] = 0; } if (empty($d['y'])) { $d['y'] = 0; } if (empty($d['w'])) { $d['w'] = 0; } if (empty($d['h'])) { $d['h'] = 0; } $d['y'] += $d['size']; imagealphablending($img, true); $this->displayTextBox($img, (int) $d['size'], (int) $d['x'], (int) $d['y'], (int) $d['w'], (int) $d['h'], $textcolor, $localfont, $d['text']); imagealphablending($img, false); } } if (empty($dest_path)) { ob_start(); $dest_path = null; } $imgData = false; switch ($extension) { case 'gif': $imgData = imagegif($img, $dest_path); break; case 'jpg': case 'jpeg': $imgData = imagejpeg($img, $dest_path, 90); break; case 'png': $imgData = imagepng($img, $dest_path, 9); break; } imagedestroy($img); if (empty($dest_path)) { if ($imgData) { $imgData = ob_get_clean(); } else { ob_end_clean(); } } return $imgData; }
public function generate(&$pack, &$order, $quantity, &$serials) { if (!isset($pack->pointsgen)) { return; } parent::pluginParams($pack->pointsgen); if (empty($this->plugin_params->format) || !preg_match_all('#\\\\[|\\\\]|\\[[^]]+\\]\\{.*\\}|\\[.*\\]|.#iU', $this->plugin_params->format, $matches)) { $matches = array(array('[a-zA-Z0-9]{size}')); } $config = hikaserial::config(); $fastRandom = (int) $config->get('use_fast_random', 0); for ($q = 0; $q < $quantity; $q++) { $serial = ''; $serialObj = new stdClass(); if (!HIKASHOP_J16 || $fastRandom) { $stat = @stat(__FILE__); if (empty($stat) || !is_array($stat)) { $stat = array(php_uname()); } mt_srand(crc32(microtime() . implode('|', $stat))); } else { if (empty($this->plugin_params->size) || $this->plugin_params->size == 0) { $this->plugin_params->size = 15; } $rndCpt = 1; $random = JCrypt::genRandomBytes($this->plugin_params->size + 1); $shift = ord($random[0]); } foreach ($matches[0] as $m) { if (strlen($m) == 1) { $serial .= $m; } else { $repeat = 1; $format = $m; if (strpos($m, '{') !== false) { list($format, $repeat) = explode('{', $m); $repeat = trim(trim($repeat, '}')); if (empty($repeat) || (int) $repeat == 0) { $repeat = $this->plugin_params->size; } else { $repeat = (int) $repeat; } } $format = substr($format, 1, -1); $list = ''; $l = strlen($format); for ($i = 0; $i < $l; $i++) { if ($i + 2 < $l) { if ($format[$i + 1] == '-') { $s = $format[$i]; $e = $format[$i + 2]; $s1 = $s >= 'a' && $s <= 'z'; $s2 = $s >= 'A' && $s <= 'Z'; $s3 = $s >= '0' && $s <= '9'; $e1 = $e >= 'a' && $e <= 'z'; $e2 = $e >= 'A' && $e <= 'Z'; $e3 = $e >= '0' && $e <= '9'; if (!$s1 && !$s2 && !$s3) { $list .= $s . '-'; $i++; // Skip '-' continue; } if ($s1 && $e1 || $s2 && $e2 || $s3 && $e3) { if ($s > $e) { $c = $s; $s = $e; $e = $c; } for ($c = $s; $c < $e; $c++) { $list .= $c; } $i += 2; } else { if ($s1 && $e2) { for ($c = $s; $c < 'z'; $c++) { $list .= $c; } for ($c = 'A'; $c < $e; $c++) { $list .= $c; } $i += 2; } else { $list .= $s . '-'; $i++; // Skip '-' } } } else { $list .= $format[$i]; } } else { $list .= $format[$i]; } } $base = strlen($list); if (!HIKASHOP_J16 || $fastRandom) { for ($i = 1; $i <= $repeat; $i++) { $serial .= $list[mt_rand(0, $base - 1)]; } } else { for ($i = 1; $i <= $repeat; $i++) { $serial .= $list[($shift + ord($random[$rndCpt])) % $base]; $shift += ord($random[$rndCpt++]); if ($rndCpt == $this->plugin_params->size) { $rndCpt = 1; $random = JCrypt::genRandomBytes($this->plugin_params->size + 1); $shift = ord($random[0]); } } } } } if (!$this->test) { if (!isset($serialObj->extradata)) { $serialObj->extradata = array(); } $serialObj->extradata['points_value'] = (int) $this->plugin_params->value; if (!empty($this->plugin_params->currency_rate)) { $v = hikaserial::toFloat(trim($this->plugin_params->currency_rate)); $product_price = 0; if (!empty($order->cart->products)) { foreach ($order->cart->products as $p) { if ($p->product_id == $pack->product_id || isset($pack->order_product_id) && $p->order_product_id == $pack->order_product_id) { $product_price = hikaserial::toFloat($p->order_product_price); if (!empty($this->plugin_params->discount_percent_tax)) { $product_price += hikaserial::toFloat($p->order_product_tax); } break; } } } if (!empty($product_price)) { $shopConfig = hikaserial::config(false); $main_currency = $shopConfig->get('main_currency', 1); $currencyClass = hikaserial::get('shop.class.currency'); $currency = $currencyClass->get($main_currency); if (isset($order->order_currency_id)) { $order_currency_id = $order->order_currency_id; } else { $order_currency_id = hikashop_getCurrency(); } if ($main_currency != $order_currency_id) { $product_price = $currencyClass->convertUniquePrice($product_price, $main_currency, $order_currency_id); } $serialObj->extradata['points_value'] += (int) ($product_price / $v); } } if (!empty($order->hikaserial->formData['points_value'])) { $serialObj->extradata['points_value'] += (int) $order->hikaserial->formData['points_value']; } } if (!empty($serialObj) && !empty($serialObj->extradata)) { $serialObj->data = $serial; $serials[] = $serialObj; } else { $serials[] = $serial; } } }