φ(..)メモとして残しておこう… -18ページ目

next-engine用のCSV書き出しプログラム(EC-CUBE2.11) その3

ここまできたら、あとは簡単。

next-engineの設定で
「基本情報」→「店舗設定」
のところで、店舗を楽天の店舗として登録。
ホントはらくてんじゃないけど…。

受注ファイルのアップロード設定を「新楽天市場標準パターン」にしておけば、べつにその必要はないのかなぁ…?

まあ、いいや。

とりあえず、複数配送の受注データは取り込めるようになったので。


今回データを作っていて思ったのが、EC-CUBEのDBは商品毎に注文者、配送先の情報に紐付けしたデータの持ちかたをしていないってこと。
最初は、DBから必要なデータを抜き出してくりゃ楽勝…とか思っていたんだけど、単体配送の場合と複数配送の場合でもデータの持ち方が違うし、どうやってもCSVデータが作れなかった。

結局、どんなに「CSV出力設定」でSQLをカスタマイズしても、目的のデータが得られないということが判明。

やるなら、自分でDBをカスタマイズして登録しておく必要がある。

今回、必要なデータがどこにあるかわかったので、データをちゃんと保存しておくようにDBのカスタマイズを行います。

けど、今回はこれにて。


とりあえずの応急処置だけど、next-engineの開発元の人が見てたら、参考にして早いとこEC-CUBE2.11対応BatchFileを作ってくださいな。


散々待って、届いたBatchがあれじゃぁねぇ…。


需要があれば、完全版Batchを作りますが。


なんだかんだで、2日もかかってしまった。
まぁ、授業をやりながらなので時間がないからしょうがないか…。



追記。
「/data/class/helper/SC_Helper_mail.php」の「sfSendOrderMail」には


$where = "order_id = ?";
$arrRet = $objQuery->select("*", "dtb_order", $where, array($order_id));
$arrOrder = $arrRet[0];
$objQuery->setOrder('order_detail_id');
$arrTplVar->arrOrderDetail = $objQuery->select("*", "dtb_order_detail", $where, array($order_id));

$objProduct = new SC_Product_Ex();
$objQuery->setOrder('shipping_id');
$arrRet = $objQuery->select("*", "dtb_shipping", "order_id = ?", array($order_id));
foreach (array_keys($arrRet) as $key) {
$objQuery->setOrder('shipping_id');
$arrItems = $objQuery->select("*", "dtb_shipment_item", "order_id = ? AND shipping_id = ?",
array($order_id, $arrRet[$key]['shipping_id']));
foreach ($arrItems as $itemKey => $arrDetail) {
foreach ($arrDetail as $detailKey => $detailVal) {
$arrRet[$key]['shipment_item'][$arrDetail['product_class_id']][$detailKey] = $detailVal;
}

$arrRet[$key]['shipment_item'][$arrDetail['product_class_id']]['productsClass'] =& $objProduct->getDetailAndProductsClass($arrDetail['product_class_id']);
}
}



って項目があるので、この辺りを追っていけば、楽にデータ作れるのかもね。

都道府県番号(pref)を配列にしておくと便利。

ただ今、EC-CUBEにてnext-engine用のCSV書き出しプログラムを作成中。

なんでこうなったかというと、next-engineのEC-CUBE2.11対応が不完全(というより、備考欄に「複数配送アリ」と出るだけ)なので、複数分割されたCSVをアップロードすることで対応しよう…と。

メール受注で対応させるという手もあるにはあるのだけれど、Smartyを弄るより、CSVを書き出すプログラムを書いてしまったほうが早いので、そうすることに。

それなら、next-engineだけじゃなくて他の他店舗統合管理ソフトでも扱えるし。

で…。


prefコードを都道府県番号で連想配列にしておくと便利なので、φ(`д´)メモメモ...。


$pref = array('1'=>'北海道','2'=>'青森県','3'=>'岩手県','4'=>'宮城県',
'5'=>'秋田県','6'=>'山形県','7'=>'福島県','8'=>'茨城県',
'9'=>'栃木県','10'=>'群馬県','11'=>'埼玉県','12'=>'千葉県',
'13'=>'東京都','14'=>'神奈川県','15'=>'新潟県','16'=>'富山県',
'17'=>'石川県','18'=>'福井県','19'=>'山梨県','20'=>'長野県',
'21'=>'岐阜県','22'=>'静岡県','23'=>'愛知県','24'=>'三重県',
'25'=>'滋賀県','26'=>'京都府','27'=>'大阪府','28'=>'兵庫県',
'29'=>'奈良県','30'=>'和歌山県','31'=>'鳥取県','32'=>'島根県',
'33'=>'岡山県','34'=>'広島県','35'=>'山口県',
'36'=>'徳島県','37'=>'香川県','38'=>'愛媛県','39'=>'高知県',
'40'=>'福岡県','41'=>'佐賀県','42'=>'長崎県','43'=>'熊本県',
'44'=>'大分県','45'=>'宮崎県','46'=>'鹿児島県','47'=>'沖縄県'
);

Flashでコンポーネントのカスタマイズ

Flashでコンポーネントを使用したとき、使用している文字のサイズやフォントなんかは、プロパティではなくActionScriptで指定しなければならないようです。

うーん…。

例えば、こんな感じです。



//ボタンコンポーネントの文字サイズを変更する

var tf:TextFormat=new TextFormat();
tf.size=15;
tf.color = 0xFF0000;
tf.bold = true;
tf.font = "Arial";

インスタンス名.setStyle("textFormat",tf);



できたら、プロパティでいじれるようにしてほしかったなぁ…ボタンコンポーネントとかは。

ドロップダウンリストの中にチェックボックスを入れる。

チェックボックスのリストが大量になるアンケートフォームを作成していると、それを並べるだけでページが長くなってしまうことが多いので、チェックボックスをプルダウンメニューにしておきたい。

で、jQueryを使うことに。

DROPDOWN CHECK LIST (jQuery)


使い方は、簡単。



<script type="text/javascript" src="./js/jquery-1.6.1.min.js"></script>
<script type="text/javascript" src="./js/jquery-ui-1.8.13.custom.min.js"></script>
<link rel="stylesheet" type="text/css" href="./css/jquery-ui-1.8.13.custom.css">
<script type="text/javascript" src="./js/ui.dropdownchecklist-1.4-min.js"></script>


こんな感じでjQueryとjQuery-UI、それからdropdownchecklist.jsを読み込んでおく。
で、使いたいページのヘッダーに以下を記述。


$(document).ready(function() {
$("#id").dropdownchecklist( {width: 200 } );
});



あとは、select-boxの「id」に「#id」で指定したidを入れてあげるだけ。


<select id="id" multiple="multiple" name="Ans[]">
<option>中城御殿跡</option>
<option>安谷川御嶽</option>
<option>仲田殿内跡</option>
<option>安谷川</option>
<option>板井戸</option>
<option>上之橋</option>
<option>本家新垣菓子店</option>
<option>新垣カミ菓子店</option>
<option>羽地朝秀生家跡</option>
<option>佐司笠樋川</option>
<option>世果報御井小</option>
<option>盛光寺</option>
<option>宝口樋川</option>
</select>


$φ(..)メモとして残しておこう…
こんな感じになりますた。

配列データをシャッフルする時に、キーの値を維持。

配列のデータをシャッフルする時に「shuffle()」関数を使用すると、配列のキーが数値に置き換わってしまう。

という訳で、いろいろ検索してみたところ、以下のようなコードを発見。

------------------------------------

function array_shuffle($array){
$keys = array_keys($array);
shuffle($keys);
foreach($keys as $key){
$result[$key] = $array[$key];
}
return $result;
}

-----------------------------------

おお!使えるかも!…と思ったけど、考えてみたら今やってる配列はキーが数字の2次元配列なので必要なかった。

でも、なにかの折に使いそうなんでφ(`д´)メモメモ...。

EC-CUBE 2.11 顧客データのお引越し その2

顧客データをCSVにしてインポートしようとしたら、エラー。
key2に値がはいってませんよ…と。

key2といえば、dtb_customerのsecret_keyってカラムなんだけど、正直何のためにあるのやら。

いろいろ調べてみたところ、以下のようなことが分かった。

・ユーザの仮登録機能に必要な、同一ホスト内でのユニークIDである

なんだろ?
本登録を行う際にこれを使って本登録用のURLパラメータでも生成するのかな?
今回の案件は仮登録機能を使ってないのでよくわかりません。

ただ、どちらにせよNullが許されないユニークデータなので、アルゴリズムどおりに作っておきましょう。




$head = $head = "r";//本会員登録の場合?仮会員登録機能がONなら"t"らしいけど…

//----------------(function gfMakePassword($pwLength))-----------

// 乱数表のシードを決定
srand((double)microtime() * 54234853);

// パスワード文字列の配列を作成
$character = "abcdefghkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ2345679";
$pw = preg_split("//", $character, 0, PREG_SPLIT_NO_EMPTY);

$password = "";

for($i = 0; $i<$pwLength; $i++ ) {

$password .= $pw[array_rand($pw, 1)];

}

//----------------(ここまで)-----------


//----------------(function sfGetUniqRandomId($head = "")より)-----------

// 予測されないようにランダム文字列を付与する。
//$random = GC_Utils_Ex::gfMakePassword(8);→つまり、上の部分で$passwordで取得なので省く

// 同一ホスト内で一意なIDを生成
$id = uniqid($head);
$secret_key = $id . $secret_key;//ほんとはreturn $id . $random;で返してるけど今回はこれでおk

//----------------(ここまで)-----------



「/data/class/helper/SC_Helper_Customer」の「sfGetUniqSecretKey()」で
「SC_Utils_Ex::sfGetUniqRandomId('r')」から
「/data/class/util/GC_Utils.php」の「gfMakePassword($pwLength)」が呼ばれてるってことを考えると、こんな感じの生成なはず。

さすがにこれはエクセルに埋め込めないか…ということで、関数(Make_key()とか)にして前回のコードに追加。


とりあえず、これで問題はなさそうですが…。


こういった顧客データのお引越しがめんどくさいので、各ASPからEC-CUBEへの移行がなかなか進まないんだと思います。
ロックオンも、そういったところを強化すればよりEC-CUBE利用のショップが増えると思うんだけどなぁ…。

ちなみに、2.4から2.11への顧客データ移行モジュールも…動きませんでした。
移行プログラム、全部自分で書いたんですけどね…しかも1日とかで。
さすがに、あの時は死ぬかと思いました。


バージョンアップに伴うデータ移行ですらこの状況なので、他社ASPからの移行なんてもっと大変なわけです。
このあたりの負担を減らしてくれたら、他のASP使ってる顧客にもEC-CUBEへの乗り換えを勧められるんですけど。

商品点数が多くなると、DBを上手く使って動的にページ生成しないとキツいので、まさに移行を勧めるチャンスなのですが、移行にこんなに手間がかかるようではクライアントも渋っちゃいますよね。

余計な経費は払いたくないクライアント。
(自由度の高い)EC-CUBEへの移行を進めたい営業。

その狭間で、いつも苦労しているのはエンジニアです。


もっとエンジニアを評価して( ゚д゚)ホスィ…。
エンジニアの作った、あるいはカスタマイズしたシステムが利益を産んでるということを忘れないでくださいな。

EC-CUBE 2.11 顧客データのお引越し その1

ショップサーブから、ユーザーデータのお引越し。
とりあえず、生パスワードから暗号化パスワード生成は以下の通り。


---------------------------------------------------------------------

//HASH_ALGOSとAUTH_MAGICの指定
define ('PASSWORD_HASH_ALGOS', 'sha256');
define ('AUTH_MAGIC', '*');
*に入る部分は/data/config/config.phpを参照。

//HASHを作成(パスワードの暗号化)
$res = hash_hmac(PASSWORD_HASH_ALGOS, $old_pass . ":" . AUTH_MAGIC, $salt);

---------------------------------------------------------------------

要は、これらを使ってデータベースに再登録したデータをアップデートすればおk。
まずは、ショップサーブ(とかいろんなサイト)の顧客データを、dtb_customerに合わせて成形。
salt値はエクセルでランダムに生成っと。
で、以下を実行。



-----------------------------------------------------------------------

//DBアクセス部分は省略。

//HASH_ALGOSとAUTH_MAGICの指定
define ('PASSWORD_HASH_ALGOS', 'sha256');
define ('AUTH_MAGIC', 'aaaaaaaaaaaaaaaaaaaaaaaaaaaa');(←値は適当ですょ)

//顧客データ取得
$sql = "SELECT password,salt,customer_id FROM dtb_customer;";//saltの値はインポート前にエクセル関数でランダム生成してある

$data = mysql_query($sql,$link) or die("失敗!");

while( $dat = mysql_fetch_array($data,MYSQL_ASSOC) ){

$password[] = $dat;

}

//取得した配列分のループ処理
foreach($password as $val){

$old_pass = $val[password];
$salt = $val[salt];
$customer_id = $val[customer_id];

//HASHを作成(パスワードの暗号化)
$res = hash_hmac(PASSWORD_HASH_ALGOS, $old_pass . ":" . AUTH_MAGIC, $salt);

//dtb_customerのpasswordの値を$res(作成したHASH)で書き換えるSQL
$sql = "UPDATE dtb_customer SET password = '" . $res . "' where customer_id = " . $customer_id . ";";

//クエリ実行
mysql_query($sql, $link) or die("書き込み失敗…orz->SQL:".$sql);

//---------------------------------------------

//メール送信functionを実行(アカウントががメールアドレスに変わったので案内メールを送らなきゃ)
Mailsend($customer_id);(←ここはなくてもおk)


}

-----------------------------------------------------------------------



とりあえず、これで生パスワードが暗号化されて
アカウント:メールアドレス
パスワード:暗号化された以前のパスワード
でログイン可能になりますた。

eccube 2.11 キャンペーン用会員登録ページを作る その2

前回の続き。

/data/class/pages/entry/LC_Page_Entry.php

function lfSendMail($uniqid, $arrForm){}
に以下のようにして処理を追加してみる。


---------------------------------------------------

if ( $arrForm['campaign'] !== 0 ){

$objCampMail = new SC_SendMail();

ここに処理を書く。
キャンペーンIDからテンプレートを判断して読み込む…とかね。

//メール送信
$objCampMail->sendMail();

}

---------------------------------------------------

eccube 2.11 キャンペーン用会員登録ページを作る

「キャンペーンやるから、キャンペーン用の会員登録ページ作ってね」


うーん…。

とりあえず、要件は以下。


・ハガキを配布する
・キャンペーン専用webサイトにアクセスし、会員登録
・キャンペーン用サイトから会員登録した場合のみ、0円のサンプル商品を送る。
・キャンペーンの商品送付の注文は、NEXT-engineで自動受信したい


へいへい。
要は通常の会員登録の方々と分けりゃいいってことですね。

らじゃー!




まずは、キャンペーンフラグ用のカラムをDBに作成。
dtb_customerにカラムを追加。
とりあえず、INTでいいか…。
どうせ後からmtb_campaignとかいうテーブル作って、キャンペーンを複数登録できるようにカスタマイズする必要が出てくるかもしれないし。
EC-CUBEの管理画面から、クライアントが自分でキャンペーンを登録できるようにしておいてあげるのが親切ってもんだからね。

だが、今はやらねぇ!
そこんとこの機能追加は別料金ですぜ…ダンナ。

ってなわけで、今回は管理画面のカスタマイズはしません。
あとからできるようにしておくだけ…と。


よし!
カラムを作ったら、顧客管理周りのClassを書き換えるぞ…と。


/data/class/helper/SC_Helper_Customer.php

function sfCustomerRegisterParam (&$objFormParam, $isAdmin = false, $is_mypage = false) {}


$objFormParam->addParam("キャンペーン", "カラム名", INT_LEN, 'n', array("EXIST_CHECK", "NUM_CHECK", "MAX_LENGTH_CHECK"));

を追加。

基本的にプログラム周りはこれだけですな。


キャンペーンフラグのパラメータをどう渡すか…ということについては、これはやはりGETパラメータが楽かな…ということで、その方向でテンプレートをいじります。

まずは
/data/Smarty/templates/default/entry/index.tpl
から。

formタグのアクションを変更


action="?"

action="?<!--{if $smarty.post.campaign != "" || $smarty.post.campaign != Null}-->campaign=<!--{$smarty.post.campaign}--><!--{/if}-->"



これで、入力ミスで戻ってきた時もGETパラメータを引き継いだままになる。
とりあえず、パラメータ名は"campaign"にしました。

そして、FORM内に以下のコードを追加。


<!--{if $smarty.get.campaign != "" || $smarty.get.campaign != Null}-->
<!--{assign var=key1 value="`$prefix`campaign"}--><input type="hidden" name="<!--{$key1}-->" value="<!--{$smarty.get.campaign}-->">
<!--{elseif $smarty.post.campaign != "" || $smarty.post.campaign != Null}-->
<!--{assign var=key1 value="`$prefix`campaign"}--><input type="hidden" name="<!--{$key1}-->" value="<!--{$smarty.post.campaign}-->">
<!--{else}-->
<!--{assign var=key1 value="`$prefix`campaign"}--><input type="hidden" name="<!--{$key1}-->" value="0">
<!--{/if}-->



次に
/data/Smarty/templates/default/entry/confirm.tpl
の戻るボタンのアンカータグを変更。


a href="?campaign=<!--{$smarty.post.campaign}--><!--{/if}-->"




とりあえずこれで、登録周りの処理は完了です。
動作チェックしてみたら、ちゃんと新しく作ったカラムにGETパラメータで指定した数値が挿入されてます。

これにて、キャンペーンごとにフラグをたてる作業は終了。
おつかれさまでした…という訳にはいかず、メール処理を。



あ、そうそう。
いまさらですがカラム名は各自でどうぞ。

メール送信は、次回。

EC-CUBE2.11 ポイント付与のタイミングを変える

/data/class/helper/SC_Helper_Purchase.php

の中に「function isAddPoint($status)」ってのがあるので、その中のswitchを変更。


例えば、新規注文時にポイントを加算せず、配送済みにステータス移動したときにポイント加算したい場合は

switch ($status) {

case ORDER_NEW://新規注文
return false;

case ORDER_DELIV:// 発送済み
return true;

default:
break;
}

ってな具合です。