2010年3月31日水曜日

 

【EC-CUBE】管理ページテンプレートのカスタム

在庫の「無制限」を全選択する

商品の規格ごとの価格や在庫の変更は、『管理ページ -> 商品マスタ』から商品個別の『規格』から行う。『編集』ではない。
選択した規格の全項目が表示されて、『登録』にチェック入れたり在庫を設定したり価格を設定する。
全項目の在庫を無制限にしたい時、『登録』のチェックのように「全選択」「全解除」をJavascriptで行う。

『登録』の「全選択」「全解除」を実行するスクリプト「fnAllCheck()」「fnAllUnCheck()」を参考に同じファイルに作った。

/* user_data/packages/default/js/admin.js */
function fnStockUnlimitAllCheck() {
 cnt = 1;
 name = "stock_unlimited:" + cnt;
 while (document.form1[name]) {
  document.form1[name].checked = true;
          document.form1["stock:" + cnt].disabled = true;
  cnt++;
  name = "stock_unlimited:" + cnt;
 }
}
function fnStockUnlimitAllUnCheck() {
 cnt = 1;
 name = "stock_unlimited:" + cnt;
 while (document.form1[name]) {
  document.form1[name].checked = false;
          document.form1["stock:" + cnt].disabled = false;
  cnt++;
  name = "stock_unlimited:" + cnt;
 }
}

規格登録のテンプレートに次の様に記述。

/* data/Smarty/templates/default/admin/products/product_class.tpl*/
<a href="<!--{$smarty.const.URL_DIR}-->" onclick="fnStockUnlimitAllCheck(); return false;">全選択</a>
<a href="<!--{$smarty.const.URL_DIR}-->" onclick="fnStockUnlimitAllUnCheck(); return false;">全解除</a> 

「検索結果に戻る」ボタン

商品を検索して、その情報の編集を完了すると『→続けて商品の登録を行う』とリンクが表示される。
続けて検索結果から商品の編集をしたい場合、不便なので『→検索結果に戻る』リンクを作る。

「data/Smarty/templates/default/admin/products/product_class.tpl」に『検索結果へ戻る』ボタンがあるので利用する。

/* data/Smarty/templates/default/admin/products/product_class.tpl */
<form name="form1" id="form1" method="post" action="">
<!--{foreach key=key item=item from=$arrSearchHidden}-->
<input type="hidden" name="<!--{$key}-->" value="<!--{$item|escape}-->">
<!--{/foreach}-->
 // ~ 略 ~
<input type="button" value="検索結果へ戻る" onclick="fnChangeAction('<!--{$smarty.const.URL_SEARCH_TOP}-->'); fnModeSubmit('search','',''); return false;" >

上のhiddenに検索クエリ。
これらを登録完了のテンプレートに追加。「input」ボタンを「a」タグに変更。

/* data/Smarty/templates/default/admin/products/product_class_complete.tpl */
<td height="150" bgcolor="#ffffff" class="fs18n" align="center">登録が完了いたしました。<br /> <br />
<form name="form1" id="form1" method="post" action="">
<!--{foreach key=key item=item from=$arrSearchHidden}-->
<input type="hidden" name="<!--{$key}-->" value="<!--{$item|escape}-->">
<!--{/foreach}-->
<a href="<!--{$smarty.const.URL_DIR}-->" onclick="fnChangeAction('<!--{$smarty.const.URL_SEARCH_TOP}-->'); fnModeSubmit('search','',''); return false;" >→検索結果へ戻る</a></form><br /> <br />
<a href="./product.php">→続けて商品の登録を行う</a></td>

ラベル:


2010年3月30日火曜日

 

【Perl】外部サーバとのファイル入出力

PHPには「file_put_contents()」と「file_get_contents()」があるから簡単ですが、Perlでファイルを読み書きする「open()」が扱えるのはローカルのファイルのみです。
調べると、「libwww-perl」を使ってアクセスするか「Net::FTP」を使ってファイルのやり取りをするのが簡単に出来ました。

LWP - libwww-perl

Perl - LWP - qzのメモ帳
/* 外部サーバからファイルを取得しローカルに保存 */
use LWP::Simple;
getstore("http://www.example.com/data/sample.csv", "data01.csv");

外部ファイルの内容の取得や、GETリクエストを送る「LWP::Simple」や、ヘッダを解析したりPOSTリクエストを遅れる「LWP::UserAgent」が有ります。

Net::FTP

Net::FTPでファイルのダウンロード・アップロードを自動化する - サンプルコードによるPerl入門

FTP通信をするモジュールです。ホスト名、ユーザ名、パスワードを使い、ファイルのダウンロードやアップロードが可能です。

/* 「Net::FTP」のサンプル */
use Net::FTP;

# FTPサーバへの接続(ホスト名、又はIPアドレス)
my $ftp = Net::FTP->new('www.example.com');

# ユーザ名とパスワードを指定してログイン
$ftp->login('user01', 'pass0123');

# getコマンドを使ってファイルをダウンロード
$ftp->get('public_html/data/sample.csv');
# putコマンドを使ってファイルをアップロード
$ftp->put('./data.log', 'public_html/data/data01.log');

# 接続を終了する
$ftp->quit;

ラベル:


2010年3月25日木曜日

 

【EC-CUBE】MySQLのVIEWで商品管理の規格表示を改善する

追記:2010/03/31
商品管理ページの規格が表示できずタイムアウトしていたのが(サイト自体が接続不可能になることもしばしば)、数秒で表示できるようになったので劇的な変化と言えると思う。
規格登録してる商品の価格を変更するには「商品マスタ」で商品個々の「規格」から編集するしかない。

EC-CUBE:商品管理で規格の多い商品の表示が遅い - 神宮球場近くで働くSEのブログ

「/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php」の「vw_cross_class」と「vw_cross_products_class」がボトルネックになるようで、ビューを作成して処理を軽くする。

/* view_cross_class */
create view view_cross_class as 
  SELECT
      T1.class_id AS class_id1,
      T2.class_id AS class_id2,
      T1.classcategory_id AS classcategory_id1,
      T2.classcategory_id AS classcategory_id2,
      T1.name AS name1,
      T2.name AS name2,
      T1.rank AS rank1,
      T2.rank AS rank2
    FROM dtb_classcategory AS T1, dtb_classcategory AS T2;
/* view_cross_products_class で利用する view_cross_products_class_sub */
create view view_cross_products_class_sub as
  SELECT
      T1.class_id AS class_id1,
      T2.class_id AS class_id2,
      T1.classcategory_id AS classcategory_id1,
      T2.classcategory_id AS classcategory_id2,
      T1.name AS name1,
      T2.name AS name2,
      T1.rank AS rank1,
      T2.rank AS rank2
    FROM dtb_classcategory AS T1, dtb_classcategory AS T2;
/* view_cross_products_class */

create view view_cross_products_class as
  SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id, T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2
    FROM view_cross_products_class_sub AS
      T1 LEFT JOIN dtb_products_class AS
        T2 ON T1.classcategory_id1 = T2.classcategory_id1 AND T1.classcategory_id2 = T2.classcategory_id2;

これらを使って「/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php」の「vw_cross_class」と「vw_cross_products_class」を修正する。

/* 「/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php」の修正「vw_cross_class」 */
// 修正前

"vw_cross_class" => '(
    SELECT
      T1.class_id AS class_id1,
      T2.class_id AS class_id2,
      T1.classcategory_id AS classcategory_id1,
      T2.classcategory_id AS classcategory_id2,
      T1.name AS name1,
      T2.name AS name2,
      T1.rank AS rank1,
      T2.rank AS rank2
    FROM dtb_classcategory AS T1, dtb_classcategory AS T2
)'
// 修正後

"vw_cross_class" => 'view_cross_class'
/* 「/data/class/db/dbfactory/SC_DB_DBFactory_MYSQL.php」の修正「vw_cross_products_class」 */
// 修正前

"vw_cross_products_class" =>'(
      SELECT T1.class_id1, T1.class_id2, T1.classcategory_id1, T1.classcategory_id2, T2.product_id, T1.name1, T1.name2, T2.product_code, T2.stock, T2.price01, T2.price02, T1.rank1, T1.rank2
        FROM ( 
            SELECT
                  T1.class_id AS class_id1,
                  T2.class_id AS class_id2,
                  T1.classcategory_id AS classcategory_id1,
                  T2.classcategory_id AS classcategory_id2,
                  T1.name AS name1,
                  T2.name AS name2,
                  T1.rank AS rank1,
                  T2.rank AS rank2
             FROM dtb_classcategory AS T1, dtb_classcategory AS T2 
        ) AS
        T1 LEFT JOIN dtb_products_class AS T2 ON
             T1.classcategory_id1 = T2.classcategory_id1
               AND T1.classcategory_id2 = T2.classcategory_id2) '
// 修正後

"vw_cross_products_class" => 'view_cross_products_class'

関連

【EC-CUBE】商品表示のSQLクエリを改善する - さぼてん[2009/04/03]

ラベル:


2010年3月23日火曜日

 

【PHP】動的に生成した画像を保存する時に指定したファイル名にする

GDとかImagickとかで画像を動的に作って表示させる時、PHPファイルが、例えば「image.php」だとユーザが右クリックして画像を保存しようとするとファイル名もそのままで困る。リネームすれば大丈夫だろうけど優しくない。
header()」で以下の様に指定できる。

/* PHPファイルで画像データを出力する時のヘッダ */

header("Content-Type: image/jpeg");
header("Content-Disposition: inline; filename=foo.jpg");

当然のようにIE6だと駄目らしい。E6 は、Content-Type: ヘッダーではなくファイル名(拡張子)でファイルの種別を判断するというバグがあるということで、偽装すると大方は上手くいく。

<img src="http://example.com/image.php/foo.jpg?id=1">

foo.jpg」以下は「$_SERVER['PATH_INFO']」 で取得可能。

「.htaccess」でファイル名をリネームする方法。

/* PHPファイルを画像ファイルにリネームする「.htaccess」 */

RewriteEngine on
RewriteBase /
RewriteRule ^gazou_([0-9]+)¥.jpg gazou.php?id=$1 [L]

参考元の質問者は解決してないので、バージョン等にもよるのだろう。
header()」の前に出力があると、画像として認識されずテキストが表示される。なのでXREAサーバ(広告有)だと無理。

ラベル:


This page is powered by Blogger. Isn't yours?

登録 投稿 [Atom]

Google