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

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

ただいまの
回答率

91.27%

  • PHP

    15633questions

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

  • EC-CUBE

    223questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 81

fffffff

score 7

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

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↓↓↓

    {
        parent::init();
    //    




        $this->arrType[2]  = '領収書';


        $this->isOrders = is_array($_POST['pdf_order_id']) && 1 < count($_POST['pdf_order_id']);

        $this->tpl_mainpage = 'order/pdf_input_ex.tpl';
    }



    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process()
    {
        parent::process();
    }

    /**
コード
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Tomak

    2017/12/23 16:52 編集

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

    キャンセル

  • fffffff

    2017/12/25 17:53

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

require_once(CLASS_PATH . "pages/admin/order/LC_Page_Admin_Order_Pdf.php");

class LC_Page_Admin_Order_Pdf_Ex extends LC_Page_Admin_Order_Pdf
{
    public function init()
    {
        parent::init();

        //帳票の種類(セレクトボックス)
        $this->arrType[0] = '納品書';
        $this->arrType[1] = '納品書(カスタム)';
        $this->arrType[2] = '領収書';

        //帳票のロード設定(セレクトボックスのPOST値をキーにする)
        $this->invoice = array(
            //初期表示(仮想値)
            -1 => array(
                'templ' => $this->tpl_mainpage,
            ),
            //納品書(デフォルトPDF、$_POST['type'] == 0)
            0 => array(
                'pdf'   => true,
                'class' => 'SC_Fpdf_Ex',
                'path'  => null,
                'templ' => 'nouhinsyo1.pdf',
            ),
            //納品書(カスタム)($_POST['type'] == 1)
            1 => array(
                'pdf'   => true,
                'class' => 'SC_Fepdf',
                'path'  => CLASS_REALDIR . 'SC_Fepdf.php',
                'templ' => 'nouhinsyo1.pdf',
            ),
            //領収書($_POST['type'] == 2)
            2 => array(
                'templ' => 'order/pdf_input_ex.tpl',
            ),
        );

        //セレクトボックスPOST値
        $this->invoiceType = -1;
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    public function process()
    {
        $this->action();
        $this->sendResponse();
    }

    /**
     * Page のアクション.
     *
     * @see data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php  LC_Page_Admin_Order_Pdf::action()
     */
    public function action()
    {
        //--- ここからLC_Page_Admin_Order_Pdf::action()と同じ ---
        $objDb = new SC_Helper_DB_Ex();
        $objDate = new SC_Date_Ex(1901);
        $objDate->setStartYear(RELEASE_YEAR);

        $this->arrYear  = $objDate->getYear();
        $this->arrMonth = $objDate->getMonth();
        $this->arrDay   = $objDate->getDay();

        // パラメーター管理クラス
        $this->objFormParam = new SC_FormParam_Ex();

        // パラメーター情報の初期化
        $this->lfInitParam($this->objFormParam);
        $this->objFormParam->setParam($_POST);

        // 入力値の変換
        $this->objFormParam->convParam();
        if (!isset($arrRet)) $arrRet = array();
        //--- ここまでLC_Page_Admin_Order_Pdf::action()と同じ ---

        $type = $this->_getInvoiceType();

        //PDF作成
        if ($type === true) {
            $arrRet = $this->objFormParam->getHashArray();
            $arrErr = $this->lfCheckError($objFormParam);

            if (count($arrErr) == 0) {
                $this->_getFpdf($arrRet)->createPdf();
                SC_Response_Ex::actionExit();
            }
            else {
                $this->arrErr = $arrErr;
            }
        }
        //領収書作成
        else if ($type === 2) {
            //カスタムフォームテンプレートをセット
            $this->tpl_mainpage = $this->invoice[$this->invoiceType]['templ'];
            //...

            //親クラスメソッドLC_Page_Admin_Order_Pdf::createFromValues()を変更したい場合は本クラスに同じクラスを作成
            $this->arrForm = $this->createFromValues($_GET['order_id'], $_POST['pdf_order_id']);

            //テンプレートデータ上書
            //$this->arrForm['title'] = '';
            //...
        }
        //初期表示、帳票作成フォーム
        else {
            //@see data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php  LC_Page_Admin_Order_Pdf::createFromValues()
            $this->arrForm = parent::createFromValues($_GET['order_id'], $_POST['pdf_order_id']);
        }

        $this->setTemplate($this->tpl_mainpage);
    }

    /**
     * 初期表示・PDF表示などの表示モードを取得
     *
     * @return boolean|int  true:PDF, int:!PDF(初期値:-1)
     */
    private function _getInvoiceType()
    {
        $type = -1;

        if ($this->getMode() == 'confirm' && isset($_POST['type']) && is_numeric($_POST['type'])) {
            $type = preg_replace('/[^0-9]+/m', '', $_POST['type']);
            if (is_numeric($type)) {
                $this->invoiceType = $type;
            }
        }

        return !empty($this->invoice[$type]['pdf']) && true === $this->invoice[$type]['pdf'] ? true : $type;
    }

    /**
     * FPDFオブジェクト作成・データセット
     *
     * @param  array  $post  POSTデータ
     * @return object        FPDFオブジェクト
     */
    private function _getFpdf($post = array())
    {
        try {
            $this->arrForm = $post;

            //タイトルが入力されていなければ、デフォルトのタイトルを表示
            if(empty($post['title'])) {
                $post['title'] = 'お買上げ明細書(納品書)';
            }

            //クラス設定
            $config = !empty($this->invoice[$this->invoiceType]) ? $this->invoice[$this->invoiceType] : $this->invoice[0];

            $invoiceClass = !empty($config['class']) ? $config['class'] : 'SC_Fpdf_Ex';
            $invoiceTempl = !empty($config['templ']) ? $config['templ'] : 'nouhinsyo1.pdf';
            $classPath    = !empty($config['path']) && is_file($config['path']) ? $config['path'] : false;

            if (false !== $classPath) {
                //カスタムPDFクラスロード
                require_once $classPath;
            }
            if (! class_exists($invoiceClass)) {
                throw new Exception("PDFクラスを読み込むことができません。クラス名:$invoiceClass");
            }

            //FPDFインスタンス作成
            $objFpdf = new $invoiceClass($post['download'], $post['title'], $invoiceTempl);

            foreach ($post['order_id'] as $key => $val) {
                $arrPdfData = $post;
                $arrPdfData['order_id'] = $val;
                $objFpdf->setData($arrPdfData);
            }

            return $objFpdf;
        }
        catch (Exception $e) {
            echo $e->getMessage();
            SC_Response_Ex::actionExit();
        }
    }
}

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

■呼び元(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/26 18: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の領収書フォームになってしまうのです。
    説明が下手で申し訳ないのですが、よろしくお願いいたします。

    キャンセル

  • 2017/12/26 19: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 12:17

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

    キャンセル

  • 2017/12/28 14: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 15:22

    Tomak様の回答してくださったことを踏まえて試行錯誤していたのですが上手くいかず…

    アドバイスいただいた通りコード等変更いたしました。

    よろしくお願いいたします。

    キャンセル

  • 2018/01/05 18:07

    Tomak様
    サンプルありがとうございます! 大変勉強になります。
    一つだけお聞きしたいのですが、以下の部分でエラーが出てしまいます…
    なんどもお手数おかけしているのは重々承知おりますが、よろしければご教示いただければ幸いです。

    //クラス設定
    $config = !empty($this->invoice[$this->invoiceType]) $this->invoice[$this->invoiceType] : $this->invoice[0];

    キャンセル

  • 2018/01/06 03:16

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

    キャンセル

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

ただいまの回答率

91.27%

関連した質問

同じタグがついた質問を見る

  • PHP

    15633questions

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

  • EC-CUBE

    223questions

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