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

配送先ごとに個別送料を表示する。…の続き。

配送先ごとに個別の送料を計算するってことは、それも表示したほうがいいので、表示することに。

/data/Smarty/templates/default/shopping/confirm.tpl

を弄って、表示できるようにしなきゃ…。

…と、その前に'SC_CartSession.php'のお届け先ごとに送料を計算する処理でデータをセッションに書き込む。

$_SESSION['multi_deliv'][$loop]['deliv_fee'] = $deliv_fee;

こんな感じかな。


でもって、'confirm.tpl'に戻って

<tr>
<th scope="row">電話番号
<td><!--{$shippingItem.shipping_tel01}-->-<!--{$shippingItem.shipping_tel02}-->-<!--{$shippingItem.shipping_tel03}-->
</tr>

の下辺りに以下を追加。

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

<!--{assign var="name" value=$smarty.foreach.shippingItem.iteration-1}-->
<!--{if $is_multiple}-->
<tr>
<th scope="row">個別送料</th>
<td><!--{$smarty.session.multi_deliv.$name.deliv_fee}-->円</td>
</tr>
<!--{/if}-->

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

<!--{assign var="name" value=$smarty.foreach.shippingItem.iteration-1}-->

"name"という変数の中にforeachで繰り返されるshippingItemの現在のループ回数を入れる。

トータルのカウント->count($shippingItem)を取る場合は
{$shippingItem|@count}
…まあ、それはおいといて。

今回の場合は、
$loop = 0;
foreach($a as $b){

処理;
echo $loop;
$loop++;

}

みたいな感じで、現在のループ回数を取得。

「-1」しているのは、0からではなく1から始まるから。
なんでだろ?



<!--{$smarty.session.multi_deliv.$name.deliv_fee}-->

要するに、phpでいうところの
echo $_SESSION['multi_deliv'][$name]['deliv_fee'];






Smartyについてですが…
{assign} | Smarty
(注)
テンプレート内で変数に代入するというのは、これは本来はPHP側でやったほうがうまく処理できることでしょう。自己責任のもとで使いましょう。

だそうです。
個人的にそう思います。

つか、Smartyはテンプレートエンジンなのでロジックを書くなとかなんとか色々言われてるけど、PHP自体Smartyみたいな使い方をする埋め込みコードなんで、正直smartyなんていらな(ry

ページを一度だけリロードする。

ページを1度だけリロードしたい。


ヘッダに以下を記述

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

<script language="JavaScript">
function rCheck()
{
if (window.name != "2thwindow")
{
location.reload();
window.name = "2thwindow";
}
}
</script>

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

bodyに以下。

<body onLoad="rCheck()">

以上。

EC-CUBE2.11 EC-CUBEとは関係の無いページから商品購入ボタン

EC-CUBEで使われているSmartyでページをカスタマイズするのもいいけれど、BiNDなんかを使って作ったサイトにカートボタンを設置したい。。。

2.4系の場合には、スムーズにいけたんだけど2.11系からはトランザクショントークンの妥当性を検証するようになったので、トランザクショントークンを生成しなければならなくなった。

って訳で、トランザクショントークンの妥当性チェックをなくしちゃいます。


/data/class/helper/SC_Helper_Session.php

function isValidToken()
の202,205行目あたりを

$ret = false;

$ret = true;

に変更してしまいましょう(´∀`*)

あとは、カートボタンを設置したいページに以下を記述。

<?php
$token = sha1(uniqid(rand(), true));
$_SESSION[TRANSACTION_ID_NAME] = $token;

print <<< EOF
<form name="form1" id="form1" method="post" action="/shop2/products/detail.php?product_id=◎">
<input type="hidden" name="transactionid" value="{$token}" />
<input type="hidden" name="mode" value="cart" />
<input type="hidden" name="product_id" value="◎" />
<input type="hidden" name="product_class_id" value="●" id="product_class_id" />
<input type="hidden" name="quantity" value="1" />
<input type="image" src="/画像データパス/btn_cartin.jpg" alt="カゴに入れる" />
</form>
EOF;

?>

◎が商品ID
●が規格利用の場合の規格ID


<input type="hidden" name="classcategory_id1" value="■" id="classcategory_id1" />
<input type="hidden" name="classcategory_id2" value="■" id="classcategory_id2" />

上記を指定することで、細かい規格(?)指定も可能。
基本的には、Smartyで出力されたソースをコピペして「product_id」と「transactionid」を入れてあげれば
(;・∀・)ダ、ダイジョウブ…なはず。


本当は、ちゃんとクラスファイルを読み込んで処理しなきゃいけないのだけれど、簡易処理。


* 悪意のある不正な画面遷移を防止するため, 予測困難な文字列を生成して返す.
* 同時に, この文字列をセッションに保存する.

いや、まあ…どんな影響があるかはわからないので、カスタマイズは自己責任で。

ちゃんとお金を払って、「ちゃんとクラスファイルを読み込んで処理」をしてもらったほうがいい場合もあるかもしれません。

金額は…応相談で。

eccube2.11 配送先毎に送料を加算。

EC-CUBE2.11系で、一番変わったところといえば複数の配送先指定ができること。

でも、どう考えても複数の配送先に個別に送料を加算できるようにはなっていない。

ってわけで個々の配送先に送料を計算するためのカスタマイズを…。


今回カスタマイズした配送方法一覧

メール便・210円
送料無料メール便・0円
通常宅配・525円
送料込みの通常宅配・0円
宅配クール便・775円
送料込みクール便・0円
メール便には商品毎に同梱最大数が設定されていて、それを超えた場合には通常宅配便扱い・525円


商品の組み合わせと配送料

メール便のみ・210円
無料メール便のみ・0円
通常宅配+メール便・735円
通常宅配+無料メール便・525円
通常宅配のみ・525円
送料込宅配+メール便・210円
送料込宅配+無料メール便・0円
送料込宅配のみ・0円
クール便のみ・775円
クール便+メール便・985円
クール便+無料メール便・775円




…と、とっても組み合わせが多い。

さらに、配送先別に商品代金が5250円を超えたら送料無料に。

っつーことで、配送先が複数あった場合の処理をφ(`д´)メモメモ...





data/class/SC_CartSession.php

function calculate()

foreach ($cartItems as $item)内の
"// 合計を計算"の直前に処理を追加


-------------処理-----------------------------------------------

if ( count($_SESSION['shipping']) > 1 ){

//とりあえず、$results['deliv_fee']を0にしておく
$results['deliv_fee'] = 0;

//人数分の繰り返し
foreach ( $_SESSION['shipping'] as $deli) {

//フラグ関係を初期化
$_SESSION['flg']['mail'] = 0;
$_SESSION['flg']['cool'] = 0;
$_SESSION['flg']['normal'] = 0;

//配送先別の商品総額も初期化
$total_indiv = 0;

$temp_list = $deli['shipment_item'];
$item = array_keys( $temp_list );//商品のコードを配列から取得

//商品分の繰り返し
for ($loop = 0; $loop < count($item); $loop++){

$item_code = $item[$loop];

//商品購入数を(ry
$quant = $item_code;
$quantity = $deli['shipment_item'][$quant]['quantity'];

/*DBから必要なデータを取得
*同じクラス内にfunction Example()で処理を書いておく
*商品コードからメール便フラグ・クール便フラグ・送料フラグ・商品価格等を取得
*/
$haisou = $this->($item_code);

//フラグを立てる処理。これも処理を書いておく…
$flags = $this->Flags($haisou);

//商品の購入金額
$temp_indiv = $haisou['sell_price'] * $quantity;
$total_indiv += $temp_indiv;

}//商品分の繰り返し

//フラグから送料を取得する処理も(ry
$deliv_fee = $this->FlgToDeliv($flags);

//個別の購入金額が5250円以上なら、送料無料
if ( $total_indiv > 5249 ) { $deliv_fee = 0; }

$results['deliv_fee'] += $deliv_fee;

}//人数分の繰り返し

}

------------------ここまで------------------------------------------


いやぁ…疲れた。


デフォルトの状態の処理なら、最新の記事を見てください。

外部から、EC-CUBEのクラスを使う。。。

とりあえず、
ルート/テキトーなフォルダ名/
においたPHPファイル(example.php)から、EC-CUBEのクラスを使ってみる。

---------------[example.php]---------------

require_once("/var/www/html/****/admin/require.php");//フルパス
require_once(CLASS_PATH . "pages/admin/LC_example.php");

$objPage = new LC_example();
register_shutdown_function(array($objPage, "destroy"));
$objPage->process();


---------------[example.php]---------------


---------------[LC_example.php]---------------


require_once(CLASS_PATH . "pages/LC_Page.php");

class LC_example {

 function process() {

//ここに処理を書く

 }

 function destroy() {
// parent::destroy();
 }

?>


---------------[LC_example.php]---------------

こんなかんじかなぁ…。
時間のあるとき試してみよう。

EC-CUBE2.11 カート処理をいじる。

EC-CUBE2.4系の場合、カートの処理をいじりたい場合には
data/class/helper/SC_Helper_DB.php
をいじっていた。

メール便の場合は送料210円に。
メール便の場合に同梱できる数量を商品毎に設定して、それを超えたら通常の宅配便で送る。
通常便の場合には送料一律525円。
送料無料のメール便に通常配送のセットなら、525円。
メール便+通常商品の場合には(210円+525円)735円。
メール便+通常商品でメール便の同梱数量が超えた場合は525円で通常商品に同梱。
クール便の場合には250円プラス。
クール便+通常商品の配送料金は1300円(525+775円)

…という感じで、それぞれに細かく配送料金が変わってくるような場合、データベースのカラムをいじってフラグを立てまくって、処理も複雑なものになりがち。

2.11系の場合には、
data/class/helper/SC_Helper_DB.php
ではなく
data/class/SC_CartSession.php


function calculate()

でそれを行う。

foreach ($cartItems as $item) {}

の部分で、商品毎に処理をしているので
$item['productsClass'][product_id]
で商品コードを取得して処理を行い
$results['deliv_fee']
に値を入れていくという作業を繰り返す。

処理が複雑で大変。。。

7/12現在、EC-CUBEへの商品登録数…2380件。
登録カテゴリ数…206件。


とりあえず、EC-CUBE2.4.4から2.11.1へのお引越しも間近。
ひとつのEC-CUBEで複数のサイトを運営しているんで、そのへんの処理が終わればだいたい終了…と。

1週間でやる作業じゃなかったなぁ…。

よくよく考えてみたら、2.4系から2.11系へのバージョンアップって、数字的にはマイナーバージョンアップみたいだけど、ほとんどメジャーバージョンアップ。

データベース構成も変更になってるし、プログラムのロジックも大幅変更。

eccube2.4xから2.11への顧客情報移行時のパスワード

基本的には、[dtb_customer]、[dtb_other_deliv]のデータをそのままインポート。
Navicatが便利すぎる。。。

旧バージョンの'data/cacha/mtb_constants.php'の

/** 認証用 magic */
define('AUTH_MAGIC', "**************************");

ってところの値を2.11.0の'data/config/config.php'のAUTH_MAGIC値に上書き。


2.11の'data/class/util/SC_Utils.php'

function sfIsMatchHashPassword($pass, $hashpass, $salt) {
$res = false;
if ($hashpass != '') {
if (AUTH_TYPE == 'PLAIN') {
if($pass === $hashpass) {
$res = true;
}
} else {
$hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
if($hash === $hashpass) {
$res = true;
}
}
}
return $res;
}





function sfIsMatchHashPassword($pass, $hashpass, $salt) {
$res = false;
if ($hashpass != '') {
if (AUTH_TYPE == 'PLAIN') {
if($pass === $hashpass) {
$res = true;
}
} else {
if (empty($salt)) {
// 旧バージョンからの移行を考慮
$hash = sha1($pass . ":" . AUTH_MAGIC);
} else {
$hash = SC_Utils_Ex::sfGetHashString($pass, $salt);
}
if($hash === $hashpass) {
$res = true;
}
}
}
return $res;
}



に変更。(2.11.1では、変更済みっぽい。)

これで、旧バージョンのメアド・パスワードでのログインができるようになった。
ふう…大変。

今回の2.4.x→2.11.xへのバージョンアップは、ほとんどメジャーバージョンアップ。
バージョン2.11ではなく、バージョン3とすべきところを「2011年だし」という理由で2.11.xになった模様。

データベースの設計から何からだいぶ変わっているので、ただのマイナーバージョンアップだと思って作業見積りを出すと、大変な殊になります。

…で、今まさに大変なことになっている訳ですが。



EC-CUBE2.11 ***_id_seqについて

どうやら、2.11ではDBのデータ増加時にauto_incrementを使用していないらしい。

***_id_seqでレコード数を管理しているみたいなので、データをCSVなどで追加する場合には、関連している***_id_seqの値も増やさなきゃいけない…と。

この処理をしていないと「不正な処理」ってエラーが出ます。


2.4xから2.11へのデータアップデートモジュールが動かないので、Navicatを使用してデータの移行。
専用サーバーでヨカターヨ・゚・(ノД`)・゚・

「アメブロを書く」ボタンの作り方。

Youtubeの共有ボタンに、「アメーバで共有」なるボタンがあるのに気づいて、これは使えるな…と思ったので
φ(`д´)メモメモ...と。

<a href="http://blog.ameba.jp/ucs/entry/srventryinsertinput.do?entry_text=書かせたい記事">リンク</a>

こんな感じ。

実際にはこんな感じになるはず…

「(・´з`・)」って出れば( `д´)b オッケー!

FLASHコンテンツがz-indexを無視。。。

以前、Youtubeのコンテンツがz-indexを無視してしまうのでそれを非表示にするようにjavascriptを変更する記事を書いた。

…が、よくよく考えてみたらFLASHのコンテンツはパラメーターをきちんと指定しないとz-indexを無視してしまうということに気づいた。

ここんとこ、しっかりと指定しておかないと「MediaBox」とか、lightbox系のコンテンツと相性が悪いので。


要するに
<param name="wmode" value="transparent">

って感じでちゃんとwmodeを指定してあげて

<embed src="…" wmode="transparent" />

こっちにも記述する、と。
これだけです、はい。



ただ、この"wmode"にはいろいろと副作用があるようで

・ホイール操作ができない
・日本語入力が使えない

なんて症状が現れるという報告も聞かれます。


なんとなく、AppleがFLASHを採用しなかった理由がわかるなあ。

というわけで少し前まではFLASHでいろいろと作成していたものも、今ではJQueryを使って作ってます。