![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-shipping/Model/Shipping/ |
<?php /** * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Shipping\Model\Shipping; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\RequestInterface; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class LabelGenerator { /** * @var \Magento\Shipping\Model\CarrierFactory */ protected $carrierFactory; /** * @var \Magento\Shipping\Model\Shipping\LabelsFactory */ protected $labelFactory; /** * @var \Magento\Framework\App\Config\ScopeConfigInterface */ protected $scopeConfig; /** * @var \Magento\Sales\Model\Order\Shipment\TrackFactory */ protected $trackFactory; /** * @var \Magento\Framework\Filesystem */ protected $filesystem; /** * @param \Magento\Shipping\Model\CarrierFactory $carrierFactory * @param LabelsFactory $labelFactory * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Magento\Sales\Model\Order\Shipment\TrackFactory $trackFactory * @param \Magento\Framework\Filesystem $filesystem */ public function __construct( \Magento\Shipping\Model\CarrierFactory $carrierFactory, \Magento\Shipping\Model\Shipping\LabelsFactory $labelFactory, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Sales\Model\Order\Shipment\TrackFactory $trackFactory, \Magento\Framework\Filesystem $filesystem ) { $this->carrierFactory = $carrierFactory; $this->labelFactory = $labelFactory; $this->scopeConfig = $scopeConfig; $this->trackFactory = $trackFactory; $this->filesystem = $filesystem; } /** * @param \Magento\Sales\Model\Order\Shipment $shipment * @param RequestInterface $request * @return void * @throws \Magento\Framework\Exception\LocalizedException */ public function create(\Magento\Sales\Model\Order\Shipment $shipment, RequestInterface $request) { $order = $shipment->getOrder(); $carrier = $this->carrierFactory->create($order->getShippingMethod(true)->getCarrierCode()); if (!$carrier->isShippingLabelsAvailable()) { throw new \Magento\Framework\Exception\LocalizedException(__('Shipping labels is not available.')); } $shipment->setPackages($request->getParam('packages')); $response = $this->labelFactory->create()->requestToShipment($shipment); if ($response->hasErrors()) { throw new \Magento\Framework\Exception\LocalizedException(__($response->getErrors())); } if (!$response->hasInfo()) { throw new \Magento\Framework\Exception\LocalizedException(__('Response info is not exist.')); } $labelsContent = []; $trackingNumbers = []; $info = $response->getInfo(); foreach ($info as $inf) { if (!empty($inf['tracking_number']) && !empty($inf['label_content'])) { $labelsContent[] = $inf['label_content']; $trackingNumbers[] = $inf['tracking_number']; } } $outputPdf = $this->combineLabelsPdf($labelsContent); $shipment->setShippingLabel($outputPdf->render()); $carrierCode = $carrier->getCarrierCode(); $carrierTitle = $this->scopeConfig->getValue( 'carriers/' . $carrierCode . '/title', \Magento\Store\Model\ScopeInterface::SCOPE_STORE, $shipment->getStoreId() ); if (!empty($trackingNumbers)) { $this->addTrackingNumbersToShipment($shipment, $trackingNumbers, $carrierCode, $carrierTitle); } } /** * @param \Magento\Sales\Model\Order\Shipment $shipment * @param array $trackingNumbers * @param string $carrierCode * @param string $carrierTitle * * @return void */ private function addTrackingNumbersToShipment( \Magento\Sales\Model\Order\Shipment $shipment, $trackingNumbers, $carrierCode, $carrierTitle ) { foreach ($trackingNumbers as $number) { if (is_array($number)) { $this->addTrackingNumbersToShipment($shipment, $number, $carrierCode, $carrierTitle); } else { $shipment->addTrack( $this->trackFactory->create() ->setNumber($number) ->setCarrierCode($carrierCode) ->setTitle($carrierTitle) ); } } } /** * Combine array of labels as instance PDF * * @param array $labelsContent * @return \Zend_Pdf */ public function combineLabelsPdf(array $labelsContent) { $outputPdf = new \Zend_Pdf(); foreach ($labelsContent as $content) { if (stripos($content, '%PDF-') !== false) { $pdfLabel = \Zend_Pdf::parse($content); foreach ($pdfLabel->pages as $page) { $outputPdf->pages[] = clone $page; } } else { $page = $this->createPdfPageFromImageString($content); if ($page) { $outputPdf->pages[] = $page; } } } return $outputPdf; } /** * Create \Zend_Pdf_Page instance with image from $imageString. Supports JPEG, PNG, GIF, WBMP, and GD2 formats. * * @param string $imageString * @return \Zend_Pdf_Page|false */ public function createPdfPageFromImageString($imageString) { /** @var \Magento\Framework\Filesystem\Directory\Write $directory */ $directory = $this->filesystem->getDirectoryWrite( DirectoryList::TMP ); $directory->create(); $image = @imagecreatefromstring($imageString); if (!$image) { return false; } $xSize = imagesx($image); $ySize = imagesy($image); $page = new \Zend_Pdf_Page($xSize, $ySize); imageinterlace($image, 0); $tmpFileName = $directory->getAbsolutePath( 'shipping_labels_' . uniqid(\Magento\Framework\Math\Random::getRandomNumber()) . time() . '.png' ); imagepng($image, $tmpFileName); $pdfImage = \Zend_Pdf_Image::imageWithPath($tmpFileName); $page->drawImage($pdfImage, 0, 0, $xSize, $ySize); $directory->delete($directory->getRelativePath($tmpFileName)); if (is_resource($image)) { imagedestroy($image); } return $page; } }