2017-05-29 78 views
1

我要重写抽象类的保护功能magento2Magento 2如何在抽象类中重写protected funtion?

这里是我的代码

di.xml

<?xml version="1.0"?> 
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd"> 
    <preference for="Magento\Sales\Model\Order\Pdf\AbstractPdf" type="Custom\Sales\Model\Order\Pdf\AbstractPdf" /> 
</config> 

AbstractPdf.php(自定义/销售/型号/订购/ PDF/AbstractPdf .php)

<?php 
/** 
* Copyright © 2016 Magento. All rights reserved. 
* See COPYING.txt for license details. 
*/ 

// @codingStandardsIgnoreFile 

namespace Custom\Sales\Model\Order\Pdf; 

// use Magento\Eav\Model\Entity\Attribute as EntityAttribute; 
// use Magento\Eav\Model\Entity\Attribute\AbstractAttribute; 
// use Magento\Framework\DB\Select; 
// use Magento\Framework\Model\AbstractModel; 
// use Magento\Framework\App\Filesystem\DirectoryList; 
// use Magento\Framework\DataObject; 

/** 
* Sales Order PDF abstract model 
* @SuppressWarnings(PHPMD.ExcessiveClassComplexity) 
* @SuppressWarnings(PHPMD.CouplingBetweenObjects) 
*/ 
class AbstractPdf extends \Magento\Sales\Model\Order\Pdf\AbstractPdf 
{ 

    /** 
    * Insert logo to pdf page 
    * 
    * @param \Zend_Pdf_Page &$page 
    * @param null $store 
    * @return void 
    * @SuppressWarnings(PHPMD.CyclomaticComplexity) 
    */ 
    protected function insertLogo(&$page, $store = null) 
    { 
     echo "override";die; 
    } 

} 

我已经覆盖了上面提到的文件的核心模型,但我无法得到解决方案。

请帮我解决这个问题。

回答

2

您无法覆盖受保护的功能。但是,您可以覆盖正在调用该受保护方法的公共方法。在我的情况下,我需要覆盖名为insertLogo的方法。然而,这是我无法重写的受保护的方法。因此,我重写了在getPdf方法中调用insertLogo的Invoice.php。在同一个文件中我重新定义的代码insertLogo

UPDATE

这里是文件

app/code/Vendor/Modulename/Model/Order/Pdf/Invoice.php 

代码

namespace Vendor\Modulename\Model\Order\Pdf; 
class Invoice extends \Magento\Sales\Model\Order\Pdf\Invoice 
{ 
    public function getPdf($invoices = []) 
    { 
      //some code 

      $order = $invoice->getOrder(); 
      /* Add image */ 
      //$this->insertLogo($page, $invoice->getStore()); 
      /* Calling custom function*/ 
      $this->insertLogoCustom($page, $invoice->getStore()); 
      /* Add address */ 
      $this->insertAddress($page, $invoice->getStore()); 

      //some more code 

     return $pdf; 
    } 
    protected function insertLogoCustom(&$page, $store = null) 
    { 
     $this->y = $this->y ? $this->y : 815; 
     $image = $this->_scopeConfig->getValue(
      'sales/identity/logo', 
      \Magento\Store\Model\ScopeInterface::SCOPE_STORE, 
      $store 
     ); 
     if ($image) { 
      $imagePath = '/sales/store/logo/' . $image; 
      if ($this->_mediaDirectory->isFile($imagePath)) { 
       $image = \Zend_Pdf_Image::imageWithPath($this->_mediaDirectory->getAbsolutePath($imagePath)); 
       $top = 830; 
       //top border of the page 
       $widthLimit = 270; 
       //half of the page width 
       $heightLimit = 270; 
       //assuming the image is not a "skyscraper" 
       /* Modified this code to convert pixel in points */ 
       $width = $image->getPixelWidth()* 72/96; 
       $height = $image->getPixelHeight()* 72/96; 

       //preserving aspect ratio (proportions) 
       $ratio = $width/$height; 

       if ($ratio > 1 && $width > $widthLimit) { 
        $width = $widthLimit; 
        $height = $width/$ratio; 
       } elseif ($ratio < 1 && $height > $heightLimit) { 
        $height = $heightLimit; 
        $width = $height * $ratio; 
       } elseif ($ratio == 1 && $height > $heightLimit) { 
        $height = $heightLimit; 
        $width = $widthLimit; 
       } 

       $y1 = $top - $height; 
       $y2 = $top; 
       $x1 = 25; 
       $x2 = $x1 + $width; 


       //coordinates after transformation are rounded by Zend 
       $page->drawImage($image, $x1, $y1, $x2, $y2); 

       $this->y = $y1 - 10; 
      } 
     } 
    } 

} 

希望它能帮助!

+0

非常感谢你@Sejal shah,它被成功地压制了。 – Rana

+0

嗨全部, 我们如何可以覆盖mangento 2供应商\ magento \模块销售\型号\订单\电子邮件\ Sender.php 这个模型我想覆盖prepareTemplate()方法。 –

+0

@Pramod Kharade请提出一个新问题。 –