data = $data; $this->type = $type; $this->a4barcodes = new Barcodes(); $this->generatedLabelsDataStorage = new GeneratedLabelsData(); $this->pattern = '\[(([a-zA-Z0-9_-]+)([^]]+))]'; $templates = new Templates(); if (!empty($data['profileId']) && !empty(intval($data['profileId']))) { $this->profileId = $data['profileId']; $this->profile = (new Profiles())->getProfile($data['profileId']); } if (!empty($data['default_barcode_type'])) { $this->default_barcode_type = $data['default_barcode_type']; } if (!empty($data['template'])) { $this->activeTemplate = $data['template']; } elseif (!empty($data['templateId']) && !empty(intval($data['templateId']))) { $profileTemplate = $templates->get($data['templateId']); $this->activeTemplate = !empty($profileTemplate) ? $profileTemplate : $templates->get(1); } elseif (!empty($data['profileId']) && !empty(intval($data['profileId']))) { if (!empty($this->profile->templateId)) { $profileTemplate = $templates->get($this->profile->templateId); $this->activeTemplate = !empty($profileTemplate) ? $profileTemplate : $templates->get(1); } else { $this->activeTemplate = $templates->get(1); } } else { $this->activeTemplate = $templates->get(1); } $this->getItems(); $this->items = apply_filters("barcodes_products_sort_items_hook", $this->items); } public function make() { $template = (isset($this->data["template"]) && $this->data["template"]) ? $this->data["template"] : $this->activeTemplate->template; $this->extractTemplateShortcodes($template, $this->templateShortcodesArgs); $this->generateBarcodes(); return $this->getResult(); } public function extractTemplateShortcodes($template, &$shortcodesArgs) { $shortcodesArgs = $this->getTemplateShortcodesArgs($template); } protected function getItems() { return array(); } protected function getFileOptions($itemData) { return array(); } protected function generateBarcodes() { foreach ($this->items as $itemData) { $fileOptions = $this->getFileOptions($itemData); $orderItemId = ""; if(isset($itemData->orderItem) && $itemData->orderItem) { $orderItemId = @$itemData->orderItem->get_id(); } $barcodeData = array( 'user_id' => get_current_user_id(), 'template_id' => !empty($this->activeTemplate) && !empty($this->activeTemplate->id) ? $this->activeTemplate->id : null, 'item_id' => isset($itemData->ID) ? $itemData->ID : "", 'order_item_id' => $orderItemId, 'item_parent_id' => isset($itemData->post_parent) ? $itemData->post_parent : "", 'profile_id' => !empty($this->profile) && !empty($this->profile->id) ? intval($this->profile->id) : 0, 'maker_class' => static::class, 'item_title' => property_exists($itemData, 'post_title') ? substr($itemData->post_title, 0, 254) : '', 'replacements' => $fileOptions['replacements'], ); for ($i = $fileOptions['quantity']; $i > 0; --$i) { $this->barcodes[] = $barcodeData; } } $copies = intval(UserSettings::getUserOption('copies', 1)); if ($copies < 1) { $copies = 1; } if (!UserSettings::getUserOption('useStockQuantity', 0)) { $barcodes = $this->barcodes; for ($i = 1; $i < $copies; $i++) { $this->barcodes = array_merge($this->barcodes, $barcodes); } } } public function convertValueToBarcodeImageUrlIfNeed($field, $value) { if ( !empty($value) && !empty($field['args']['barcode-image-url']) ) { $defaultBarcodeType = !empty($this->default_barcode_type) ? $this->default_barcode_type : $this->activeTemplate->default_barcode_type; $barcodeType = !in_array($field['args']['barcode-image-url'], $defaultBarcodeType) ? $defaultBarcodeType[0] : $field['args']['barcode-image-url']; $value = $this->getBarcodeImageUrl( $value, $barcodeType, isset($this->data['approxImageWidth']['[barcode_img_url]']['width']) ? $this->data['approxImageWidth']['[barcode_img_url]']['width'] : 500, isset($this->data['approxImageWidth']['[barcode_img_url]']['height']) ? $this->data['approxImageWidth']['[barcode_img_url]']['height'] : 500 ); } elseif ( empty($value) && !empty($field['args']['barcode-image-url']) ) { throw new LabelGenerationError('No data available to generate a barcode.'); } if ( !empty($value) && !empty($field['args']['barcode-image']) ) { $defaultBarcodeType = !empty($this->default_barcode_type) ? $this->default_barcode_type : $this->activeTemplate->default_barcode_type; $barcodeType = !in_array($field['args']['barcode-image'], $defaultBarcodeType) ? $defaultBarcodeType[0] : $field['args']['barcode-image']; $value = $this->getBarcodeImageUrl( $value, $barcodeType, isset($this->data['approxImageWidth']["[{$field['type']}]"]['width']) ? $this->data['approxImageWidth']["[{$field['type']}]"]['width'] : 500, isset($this->data['approxImageWidth']["[{$field['type']}]"]['height']) ? $this->data['approxImageWidth']["[{$field['type']}]"]['height'] : 500 ); } elseif ( empty($value) && !empty($field['args']['barcode-image']) ) { throw new LabelGenerationError('No data available to generate a barcode.'); } return $value; } protected function getBarcodeImageUrl($value, $barcodeType, $width = 500, $height = 500) { $barcodeType = strtoupper($barcodeType); switch ($barcodeType) { case 'CODE128': $barcodeType = 'C128'; break; case 'CODE39': $barcodeType = 'C39'; break; } $validationResult = $this->a4barcodes->validateBarcode($value, $barcodeType, $this->data); if ($validationResult['is_valid']) { $imageUrl = $this->a4barcodes->generateXml(array( 'lineBarcode' => $value, 'algorithm' => $barcodeType, 'width' => $width, 'height' => $height, )); $imageUrl = preg_replace('/.*<\/desc>/ms', '', $imageUrl); $imageUrl = "data:image/svg+xml;base64," . base64_encode($imageUrl); } else { throw new LabelGenerationError($validationResult['message']); } return $imageUrl; } protected function getResult() { $result = array( 'success' => $this->success, 'error' => $this->errors, ); if (!empty($this->activeTemplate) && !empty($this->activeTemplate->id)) { $result['templateId'] = $this->activeTemplate->id; } if (empty($this->data['notSave']) || true !== $this->data['notSave']) { $saveToDbErrorsMsg = ''; $saveToDbSuccess = $this->generatedLabelsDataStorage->save($this->barcodes, $saveToDbErrorsMsg); $this->barcodes = array(); if (!$saveToDbSuccess) { $result['error'][] = $saveToDbErrorsMsg; } else { $result['uslpLabels'] = $this->generatedLabelsDataStorage->get(get_current_user_id()); if (!empty($this->profile) && property_exists($this->profile, 'sortAlphabetically') && '1' === $this->profile->sortAlphabetically) { $result['uslpLabels'] = $this->sortByTitle($result['uslpLabels']); } } } else { $result['uslpLabels'] = $this->barcodes; } $result['wpNonce'] = wp_create_nonce('wp_rest'); return $result; } public function getTemplateReplacements($item, $shortcodesArgs) { return new \ArrayObject(); } public function getTemplateShortcodesArgs($template) { $shortcodesArgs = array(); $shortcodesTagsList = array( 'qty-range-amount', 'qty-range-price', ); $shortcodesTagsList = apply_filters('uslp_register_shortcodes_hook', $shortcodesTagsList); $template = preg_replace('/\[line(\d)+\]/', '', $template); if (preg_match_all('/' . $this->pattern . '/s', $template, $matches)) { foreach ($matches[0] as $key => $shortCode) { $shortCodeAttrs = $this->templateParseAtts($matches[1][$key]); if ( !empty($shortCodeAttrs['type']) && !empty($this->findShortcodeClass($shortCodeAttrs['type'])) ) { $shortcodesArgs[$shortCode] = $shortCodeAttrs; } } } foreach ($shortcodesTagsList as $shortcodeTag) { if (preg_match_all("/\[$shortcodeTag(.*?)]/s", $template, $matches)) { foreach ($matches[0] as $key => $shortCode) { $shortCodeAttrs = $this->templateParseAtts(trim($matches[0][$key], '[]')); if ( !empty($shortCodeAttrs['type']) && !empty($this->findShortcodeClass($shortCodeAttrs['type'])) ) { $shortcodesArgs[$shortCode] = $shortCodeAttrs; } } } } if (!empty($this->data['matching']) && is_array($this->data['matching'])) { foreach ($this->data['matching'] as $matchingKey => $shortcode) { $shortCodeAttrs = $this->templateParseAtts(trim($shortcode, '[]')); if ( !empty($shortCodeAttrs['type']) && !empty($this->findShortcodeClass($shortCodeAttrs['type'])) ) { $shortcodesArgs[$matchingKey] = $shortCodeAttrs; $shortcodesArgs[$matchingKey]['isMatching'] = 1; } } } elseif (!empty($this->profile) && !empty($this->profile->matching) && is_array($this->profile->matching)) { foreach ($this->profile->matching as $matchingKey => $shortcode) { $shortCodeAttrs = $this->templateParseAtts(trim($shortcode, '[]')); if ( !empty($shortCodeAttrs['type']) && !empty($this->findShortcodeClass($shortCodeAttrs['type'])) ) { $shortcodesArgs[$matchingKey] = $shortCodeAttrs; $shortcodesArgs[$matchingKey]['isMatching'] = 1; } if (preg_match('/\[value([1-8])]/', $matchingKey) && empty($shortCodeAttrs['type'])) { $shortcodesArgs[$matchingKey] = array('term_meta' => null, 'type' => 'static-text', 'value' => ''); $shortcodesArgs[$matchingKey]['isMatching'] = 1; } } } return $shortcodesArgs; } protected function registerShortcodeClass($shortcodeTag) { $shortcodeClassName = $this->findShortcodeClass($shortcodeTag); if (!empty($shortcodeClassName)) { call_user_func($shortcodeClassName.'::register', $shortcodeTag, $this); return true; } return false; } protected function findShortcodeClass($shortcodeTag) { $makerClassNames = array_keys(array_merge(array(static::class => static::class), class_parents(static::class))); foreach ($makerClassNames as $makerClassName) { $shortcodeClassName = str_replace("LabelDataMakers", "LabelDataMakers\\Shortcodes", $makerClassName) . "\\" . str_replace(array("-", "_"), '', ucwords($shortcodeTag, "-_")) ; if (class_exists($shortcodeClassName)) { return $shortcodeClassName; } } return false; } protected function templateParseAtts($attsString) { $result = array('term_meta' => null, 'type' => ''); $params = shortcode_parse_atts($attsString); $i = 1; foreach ($params as $key => $value) { if ($i === 1) { $result['type'] = 0 !== $key ? $key : $value; $result['value'] = $value; } elseif ('term' === $key) { $result['term_meta'] = $value; } else { $result[$key] = $value; } $i++; } return $result; } protected function extractListTemplateData($labelTemplate, $listStartShortcode, $listEndShortcode, &$listTemplate, &$listShortcode, &$listShortcodeArgs) { $prodListStart = strpos($labelTemplate, $listStartShortcode); $prodListEnd = strpos($labelTemplate, $listEndShortcode); if (false !== $prodListStart && false !== $prodListEnd) { $prodListStartCloseBracer = strpos($labelTemplate, ']', $prodListStart); $prodListEndCloseBracer = strpos($labelTemplate, ']', $prodListEnd); $listTemplate = trim(substr($labelTemplate, $prodListStartCloseBracer + 1, $prodListEnd - $prodListStartCloseBracer - 1)); $listShortcode = substr($labelTemplate, $prodListStart, $prodListEndCloseBracer - $prodListStart + 1); $labelTemplate = substr($labelTemplate, 0, $prodListStart) . substr($labelTemplate, $prodListEndCloseBracer + 1); $this->activeTemplate->template = $labelTemplate; } if (!empty($listTemplate)) { $listShortcodeArgs = $this->getTemplateShortcodesArgs($listTemplate); } } public function sortByTitle($targetArray) { usort($targetArray, function($item1, $item2) { if (property_exists($item1, 'item_title') && property_exists($item2, 'item_title')) { return strcmp($item1->item_title, $item2->item_title); } else { return 0; } }); return $targetArray; } }