Ran*_*ana 3 php abstract-class magento2
我想在magento2中覆盖抽象类的受保护函数
这是我的代码
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>
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
我用上面提到的文件覆盖核心模型,但我无法得到解决方案.
请帮我解决这个问题.
您无法覆盖受保护的功能.但是,您可以覆盖调用该受保护方法的公共方法.在我的情况下,我需要覆盖调用的方法insertLogo.然而,这是我无法覆盖的受保护方法.所以我重写这是调用Invoice.php insertLogo的getPdf方法.在同一个文件中,我重新定义了代码insertLogo
UPDATE
这是文件
app/code/Vendor/Modulename/Model/Order/Pdf/Invoice.php
Run Code Online (Sandbox Code Playgroud)
码
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;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!