Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
LabelGenerator.php
Go to the documentation of this file.
1 <?php
8 
11 
16 {
20  protected $carrierFactory;
21 
25  protected $labelFactory;
26 
30  protected $scopeConfig;
31 
35  protected $trackFactory;
36 
40  protected $filesystem;
41 
49  public function __construct(
51  \Magento\Shipping\Model\Shipping\LabelsFactory $labelFactory,
53  \Magento\Sales\Model\Order\Shipment\TrackFactory $trackFactory,
54  \Magento\Framework\Filesystem $filesystem
55  ) {
56  $this->carrierFactory = $carrierFactory;
57  $this->labelFactory = $labelFactory;
58  $this->scopeConfig = $scopeConfig;
59  $this->trackFactory = $trackFactory;
60  $this->filesystem = $filesystem;
61  }
62 
70  {
71  $order = $shipment->getOrder();
72  $carrier = $this->carrierFactory->create($order->getShippingMethod(true)->getCarrierCode());
73  if (!$carrier->isShippingLabelsAvailable()) {
74  throw new \Magento\Framework\Exception\LocalizedException(__('Shipping labels is not available.'));
75  }
76  $shipment->setPackages($request->getParam('packages'));
77  $response = $this->labelFactory->create()->requestToShipment($shipment);
78  if ($response->hasErrors()) {
79  throw new \Magento\Framework\Exception\LocalizedException(__($response->getErrors()));
80  }
81  if (!$response->hasInfo()) {
82  throw new \Magento\Framework\Exception\LocalizedException(__('Response info is not exist.'));
83  }
84  $labelsContent = [];
85  $trackingNumbers = [];
86  $info = $response->getInfo();
87  foreach ($info as $inf) {
88  if (!empty($inf['tracking_number']) && !empty($inf['label_content'])) {
89  $labelsContent[] = $inf['label_content'];
90  $trackingNumbers[] = $inf['tracking_number'];
91  }
92  }
93  $outputPdf = $this->combineLabelsPdf($labelsContent);
94  $shipment->setShippingLabel($outputPdf->render());
95  $carrierCode = $carrier->getCarrierCode();
96  $carrierTitle = $this->scopeConfig->getValue(
97  'carriers/' . $carrierCode . '/title',
98  \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
99  $shipment->getStoreId()
100  );
101  if (!empty($trackingNumbers)) {
102  $this->addTrackingNumbersToShipment($shipment, $trackingNumbers, $carrierCode, $carrierTitle);
103  }
104  }
105 
114  private function addTrackingNumbersToShipment(
115  \Magento\Sales\Model\Order\Shipment $shipment,
116  $trackingNumbers,
117  $carrierCode,
118  $carrierTitle
119  ) {
120  foreach ($trackingNumbers as $number) {
121  if (is_array($number)) {
122  $this->addTrackingNumbersToShipment($shipment, $number, $carrierCode, $carrierTitle);
123  } else {
124  $shipment->addTrack(
125  $this->trackFactory->create()
126  ->setNumber($number)
127  ->setCarrierCode($carrierCode)
128  ->setTitle($carrierTitle)
129  );
130  }
131  }
132  }
133 
140  public function combineLabelsPdf(array $labelsContent)
141  {
142  $outputPdf = new \Zend_Pdf();
143  foreach ($labelsContent as $content) {
144  if (stripos($content, '%PDF-') !== false) {
145  $pdfLabel = \Zend_Pdf::parse($content);
146  foreach ($pdfLabel->pages as $page) {
147  $outputPdf->pages[] = clone $page;
148  }
149  } else {
150  $page = $this->createPdfPageFromImageString($content);
151  if ($page) {
152  $outputPdf->pages[] = $page;
153  }
154  }
155  }
156  return $outputPdf;
157  }
158 
165  public function createPdfPageFromImageString($imageString)
166  {
168  $directory = $this->filesystem->getDirectoryWrite(
169  DirectoryList::TMP
170  );
171  $directory->create();
172  $image = @imagecreatefromstring($imageString);
173  if (!$image) {
174  return false;
175  }
176 
177  $xSize = imagesx($image);
178  $ySize = imagesy($image);
179  $page = new \Zend_Pdf_Page($xSize, $ySize);
180 
181  imageinterlace($image, 0);
182  $tmpFileName = $directory->getAbsolutePath(
183  'shipping_labels_' . uniqid(\Magento\Framework\Math\Random::getRandomNumber()) . time() . '.png'
184  );
185  imagepng($image, $tmpFileName);
186  $pdfImage = \Zend_Pdf_Image::imageWithPath($tmpFileName);
187  $page->drawImage($pdfImage, 0, 0, $xSize, $ySize);
188  $directory->delete($directory->getRelativePath($tmpFileName));
189  if (is_resource($image)) {
190  imagedestroy($image);
191  }
192  return $page;
193  }
194 }
$response
Definition: 404.php:11
create(\Magento\Sales\Model\Order\Shipment $shipment, RequestInterface $request)
$number
Definition: details.phtml:22
static parse(&$source=null, $revision=null)
Definition: Pdf.php:264
$order
Definition: order.php:55
__()
Definition: __.php:13
$page
Definition: pages.php:8
static imageWithPath($filePath)
Definition: Image.php:117
__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)
foreach( $_productCollection as $_product)() ?>" class $info
Definition: listing.phtml:52
foreach($order->getItems() as $orderItem) $shipment