/vendor/magento/module-shipping/Model/Shipping/LabelGenerator.php
https://gitlab.com/yousafsyed/easternglamor · PHP · 191 lines · 121 code · 13 blank · 57 comment · 12 complexity · deb388b38b12c10655929bf0dc5ff602 MD5 · raw file
- <?php
- /**
- *
- * Copyright © 2016 Magento. 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));
- return $page;
- }
- }