用短短的几步添加自定义属性到Magento的PDF发票。最近我有个任务是为产品创建一个名称为“alwayly_warehouse_location”的自定义属性,当点击“打印”(在后台发票区域)事件时输出它。由于发票打印是Magento核心功能,所以我们需要重写它。 第一步在你的Magento项目中创建下面的文件:
这些是用来修改Magento核心功能的。 第二步将下面代码加入到对应的文件中去: config.xml <?xml version="1.0"?> <config> <modules> <Alwayly_Invoice> <version>0.1.0</version> </Alwayly_Invoice> </modules> <global> <models> <sales> <rewrite> <order_pdf_invoice>Alwayly_Invoice_Model_Order_Pdf_Invoice</order_pdf_invoice> <order_pdf_items_invoice_default>Alwayly_Invoice_Model_Order_Pdf_Items_Invoice_Default</order_pdf_items_invoice_default> </rewrite> </sales> </models> </global> </config> Default.php <?php /** * Alwayly PDF rewrite for custom attribute * Attribute "alwayly_warehouse_location" has to be set manually * Original: Sales Order Invoice Pdf default items renderer * * @category Alwayly * @package Inhoo_Invoice */ class Alwayly_Invoice_Model_Order_Pdf_Items_Invoice_Default extends Mage_Sales_Model_Order_Pdf_Items_Invoice_Default { /** * Draw item line **/ public function draw() { $order = $this->getOrder(); $item = $this->getItem(); $pdf = $this->getPdf(); $page = $this->getPage(); $lines = array(); //Alwayly - Added custom attribute to PDF, first get it if exists $WarehouseLocation = $this->getWarehouseLocationValue($item); // draw Product name $lines[0] = array(array( 'text' => Mage::helper('core/string')->str_split($item->getName(), 60, true, true), 'feed' => 35, )); //Alwayly - Added custom attribute //draw Warehouse Location $lines[0][] = array( 'text' => Mage::helper('core/string')->str_split($WarehouseLocation, 25), 'feed' => 245 ); // draw SKU $lines[0][] = array( 'text' => Mage::helper('core/string')->str_split($this->getSku($item), 25), 'feed' => 325 ); // draw QTY $lines[0][] = array( 'text' => $item->getQty()*1, 'feed' => 435 ); // draw Price $lines[0][] = array( 'text' => $order->formatPriceTxt($item->getPrice()), 'feed' => 395, 'font' => 'bold', 'align' => 'right' ); // draw Tax $lines[0][] = array( 'text' => $order->formatPriceTxt($item->getTaxAmount()), 'feed' => 495, 'font' => 'bold', 'align' => 'right' ); // draw Subtotal $lines[0][] = array( 'text' => $order->formatPriceTxt($item->getRowTotal()), 'feed' => 565, 'font' => 'bold', 'align' => 'right' ); // custom options $options = $this->getItemOptions(); if ($options) { foreach ($options as $option) { // draw options label $lines[][] = array( 'text' => Mage::helper('core/string')->str_split(strip_tags($option['label']), 70, true, true), 'font' => 'italic', 'feed' => 35 ); if ($option['value']) { $_printValue = isset($option['print_value']) ? $option['print_value'] : strip_tags($option['value']); $values = explode(', ', $_printValue); foreach ($values as $value) { $lines[][] = array( 'text' => Mage::helper('core/string')->str_split($value, 50, true, true), 'feed' => 40 ); } } } } $lineBlock = array( 'lines' => $lines, 'height' => 10 ); $page = $pdf->drawLineBlocks($page, array($lineBlock), array('table_header' => true)); $this->setPage($page); } /* * Return Value of custom attribute * */ private function getWarehouseLocationValue($item) { $prod = Mage::getModel('catalog/product')->load($item->getProductId()); if(!($return_location = $prod->getAlwaylyWarehouseLocation())) return 'N/A'; else return $return_location; } } Invoice.php <?php /** * Alwayly PDF rewrite for custom attribute * * Attribute "alwayly_warehouse_location" has to be set manually * Original: Sales Order Invoice PDF model * * @category Alwayly * @package Alwayly_Invoice */ class Alwayly_Invoice_Model_Order_Pdf_Invoice extends Mage_Sales_Model_Order_Pdf_Invoice { public function getPdf($invoices = array()) { $this->_beforeGetPdf(); $this->_initRenderer('invoice'); $pdf = new Zend_Pdf(); $this->_setPdf($pdf); $style = new Zend_Pdf_Style(); $this->_setFontBold($style, 10); foreach ($invoices as $invoice) { if ($invoice->getStoreId()) { Mage::app()->getLocale()->emulate($invoice->getStoreId()); } $page = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); $pdf->pages[] = $page; $order = $invoice->getOrder(); /* Add image */ $this->insertLogo($page, $invoice->getStore()); /* Add address */ $this->insertAddress($page, $invoice->getStore()); /* Add head */ $this->insertOrder($page, $order, Mage::getStoreConfigFlag(self::XML_PATH_SALES_PDF_INVOICE_PUT_ORDER_ID, $order->getStoreId())); $page->setFillColor(new Zend_Pdf_Color_GrayScale(1)); $this->_setFontRegular($page); $page->drawText(Mage::helper('sales')->__('Invoice # ') . $invoice->getIncrementId(), 35, 780, 'UTF-8'); /* Add table */ $page->setFillColor(new Zend_Pdf_Color_RGB(0.93, 0.92, 0.92)); $page->setLineColor(new Zend_Pdf_Color_GrayScale(0.5)); $page->setLineWidth(0.5); $page->drawRectangle(25, $this->y, 570, $this->y -15); $this->y -=10; /* Add table head */ $page->setFillColor(new Zend_Pdf_Color_RGB(0.4, 0.4, 0.4)); $page->drawText(Mage::helper('sales')->__('Products'), 35, $this->y, 'UTF-8'); //Added for custom attribute "alwayly_warehouse_location" $page->drawText(Mage::helper('sales')->__('Warehouse Location'), 245, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('SKU'), 325, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Price'), 380, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Qty'), 430, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Tax'), 480, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Subtotal'), 535, $this->y, 'UTF-8'); $this->y -=15; $page->setFillColor(new Zend_Pdf_Color_GrayScale(0)); /* Add body */ foreach ($invoice->getAllItems() as $item){ if ($item->getOrderItem()->getParentItem()) { continue; } if ($this->y < 15) { $page = $this->newPage(array('table_header' => true)); } /* Draw item */ $page = $this->_drawItem($item, $page, $order); } /* Add totals */ $page = $this->insertTotals($page, $invoice); if ($invoice->getStoreId()) { Mage::app()->getLocale()->revert(); } } $this->_afterGetPdf(); return $pdf; } public function newPage(array $settings = array()) { /* Add new table head */ $page = $this->_getPdf()->newPage(Zend_Pdf_Page::SIZE_A4); $this->_getPdf()->pages[] = $page; $this->y = 800; if (!empty($settings['table_header'])) { $this->_setFontRegular($page); $page->setFillColor(new Zend_Pdf_Color_RGB(0.93, 0.92, 0.92)); $page->setLineColor(new Zend_Pdf_Color_GrayScale(0.5)); $page->setLineWidth(0.5); $page->drawRectangle(25, $this->y, 570, $this->y-15); $this->y -=10; $page->setFillColor(new Zend_Pdf_Color_RGB(0.4, 0.4, 0.4)); $page->drawText(Mage::helper('sales')->__('Product'), 35, $this->y, 'UTF-8'); //Added for custom attribute "alwayly_warehouse_location" $page->drawText(Mage::helper('sales')->__('Warehouse Location'), 245, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('SKU'), 325, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Price'), 380, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Qty'), 430, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Tax'), 480, $this->y, 'UTF-8'); $page->drawText(Mage::helper('sales')->__('Subtotal'), 535, $this->y, 'UTF-8'); $page->setFillColor(new Zend_Pdf_Color_GrayScale(0)); $this->y -=20; } return $page; } } 第三步进入后台 “Sales->Invoices->(View any of them)->Print”。下载PDF后可在每个订单物品中看到“Warehouse Location” (责任编辑:好模板) |