EC-CUBE2.3.xで納品書を一括出力する

EC-CUBE 2.4.0 で新たに追加された機能として、「納品書の一括出力」というのがあり、これがすごい魅力的だと常々お客様から言われてたので、2.3.4バージョンでも追加してみることに。

変更箇所は

テンプレートファイル(/data/Smarty/templates/default/admin/order)

index.tpl
pdf_input.tpl

この二つは、多分従来カスタマイズしていなければ、2.4.0バージョンのファイルと
そのまま置き換えても問題ないと思う。
ウチは、CSV出力設定へ飛ぶ部分はユーザがいぢれないように制御していたので
そこの部分を注意しながら PDFダウンロードボタンの追加や、
チェックボックスの追加をしました。

クラスファイル(/data/class/pages/admin/order/LC_Page_Admin_Order_Pdf.php)

モードによる条件分岐の部分、
        case "confirm":
の中身で コメント // エラー入力なし 以下の部分を

           if (count($this->arrErr) == 0) {
                $i = 0;
                $objFpdf = new SC_Fpdf($arrRet['download'], $arrRet['title']);
                foreach ( $arrRet['order_id'] AS $key=>$val ) {
                    $arrPdfData = $arrRet;
                    $arrPdfData['order_id'] = $val;
                    $objFpdf->setData($arrPdfData);
                    ++$i;
                }
                $objFpdf->createPdf();
            }

に置き換え。

コメント   // 受注番号があったら、セットする  以下の部分を

            if(SC_Utils_Ex::sfIsInt($_GET['order_id'])) {
                  $arrForm['order_id'][0] = $_GET['order_id'];
            } elseif (is_array($_POST['pdf_order_id'])) {
                    sort($_POST['pdf_order_id']);
                    foreach ($_POST['pdf_order_id'] AS $key=>$val) {
                          $arrForm['order_id'][] = $val;
                    }
            }


に置き換え。

クラスファイル(/data/class/SC_Fpdf.php)

ファンクション SC_Fpdf のパラメータががらりと変わっているので、 
2.4.0の記述の同じファンクションの行とそのまま置き換え。

   旧  function SC_Fpdf($arrData, $tpl_pdf = "template_nouhin01.pdf") {
      ↓   ↓ 
   新  function SC_Fpdf($download, $title, $tpl_pdf = "template_nouhin01.pdf") {

これに伴い、$arrDataで含まれてい筈のデータをセットしている部分を書き換え

 旧
        $this->pdf_download = $arrData[download];   // PDFのダウンロード形式(0:表示、1:ダウンロード)
        $this->tpl_title = $arrData['title'];

     ↓    ↓
 新
       $this->pdf_download = $download;      // PDFのダウンロード形式(0:表示、1:ダウンロード)
        $this->tpl_title = $title;

新しいファンクション setData の追加 
    function setData($arrData) {
        $this->arrData = $arrData;

        // ページ番号よりIDを取得
        $tplidx = $this->pdf->ImportPage(1);

        // ページを追加(新規)
        $this->pdf->AddPage();

        //表示倍率(100%)
        $this->pdf->SetDisplayMode($this->tpl_dispmode);

        if(SC_Utils_Ex::sfIsInt($arrData['order_id'])) {
          $this->disp_mode = true;
          $order_id = $arrData['order_id'];
        }

        // テンプレート内容の位置、幅を調整 ※useTemplateに引数を与えなければ100%表示がデフォルト
        $this->pdf->useTemplate($tplidx);
        $this->setShopData();
        //ロゴ画像
     $this->pdf->Image(PDF_IMG_DIR. 'logo.png', 124, 46, 60);
        $this->setMessageData();
        $this->setOrderData();
        $this->setEtcData();
    }

※ここで注意したいのは、logo.pngの格納場所が2.4.0では変わってしまっているため、
 ロゴ画像をセットしているところについては、従来の記述の部分にすること。

また、このファンクション追加により、ページ番号をセットしていた部分はごそっと削除。

ファンクション createPdf 内の コメント   // PDFをブラウザに送信 以下の条件文を書き換え。

        if ($this->pdf->PageNo() == 1) {
            $filename = "nouhinsyo-No".$this->arrData['order_id'].".pdf";
          } else {
            $filename = "nouhinsyo.pdf";
          }
          $this->pdf->Output($this->sjis_conv($filename), D);

        // 入力してPDFファイルを閉じる
        $this->pdf->Close();
    }

とりあえず、これで複数の受注を選択してPDF出力できるようにはなったんですが、
ページのカウントが全体で行われてしまってます。

折を見て改修します(汗)。

| | コメント (0) | トラックバック (0)

携帯のみ閲覧可にしたい

携帯待受フラッシュが PCで見ると時間取得の関数がうまく動かない為、
時間表示がおかしくなるのでPCからはアクセスできないようにしたくなりました。

で、最初はメニューページをPHPで作り、そこにUserAgentを調べて
もしPCだったらSorryの文字、携帯だったらメニューが出るようにしてみたんですが

PCで確認するとSorryって出てるのにau端末では なぜか404エラーに!

何だろう・・・? ちょっと原因わかんない。

ということで .htaccessでフォルダごと携帯専用にしちゃうことにしました。

正しくアップされたかPCで確認していたのですが、それも出来なくなるので
開発側としてはちょっと面倒なんですが
結局は実機でダウンロード→動作確認するので、まぁ同じかな、と。

docomo  Softbank  au  それぞれが IPを公開しているので それを調べて
.htaccessに登録しました。

order deny,allow
deny from all

allow from 210.230.128.224/28
allow from 61.117.0.128/25
allow from 61.117.1.128/25
allow from 218.222.1.0/25
allow from 121.111.227.160/27
  ・
  ・
  ・

 --以下略--

これって、IPのリストを最新にしておかないと 「私の機種ではつなげません」って人が出て来るってことなので あまりいい方法とは言えない気がします(汗

| | コメント (0) | トラックバック (0)

今さら!携帯待受Flash

ちょっと時間が余り気味なので、趣味の要素を盛り込んだ携帯待受のFlashを作ってみることにした。

以前も少し勉強してみて、普通のFlashで使える関数が使えなかったりするあたりは理解していたのだが、待受となるといくらテスト用とは言え、つまらない画像を置いておく気にはなれなかったので、何かいい画像があったら・・・等と放置してたのだ。

ちょうど気に入った画像素材がたまってきたので、早速作成してみることに。

手始めにオーソドックスな、開く度にランダムな画像を出しつつ時間を表示するタイプと、電波の状況によって画像が変化するタイプ2種類を作ってみた。

簡単なものはどちらもサクっと出来たのだが、ランダムな画像を出すタイプの方で画像の種類を増やしてみたところ、プレビュー時に「不正イメージデータです」のメッセージが出て動かなくなってしまった。

Flash Lite1.1 で、作成の環境としては、WindowsのFlash CS4。

出力されたメッセージを元に調査してみると、どうもプレビューに使用されるDevice Central というツールのバグらしいことが解った。

Adobeのサイトに飛び、この現象の回避方法を試してみたのだけど、ダメ。うまく行かない。

そもそも、Device Central CS3に限った不具合のように書かれている。こちらの環境はCS4だ。
ということは回避方法も違うのか? とあちこち検索しまくっているがCS4についての情報があまりにも少なすぎ。

なんか画像の枚数が多くなるとこのエラーが出る、というような情報も見つかった。
つまりは、Device Central とは関係ないエラーなんだろうか?

全体のファイルサイズを確認しても、81KBで押さえてあるのでサイズオーバーということも考えられないけど。

結局、この状態が出るのは Flash Lite 1.1でパブリッシュした時であって、2.xでは出ない。

ということで苦肉の策としては、画像5枚バージョンは Flash Lite1.1で、画像7枚バージョンは Flash Lite 2.0で作った。
古い機種は切り捨てみたいな考え方で少しすっきりしないんですが。

自分のテスト機、docomoの方はFlash Lite2.xに対応しているらしく、無事に画像7枚バージョンが動いているので、とりあえずはこのまま完了ということで。。。。

| | コメント (0) | トラックバック (0)

OpenPNE 備忘録

昨日インストールしたOpenPNEですが、やっといろいろいじり出してみています。

まずはスキンを変更してみました。
実に面白い作りだなぁ、と思いました。

メニューバーのボタン類は、ひとつひとつ細切れの画像ではなく、
バーとして一つの画像になってました。
通常用とマウスオーバー用と2種類用意しておけばいいみたいです。

ただし、CSSにて位置をガチガチに指定してあるので、
好き勝手なボタンの大きさや数に作ってしまうと、その後の調整が大変っぽいです。

その辺りは、もしデザイン会社さんと組んで SNSサイトを作るような事になった場合
デザイン会社さんには理解してもらいたい部分でした。

それと、日記のページでは、投稿した年月日と時間が表示されているのですが、
年月日の部分のカラム幅が微妙に小さくて、

2009年10月06

09:30

こんな感じになっちゃってました(>_<)

Default1_3

なので、どこを直せばいいのかを探してみた結果、
PC用のテンプレートの格納場所は

/webapp/modules/pc/templates

でした。

fh_diary.tpl の 中の
<td style="width:95px;" class="bg_05" align="center" valign="top" rowspan="3">

この部分をコメントアウトし、

<td style="width:105px;" class="bg_05" align="center" valign="top" rowspan="3">

と広げてみました。

もちろん、その隣に来るべきカラムの幅も帳尻を合わせました。

<td style="width:424px;" class="bg_02" align="left" valign="middle">
   ↓↓↓
<td style="width:414px;" class="bg_02" align="left" valign="middle">

日記の本文と、それに対するコメントの分、2カ所修正しました。

テンプレートを修正しても、Smartyが認識してくれなかったみたいなので
手動でキャッシュを消してみました。

キャッシュの場所は

/var/templates_c/

です。

After_3

とりあえず、今日のところはここまで。。。

また、いろいろ改修したら書き留めて置くことにします。

 

| | コメント (0) | トラックバック (0)

XREAにOpenPNEインストール

先日、OpnePNEの案件の話を持ち込まれたので、ちょっと勉強してみようかな、と思い、XREAサーバに OpenPNE-2.10.5 を入れてみました。

osCommerceやEC-CUBEを入れる時に結構苦労を伴うサーバなので、覚悟しておいたのですが、とってもすんなり行きました。

この環境は、同じドメインでEC-CUBE他、Xoopsなども入れており、public_htmlをそのままルートとして使うことはできません。

そこで、public_htmlの下にsnsというフォルダを作り、そこに必要なファイルを格納しました。

非公開エリアに格納する bin,lib,varなどなどのフォルダは public_htmlフォルダのひとつ上の階層に置きました。

それなので、config.inc.php内の require_once の部分に記述するパスを
'../'  → '../../'  に変更しといたくらいが注意点でしょうか。

他のパッケージと違い、データベースに対して、自分でSQLを流さなければならないのは、ちょっと面倒だな、と感じました。
しかも、なぜ create_tableのファイルとInsertのファイルと分かれているのかしら?
一つにしてくれればいいのに。。。

さて、とても呆気なくインストールが終わり、テストとしてフレンド招待のメールを送ってみました。

・・・届きません。

XREAで同じようにメールが届かない、という質問のサイトを見つけ、

config.php内の

// Envelope-From ヘッダを設定するかどうか(safe_mode の場合は false に設定してください)
define('MAIL_SET_ENVFROM', true);

この部分を false にすれば良いということだったので、そのようにしてみたら、無事に解決しました。

備忘録というほどのものにもならないのですが・・・ 一応書き留めて置きます。

| | コメント (0) | トラックバック (0)

EC-CUBE 2.3.3高速化

EC-CUBE2.3.3を使用していて、商品点数が多いサイトでは商品一覧の表示がメチャ遅かったのと、
下手するとサーバから応答が無くなってしまうことがあったので、手を入れることになりました。

DBはMySQLを使用していたのですが、
まずは クエリー内にDISTINCT とGROUP BYが使われているとテンポラリーテーブルを作成する、という情報を得ました。
http://dev.mysql.com/doc/refman/5.1/ja/distinct-optimization.html

さて、実際に作りを見てみると、Viewテーブルにすべての商品中で販売のために「有効」なフラグが立っているものがすべて格納されている状態だったのですが、このViewに DISTINCTとGROUP BYが使われておりました。

さらに、商品一覧画面に「○件見つかりました」を出すために、カテゴリに一致した「有効な商品」の全件数を取得するクエリーと、
ページに表示する商品を取得するクエリーは ほぼ同じものを使っていました。

件数を調べるためには、商品の在庫数や価格を保持しているテーブルにわざわざJOINしなくても良いのに、 ご丁寧に4つも5つもテーブルをJOINしまくっておりました。

そして、ページ単位の商品情報を取得する際に、そのクエリーの最後にLIMITを追加してもういちどデータ取得・・・ そんな作りでした。

今回、件数を取得するためには 商品テーブルとカテゴリテーブルの二つだけを使用するようにしました。

また、今回のデザインと運用では、商品の『規格』ごとに金額が違わないことと、在庫の表示が不要なこと、それと一覧表示の並び順にカテゴリの優先順位が必要でないことから、実際に表示に使わない項目を持つテーブルはJOINから外しました。

実際に作ったクエリーを phpMyAdmin上から流してみると、実行時間は
 EC-CUBE本来の方 ・・・ 1.9546
 今回新しく作った方  ・・・ 0.0021

というような結果が出ました。

一覧表示でもう一つ遅い原因と思われるのが、画像のリサイズ関数をかましていることです。

こちらは外せばいいのでしょうが、デザインにも関わってきますし、扱っている商品が「画像が命」的な部分もあり、ガビガビなのは許されない状態です。

ということで、今回は一覧用のデータ取得の部分のみの手入れで終わりました。

カテゴリの検索結果で108件取得できたページの速度
 改善前・・・ 約20秒~40秒
 改善後・・・  約 5秒~15秒
  ※その時のサーバの負荷の状態により変わります

ちなみに、2.4.0のリスト表示のクラスを見てみたところ、
さすがに「件数取得」の部分のクエリが軽そうなものに変っていました。

「早さが改善された」と言われていましたが、この部分は大きそうです。

| | コメント (0) | トラックバック (0)

EC-CUBEのサーバお引っ越し

今までギガント2に乗せていたEC-CUBEの引っ越し作業してます。

今度はVPSなので、自由度が高いんですが、その代わり共用サーバでは普通に設定されているような事が初期値になってなかったりして、php.iniをEC-CUBE向けに変更した点を忘れないように書いておきます。

safe_mode = Off
↑Onになっているとダメです。

max_execution_time = 60     ; Maximum execution time of each script, in seconds
↑商品CSVの点数が多すぎてタイムアウトになってしまうので長くしました。

memory_limit = 64M      ; Maximum amount of memory a script may consume
↑これも商品CSVの作成の時にエラーになるのを防ぐため多くしました。

upload_max_filesize = 8M
↑商品CSVのアップロード対応。長めの商品説明文のようなので余裕を持って多くしました。

mysql.connect_timeout = 180
↑管理権限のセッションが切れてしまう不具合はここを長めにすると良いという情報のもと、長めにしてみました。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
↑これらがコメントアウトされていると、CSVアップロードで文字化け発生。

以上デス。
また変更したものがあったら、随時追加していきます。

| | コメント (0) | トラックバック (0)

ギガント2にA8アフィリエイト

ファーストサーバが提供している『ギガント2』を借りて
EC-CUBEでショッピングサイトを経営しているお店が、
今度は『A8netのアフィリエイトのモジュールを組み込んだが動かない』と
いってきたので調査しました。

ギガント2(に限らないかも?)では、セキュアなページは /virtual/ssl/ という
フォルダ内にファイル一式を上げておく必要がある。
(通常は /virtual/www/ 内へと完璧に分かれている)

よって、組み込むモジュールによって、セキュアなページ内で使うものであれば
/virtual/ssl/data/downloads/module/
この中にデータを格納しなくてはならない。

もちろん、非セキュアなページ用のモジュールであれば
EC-CUBEをインストールした中の /data/downloads/module/  の中で良い。

今回はA8netは 買い物完了画面へ必要タグが埋め込まれる仕組みなので
こちらはセキュアなページ側となるので
/virtual/ssl/data/downloads/module/ 側にアップする必要があったのでした。 

一点、通常管理画面はセキュアなページ側に置くのだけれど、
そうすると 商品管理画面からアップされる画像が
/virtual/ssl/html/upload/save_image/  の中に格納されてしまうため、
通常のトップページや商品一覧ページからはリンクされなくなってしまう。

このあたりも、運用でカバーするなど 難しいところでしたが。

EC-CUBE使うのにFirstServerギガント2はおすすめできないかも、
というのが使ってみての感想です。

| | コメント (0) | トラックバック (0)

ジオシティーズでPHPメールフォーム

ジオプラスという有料サービスでCGI・PHPが可能だということで、
今回はジオシティーズにメールフォームを載せる依頼が来ました。

「フン」とタカをくくっていたら、かなり痛い目に遭いましたので覚え書き。

■phpの拡張子を持つファイルは、URLが http://cgi.*****~ となる。

 ↑コレには参りました。 呼び出し側のhtmlのformタグ中に、
 htmlと同じフォルダ内にあるから action="hoge.php" とだけ記述していたら
 該当するページが見つからない趣旨のエラーが出てしまいました。

 phpファイルの場合、どういうアドレスになるのかを知るには、
 ジオシティーズの管理画面で用意されている ファイル一覧を見る画面で
 「表示」をクリックするとブラウザが立ち上がるので、アドレスバーにて確認。

■Yahoo!に登録しているメールアドレスでないと、送信できない

 ↑Yahoo!にログインして、自分が登録しているアドレスを確認し、
 それをFromにセットしてあげると無事解決。

 ・・・なんだけど、管理者宛に送られるメールの送信者はユーザーにしたいのに
 それは無理ということなんだよね-。

とりあえず、上記の事を押さえておけばオッケーかな。

| | コメント (0) | トラックバック (0)

EC-CUBE 携帯からの注文確認メールにヘッダを付ける

携帯サイトから商品注文された際に、ユーザに自動で送られるメールの中にヘッダ・フッタが付かない、という現象が発生しました。

注文の際に自動で送られるメールのテンプレートIDは、携帯の場合は2です。(PCは1)

これは、マスター管理で自由に変更ができるのですが、実はやっちゃいけないことがわかりました。

というのは、商品注文のプログラム中で、テンプレートIDを固定で指定してしまっているからです。 びっくりですねぇ、怖いですねぇ。

で、さらに モバイル用のテンプレート中には ヘッダとフッタが記述されていませんので、

<!--{$tpl_header}-->

<!--{$tpl_footer}-->

を追加してみました。

ところが、テンプレート設定画面で設定した、モバイル用のヘッダ・フッタではなく、 PC用の受注確認メールに設定したヘッダ・フッタが付加されるんです (@_@;

で、原因を調べましたら・・・

/data/class/helper/SC_Helper_Mail.php

このファイル中の88行目付近に、ヘッダ・フッタを取得してくる関数があります。

$arrRet = $objQuery->select("subject, header, footer", "dtb_mailtemplate", $where, array('1'));

これって・・・ Where区がID1固定ですから PC用のヘッダ・フッタを取得してくるのは当たり前ですよね。。。

ということで、この行を以下のように変更しました。

$arrRet = $objQuery->select("subject, header, footer", "dtb_mailtemplate", $where, array($template_id));

これで、テンプレートIDに応じたヘッダ・フッタを取得してきてくれるようになりました。

HAPPY♪ です。

| | コメント (0) | トラックバック (0)

«au端末でデータをPOSTできない!!