質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

Q&A

解決済

1回答

827閲覧

複数の帳票のフォームをデフォルトのPDF作成フォームにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

0グッド

0クリップ

投稿2017/12/21 07:06

編集2017/12/29 06:19

質問文、コード変更させていただきました。

ECCUBE2.13.5で複数の帳票を追加しています。

デフォルトの納品書以外の帳票で、PDF作成フォーム部分が、
拡張ファイル(LC_Page_Admin_Order_Pdf_Ex.php)で作成したものに統一されてしまいます。

デフォルトの納品書とカスタム納品書はLC_Page_Admin_Order_Pdf.phpでのフォーム、
領収書はLC_Page_Admin_Order_Pdf_Ex.phpのフォームにしたいです。

識者の方、何か解決のヒントなどあれば、よろしくお願い致します。

↓↓↓LC_Page_Admin_Order_Pdf.php↓↓↓

public function init() { parent::init(); $this->tpl_mainpage = 'order/pdf_input.tpl'; $this->tpl_mainno = 'order'; $this->tpl_subno = 'pdf'; $this->tpl_maintitle = '受注管理'; $this->tpl_subtitle = '帳票出力'; $this->SHORTTEXT_MAX = STEXT_LEN; $this->MIDDLETEXT_MAX = MTEXT_LEN; $this->LONGTEXT_MAX = LTEXT_LEN; $this->arrType[0] = '納品書'; $this->arrType[1] = '納品書(カスタム)'; $this->arrDownload[0] = 'ブラウザに開く'; $this->arrDownload[1] = 'ファイルに保存'; } /** * Page のプロセス.  * * @return void */ public function process() { parent::process(); $this->action(); $this->sendResponse(); } /** コード

↓↓↓LC_Page_Admin_Order_Pdf_Ex.php↓↓↓

function

1 { 2 parent::init(); 3 // 4 5 6 7 8 $this->arrType[2] = '領収書'; 9 10 11 $this->isOrders = is_array($_POST['pdf_order_id']) && 1 < count($_POST['pdf_order_id']); 12 13 $this->tpl_mainpage = 'order/pdf_input_ex.tpl'; 14 } 15 16 17 18 /** 19 * Page のプロセス. 20 * 21 * @return void 22 */ 23 function process() 24 { 25 parent::process(); 26 } 27 28 /** 29コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tomak

2017/12/23 07:52 編集

createFromValues() はPDコンテンツ作成部分ですので、PDF作成部分をどのように行っているのかおしえてください。
退会済みユーザー

退会済みユーザー

2017/12/25 08:53

PDF作成部分のコードを下に追加しました。すみませんが、何卒よろしくお願いいたします。
guest

回答1

0

ベストアンサー

LC_Page_Admin_Order_Pdfクラスはデフォルトクラスなので、できるだけ書き換えないようにします。LC_Page_Admin_Order_Pdf_Exクラスのaction()メソッドで分岐するようにします。init()メソッドで$this->invoiceプロパティに帳票のロード設定をまとめてあります。これにより、元のアクションではPOSTあり、なしで分岐していたのを連想配列の設定でロードできるようにしてあります。

領収書の実際のフォームデータが不明だったのできちんと実装してありません。else if ($type === 2)のIF分岐内に実装してください。

実際に動かしていないので不具合があるかもしれませんが、とりあえずサンプルです。

php

1require_once(CLASS_PATH . "pages/admin/order/LC_Page_Admin_Order_Pdf.php"); 2 3class LC_Page_Admin_Order_Pdf_Ex extends LC_Page_Admin_Order_Pdf 4{ 5 public function init() 6 { 7 parent::init(); 8 9 //帳票の種類(セレクトボックス) 10 $this->arrType[0] = '納品書'; 11 $this->arrType[1] = '納品書(カスタム)'; 12 $this->arrType[2] = '領収書'; 13 14 //帳票のロード設定(セレクトボックスのPOST値をキーにする) 15 $this->invoice = array( 16 //初期表示(仮想値) 17 -1 => array( 18 'templ' => $this->tpl_mainpage, 19 ), 20 //納品書(デフォルトPDF、$_POST['type'] == 0) 21 0 => array( 22 'pdf' => true, 23 'class' => 'SC_Fpdf_Ex', 24 'path' => null, 25 'templ' => 'nouhinsyo1.pdf', 26 ), 27 //納品書(カスタム)($_POST['type'] == 1) 28 1 => array( 29 'pdf' => true, 30 'class' => 'SC_Fepdf', 31 'path' => CLASS_REALDIR . 'SC_Fepdf.php', 32 'templ' => 'nouhinsyo1.pdf', 33 ), 34 //領収書($_POST['type'] == 2) 35 2 => array( 36 'templ' => 'order/pdf_input_ex.tpl', 37 ), 38 ); 39 40 //セレクトボックスPOST値 41 $this->invoiceType = -1; 42 } 43 44 /** 45 * Page のプロセス. 46 * 47 * @return void 48 */ 49 public function process() 50 { 51 $this->action(); 52 $this->sendResponse(); 53 } 54 55 /** 56 * Page のアクション. 57 * 58 * @see data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php LC_Page_Admin_Order_Pdf::action() 59 */ 60 public function action() 61 { 62 //--- ここからLC_Page_Admin_Order_Pdf::action()と同じ --- 63 $objDb = new SC_Helper_DB_Ex(); 64 $objDate = new SC_Date_Ex(1901); 65 $objDate->setStartYear(RELEASE_YEAR); 66 67 $this->arrYear = $objDate->getYear(); 68 $this->arrMonth = $objDate->getMonth(); 69 $this->arrDay = $objDate->getDay(); 70 71 // パラメーター管理クラス 72 $this->objFormParam = new SC_FormParam_Ex(); 73 74 // パラメーター情報の初期化 75 $this->lfInitParam($this->objFormParam); 76 $this->objFormParam->setParam($_POST); 77 78 // 入力値の変換 79 $this->objFormParam->convParam(); 80 if (!isset($arrRet)) $arrRet = array(); 81 //--- ここまでLC_Page_Admin_Order_Pdf::action()と同じ --- 82 83 $type = $this->_getInvoiceType(); 84 85 //PDF作成 86 if ($type === true) { 87 $arrRet = $this->objFormParam->getHashArray(); 88 $arrErr = $this->lfCheckError($objFormParam); 89 90 if (count($arrErr) == 0) { 91 $this->_getFpdf($arrRet)->createPdf(); 92 SC_Response_Ex::actionExit(); 93 } 94 else { 95 $this->arrErr = $arrErr; 96 } 97 } 98 //領収書作成 99 else if ($type === 2) { 100 //カスタムフォームテンプレートをセット 101 $this->tpl_mainpage = $this->invoice[$this->invoiceType]['templ']; 102 //... 103 104 //親クラスメソッドLC_Page_Admin_Order_Pdf::createFromValues()を変更したい場合は本クラスに同じクラスを作成 105 $this->arrForm = $this->createFromValues($_GET['order_id'], $_POST['pdf_order_id']); 106 107 //テンプレートデータ上書 108 //$this->arrForm['title'] = ''; 109 //... 110 } 111 //初期表示、帳票作成フォーム 112 else { 113 //@see data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php LC_Page_Admin_Order_Pdf::createFromValues() 114 $this->arrForm = parent::createFromValues($_GET['order_id'], $_POST['pdf_order_id']); 115 } 116 117 $this->setTemplate($this->tpl_mainpage); 118 } 119 120 /** 121 * 初期表示・PDF表示などの表示モードを取得 122 * 123 * @return boolean|int true:PDF, int:!PDF(初期値:-1) 124 */ 125 private function _getInvoiceType() 126 { 127 $type = -1; 128 129 if ($this->getMode() == 'confirm' && isset($_POST['type']) && is_numeric($_POST['type'])) { 130 $type = preg_replace('/[^0-9]+/m', '', $_POST['type']); 131 if (is_numeric($type)) { 132 $this->invoiceType = $type; 133 } 134 } 135 136 return !empty($this->invoice[$type]['pdf']) && true === $this->invoice[$type]['pdf'] ? true : $type; 137 } 138 139 /** 140 * FPDFオブジェクト作成・データセット 141 * 142 * @param array $post POSTデータ 143 * @return object FPDFオブジェクト 144 */ 145 private function _getFpdf($post = array()) 146 { 147 try { 148 $this->arrForm = $post; 149 150 //タイトルが入力されていなければ、デフォルトのタイトルを表示 151 if(empty($post['title'])) { 152 $post['title'] = 'お買上げ明細書(納品書)'; 153 } 154 155 //クラス設定 156 $config = !empty($this->invoice[$this->invoiceType]) ? $this->invoice[$this->invoiceType] : $this->invoice[0]; 157 158 $invoiceClass = !empty($config['class']) ? $config['class'] : 'SC_Fpdf_Ex'; 159 $invoiceTempl = !empty($config['templ']) ? $config['templ'] : 'nouhinsyo1.pdf'; 160 $classPath = !empty($config['path']) && is_file($config['path']) ? $config['path'] : false; 161 162 if (false !== $classPath) { 163 //カスタムPDFクラスロード 164 require_once $classPath; 165 } 166 if (! class_exists($invoiceClass)) { 167 throw new Exception("PDFクラスを読み込むことができません。クラス名:$invoiceClass"); 168 } 169 170 //FPDFインスタンス作成 171 $objFpdf = new $invoiceClass($post['download'], $post['title'], $invoiceTempl); 172 173 foreach ($post['order_id'] as $key => $val) { 174 $arrPdfData = $post; 175 $arrPdfData['order_id'] = $val; 176 $objFpdf->setData($arrPdfData); 177 } 178 179 return $objFpdf; 180 } 181 catch (Exception $e) { 182 echo $e->getMessage(); 183 SC_Response_Ex::actionExit(); 184 } 185 } 186}

処理の流れは下記のようになっています。すみません、古いレポジトリを見ていたのでリンク先を変更しました。

■呼び元(1)
https://github.com/EC-CUBE/eccube-2_13/blob/eccube-2.13.5/html/admin/order/pdf.php

■LC_Page_Admin_Order_Pdf_Ex(2)
https://github.com/EC-CUBE/eccube-2_13/blob/eccube-2.13.5/data/class_extends/page_extends/admin/order/LC_Page_Admin_Order_Ex.php

■LC_Page_Admin_Order_Pdf(3)
https://github.com/EC-CUBE/eccube-2_13/blob/eccube-2.13.5/data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php

■LC_Page_Admin::sendResponse()(4)
https://github.com/EC-CUBE/eccube-2_13/blob/eccube-2.13.5/data/class/pages/admin/LC_Page_Admin.php

■帳票作成画面テンプレート(5)
https://github.com/EC-CUBE/eccube-2_13/blob/eccube-2.13.5/data/Smarty/templates/admin/order/pdf_input.tpl

投稿2017/12/25 16:11

編集2018/01/05 18:14
Tomak

総合スコア1652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/12/26 09:52

Tomak様 試行錯誤してみたのですが上手くいきません…。 LC_Page_Admin_Order_Pdf_Exを見てみたところ、parent::process();になっていました。 LC_Page_Admin_Order_Pdf_Ex.phpファイルではLC_Page_Admin_Order_Pdf.phpとは別に領収書フォームを設定していまして、追加したい帳票は納品書フォーム(LC_Page_Admin_Order_Pdf.phpで作成したフォーム)にしたいのですが、EXの領収書フォームになってしまうのです。 説明が下手で申し訳ないのですが、よろしくお願いいたします。
Tomak

2017/12/26 10:53

現在既にカスタム帳票を作成済みだたが、カスタム帳票ではなくデフォルトの帳票を使うように変更したいということですよね? ---- LC_Page_Admin_Order_Pdf_Ex ← これがカスタム帳票 LC_Page_Admin_Order_Pdf ← これがデフォルト帳票 LC_Page_Admin_Order_Pdf_Ex に createPdf() とかあるのはカスタム帳票ですので、LC_Page_Admin_Order_Pdf_Ex::process() で parent::process()(他はコメントアウト)となっていればデフォルト帳票が呼び出されます。 また、LC_Page_Admin_Order_Pdf_Ex::init() でカスタム帳票のメソッドを呼び出しているのであればコメントアウトして parent::init() のみにします。 回答の「処理の流れ」を見ていただけるとわかると思いますが、一番最初にカスタム帳票クラスを呼び出して、カスタム帳票の中で、デフォルト帳票を呼び出しています。ですから、カスタム帳票の中で作ってある帳票を呼び出さないで、デフォルト帳票のみを呼び出せば(parent::init(), parent::process())解決できるかと思います。
退会済みユーザー

退会済みユーザー

2017/12/27 03:17

すみません、書き忘れていたと思うのですが、領収書のフォームはカスタム帳票のままにしておきたいのです。 コメントアウトして parent::init() のみにしてしまうと、全てがデフォルトから呼び出されてしまいますよね? 領収書、カスタマイズした納品書、それぞれで設定することは可能でしょうか?
Tomak

2017/12/28 05:59

整合性がとれているのであれば、LC_Page_Admin_Order_Pdf_Ex::init() はカスタムのままでも問題ありありません。やり方がわからない場合は、LC_Page_Admin_Order_Pdf_Ex::init()、LC_Page_Admin_Order_Pdf_Ex::process() を質問文を編集してこれからのメソッドのコードを公開してみてはいかがでしょうか?
退会済みユーザー

退会済みユーザー

2017/12/29 06:22

Tomak様の回答してくださったことを踏まえて試行錯誤していたのですが上手くいかず… アドバイスいただいた通りコード等変更いたしました。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2018/01/05 09:07

Tomak様 サンプルありがとうございます! 大変勉強になります。 一つだけお聞きしたいのですが、以下の部分でエラーが出てしまいます… なんどもお手数おかけしているのは重々承知おりますが、よろしければご教示いただければ幸いです。 //クラス設定 $config = !empty($this->invoice[$this->invoiceType]) $this->invoice[$this->invoiceType] : $this->invoice[0];
Tomak

2018/01/05 18:16

すみません、三項演算子の「?」が抜けてました。下記のように修正してみてください。 ---- $config = !empty($this->invoice[$this->invoiceType]) ? $this->invoice[$this->invoiceType] : $this->invoice[0];
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問