Magentoで納品書のレイアウトを変更する

この記事は[Magento Advent Calendar 2015](http://www.adventar.org/calendars/931)の10日目です
前日は[Magento2のスタイル（LESS）変更の方法概要](http://qiita.com/kzkiq2nd/items/4a4adaf5544ad5f0d840)です
Magentoは今2系への移行で盛り上がっていますが、当記事はMagento1系について記載しています

## はじめに
Magentaの印刷機能（PDF出力）は[Zend PDF](http://framework.zend.com/manual/1.12/ja/zend.pdf.html)で実装されています

管理画面から セールス > 配送 とたどって印刷ボタンをクリックすると納品書をダウンロードできるわけですが、このときサーバー側では`app/code/core/Mage/Adminhtml/Controller/Sales/Shipment.php`のprintActionが呼び出されます。Adminhtml（管理画面） > Sales（セールス） > Shipment.php（配送） > printAction（印刷）という具合です。そこでprintActionを覗いてみると

```php
public function printAction() {
    /** @see Mage_Adminhtml_Sales_Order_InvoiceController */
    if ($shipmentId = $this->getRequest()->getParam('invoice_id')) { // invoice_id o_0
        if ($shipment = Mage::getModel('sales/order_shipment')->load($shipmentId)) {
            $pdf = Mage::getModel('sales/order_pdf_shipment')->getPdf(array($shipment));
```

sales/order_shipmentモデルを配列にして`app/code/core/Mage/Sales/Model/Order/Pdf/Shipment.php`のgetPdfに渡しています。getPdfで返却されたZend_Pdfモジュールをダウンロードするため、基本的にはgetPdfから呼び出される`Pdf`ディレクトリ以下のphpファイルを修正していくことになります

## 納品書のレイアウトを変更
### phpファイル修正の準備

`Pdf`ディレクトリに配置されたphpファイルのうち、編集したいレイアウト定義ファイルをcoreからlocalにコピーします (*1)

手始めに納品書下部に出力される商品リストをいじってみます。商品リストの印刷レイアウトは`Pdf/Items/Shipment/Default.php`で定義されているので

コピー元：app/code/ **core** /Mage/Sales/Model/Order/Pdf/Items/Shipment/Default.php
コピー先：app/code/ **local** /Mage/Sales/Model/Order/Pdf/Items/Shipment/Default.php

といった感じです

(*1) 変更したいものだけコピーするより`Pdf`ディレクトリ以下をまとめてコピーしたほうが楽かもしれません

仮に注文商品の個数を2倍にするには、コピーしたDefault.phpの52行目あたりを下記のように変更してください

```php
// draw QTY
$lines[0][] = array(
    // 'text'  => $item->getQty()*1, // 変更前
    'text'  => $item->getQty() * 2, // 変更後
    'feed'  => 35
);
```

商品数の表示位置を右端・右寄せに変えたいときは

```php
// draw QTY
$lines[0][] = array(
    'text'  => $item->getQty()*1,
    // 'feed'  => 35 // 変更前
    'feed'  => 565, // 変更後
    'align' => 'right' // 追加
);
```

`feed`で位置を調整して、`align`で右寄せにしています

## ロゴと発送元の表示
次に納品書にロゴを表示するため、管理画面から システム > 設定 > セールス > セールス > 請求書と納品書のデザイン > PDF印刷のロゴ にファイルをセットします。ついでに発送元（会社の住所や電話番号など）をPDFに出力するため、ロゴの表示と同様、請求書と納品書のデザイン > 住所 を設定しておいてください
納品書の最上部左側にロゴが、右側に発送元が表示されます

ロゴの表示位置や大きさを変更したいときは`Pdf/Abstract.php`のinsertLogoを修正します。注釈に`270`がhalf of the page widthとあるのでページ1/3に大きさを変更する場合はこの値を180に変更してください

```php
protected function insertLogo(&$page, $store = null) {
    $this->y = $this->y ? $this->y : 815;
    $image = Mage::getStoreConfig('sales/identity/logo', $store);
    if ($image) {
        $image = Mage::getBaseDir('media') . '/sales/store/logo/' . $image;
        if (is_file($image)) {
            $image       = Zend_Pdf_Image::imageWithPath($image);
            $top         = 830; //top border of the page
            // $widthLimit  = 270; //half of the page width // 変更前
            $widthLimit  = 180; // 変更後
```

発送者の情報が初期状態では右寄せになっているので、左寄せの表示に変更します。こちらもロゴと同様に`Pdf/Abstract.php`のinsertAddressを修正することで表示位置などを変更することが可能です。alignRightしている箇所があるので、ページ幅の真ん中（ページ幅`270`）から左寄せで出力するよう変更してしまいます

```php

protected function insertAddress(&$page, $store = null) {
    $page->setFillColor(new Zend_Pdf_Color_GrayScale(0));
    $font = $this->_setFontRegular($page, 10);
    $page->setLineWidth(0);
    $this->y = $this->y ? $this->y : 815;
    $top = 815;
    foreach (explode("\n", Mage::getStoreConfig('sales/identity/address', $store)) as $value){
        if ($value !== '') {
            $value = preg_replace('/<br[^>]*>/i', "\n", $value);
            foreach (Mage::helper('core/string')->str_split($value, 45, true, true) as $_value) {
                $page->drawText(trim(strip_tags($_value)),
                    // $this->getAlignRight($_value, 130, 440, $font, 10), // 変更前
                    270, // 変更後
```

## 住所表記方法の変更

続いて請求先住所と発送先住所の表記を英語圏な表示方法から日本的な表示方法に変更します

管理画面から システム > 設定 > 顧客 > 顧客設定 > 住所表記テンプレート > PDFファイル に記法が記載されているので、これをまるごと上書きしてしまいます

```
{{depend prefix}}{{var prefix}}|{{/depend}}
{{depend company}}{{var company}}|{{/depend}}
{{if postcode}}〒{{var postcode}}|{{/if}}
{{if region}}{{var region}} {{/if}}
{{if city}}{{var city}}{{/if}}
{{if street1}}{{var street1}}{{/if}}
{{depend street2}}{{var street2}}{{/depend}}{{depend street3}}{{var street3}}{{/depend}}{{depend street4}}{{var street4}}{{/depend}}|{{var lastname}} {{depend middlename}}{{var middlename}} {{/depend}}{{var firstname}}{{depend suffix}} {{var suffix}}{{/depend}}|
{{depend telephone}}{{var telephone}}{{/depend}}
{{depend fax}}|{{var fax}}{{/depend}}
{{depend vat_id}}|VAT: {{var vat_id}}{{/depend}}
```

改行コードについて、PDFファイルは`|`、HTMLは`<br />`で定義されています。例えばFAX番号の表示が不要であれば `{{depend fax}}{{var fax}}{{/depend}}`を消してください

##その他
### 支払い方法と配送方法の日本語化

支払い方法は システム > 設定 > セールス > 支払い方法 のタイトルを、配送方法は システム > 設定 > セールス > 配送方法 のタイトルと配送方法名を変更することで、それぞれ日本語表記に変更することができます。この設定は印刷機能に限らないので、別の場面で設定済みかもしれません

随分と駆け足な説明になってしまいましたが、Magentoの納品書レイアウト変更手順の概要は以上です。印刷レイアウトを変更するためにコードの修正が必要なのがポイントでありハードルなので、多少なりとも解消できれば幸いです。

[明日はHoriuchi Fumioさん](http://www.adventar.org/calendars/931)です。よろしくおねがいします！