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

eccube2.11 個別送料計算を$_SESSIONデータで簡単にしました

XAMPPポータブルを使ってEC-CUBEのカスタマイズをいろいろとやってみているのですが、やっぱりUSB2.0は遅い…。

ということで$_SESSIONのデータを全部調べて、もっと簡潔になるようにしました。

本当はもっと早くやっていればよかったんですが、なかなか時間がなく…。

例によって、「function calculate()」の中の「// 合計を計算」の前に追加しちゃってください。

//====================複数配送の場合の処理========================
if ( count($_SESSION['shipping']) > 1 ){

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

//flagsも初期化
$flags = "";

//何人目かを記録しておくためのフラグ
$multi = 0;

//店舗基本情報を取得しておく。
$objDb = new SC_Helper_DB_Ex();
$arrInfo = $objDb->sfGetBasisData();
//---------[初期処理終了]---------

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

//個別の商品代金合計を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];

$quant = $item_code;
$quantity = $deli['shipment_item'][$quant]['quantity'];

//商品価格
$price = $deli['shipment_item'][$quant]["productsClass"]["price02"];
//商品個別送料
$deliv = $deli['shipment_item'][$quant]["productsClass"]["deliv_fee"];

//商品の購入金額
$temp_indiv = $price * $quantity;
$total_indiv += $temp_indiv;

// 配送業者の送料を加算
if (OPTION_DELIV_FEE == 1) {
$deliv = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);

}

//送料の計算(商品毎に加算していく)
$deliv_fee .= $deliv;

//送料の合計が最大送料(配送地域別送料)を超えたら、送料は地域別送料に
if ( $deliv_fee > $objDb->sfGetDelivFee(
$deli["shipping_pref"], $deli["deliv_id"]
)) {

$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);

}

}//商品分の繰り返し


// 送料無料条件(free_rule)が設定されている場合
if ($arrInfo['free_rule'] > 0) {
// 小計が無料条件を超えている場合は個別送料を0に
if( $total_indiv >= $arrInfo['free_rule']) {
$deliv_fee = 0;
}
}

//全注文の総トータル送料に個別送料を加算していく
$results['deliv_fee'] += $deliv_fee;

//送料と合計金額をセッションに保存(comfirm.tpl表示用)
$_SESSION['multi_deliv'][$multi]['deliv_fee'] = $deliv_fee;
$_SESSION['multi_deliv'][$multi]['total_indiv'] = $total_indiv;

$multi++;

}//人数分の繰り返し

}//if

//========================複数配送の場合の送料再計算==============================


とりあえず、XAMPP環境のver2.11.4で確認してます。

僕のブログのアクセス解析を見ると、EC-CUBE開発コミュニティのこのページからのリンクも多いので、それなりに複数配送時の個別送料設定は需要があるのだと思います。

僕の住んでいる沖縄は、本土への送料が驚くほど高いので、複数配送時に個別送料を設定できないと売れれば売れるほど赤字…という状況になりかねません。

それなら、送料込みで価格設定をすればいい…という方もいらっしゃるとは思いますが、送料込の商品を複数購入するということはお客様から送料を二重・三重に頂いているという考え方にもなります。


それに…原価1000円の商品に利益を500円乗せて、送料を1000円追加すると2500円での販売になりますが、お客さんは「1500円の商品を購入した」という感覚はなく、「2500円の商品を購入した」という感覚になります。

そういうことから、商品価格に送料を上乗せして「送料込み」で販売するのは商売をする上で危険なことでもあるんですよ。
特に送料がべらぼうに高い沖縄の場合には。

年が明けると「たんかん」の時期がやってきます。
たんかん10Kgの送料は、クール料金込みで1300円くらいかかります。


送料って恐い…((((;゚Д゚))))

ということで、次のバージョンではちゃんとそれに対応してくれることを期待します。

開発にコミットしたいのですが、やりかたがわかりませぬ。



補足。

//送料の計算(商品毎に加算していく)
$deliv_fee .= $deliv;

//送料の合計が最大送料(配送地域別送料)を超えたら、送料は地域別送料に
if ( $deliv_fee > $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"])) {

$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);

}


の処理ですが、

・商品個別送料を「加算」していく場合は
//送料の合計が最大送料(配送地域別送料)を超えたら、送料は地域別送料に
のロジックを消してください。

個別送料がなくて、地域別送料のみの場合には


$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);

だけでいいと思います。


公式ガイドブックにも載ってないのかな…?


JavaScriptで簡易入力チェック

最近は、フォームのバリデーションチェックを行うプラグインも結構増えてきましたが、簡易的に入力有無のチェックを行うJavaScriptを。。。


function check(){var flag = 0;
if(document.forms.name.value == ""){
flag = 1;
}

else if(document.forms.mail.value == "" && document.forms.tel.value == "" ){
flag = 1;
}

//アラートを出す
if(flag){
window.alert('未入力の項目があります');
return false;
}
else{
return true;
}
}


上記がそのスクリプト。
実際に適用されるフォームは次のようなものです。


<form action="?" method="post" name="forms" onSubmit="return check()" >
<p>▼お名前▼</p><input type="text" name="name" value="">

<p>▼お問い合わせ内容▼</p><textarea name="text" rows="10" cols="44"></textarea>

<p>▼返信用メールアドレス▼</p><input type="text" name="mail" value="">

<p>▼お電話番号▼</p><input type="text" name="tel" value="">

<input type="submit" value="送信"/>
</form>


各色分けされた「name=""」がdocument…以降に対応してます。

documentの(formsという名前の)formの中のinput要素のnameに入力されている情報を取得。
それが「""」でなければ(何も入っていなければ)フラグを立てずに、何も入っていなければflagを1にします。
あとは、フラグが1の場合にアラートを出すというものです。

今回は「document.forms.mail.value == "" && document.forms.tel.value == "" 」という条件を入れていたりしますが、これはmailとtelの両方が「""」の場合にフラグを立てるようにしているので、どちらかの入力があれば☑おkということになります。


LightBox系プラグインで、画面が立ち上がったときにスクロールバーを消す。

いわゆる「LightBox」系のプラグインを使うときは、ページのスクロールバーを消したいと思うことが多い。

表示しているコンテンツがHTMLページだったりしたときに、マウスのホイールを表示しているコンテンツに集中させたいし、表示しているのが画像だったとしてもなにやら後ろがスクロールしているのとか、非常に見づらいし。

そもそも、プラグインによっては親のスクロールによって、表示されている部分もスクロールして画面から消えていってしまう(positionがfixedになっていない)ものもあったりして。

そんなときに使いたいのが


document.body.style.overflow="hidden";//スクロールバー非表示
document.body.style.overflow="visible";//スクロールバー表示


の二つ。

たいていのプラグインはコンテンツを開くときに「open()」や「show()」ってfunctionが実行されるので、その中に「document.body.style.overflow="hidden";」を入れてやることでスクロールバーを消すことができる。
コンテンツを閉じる時には、スクロールバーをまた表示。
これもたいていの場合は「close()」ってfunctionがあるので、その中に「document.body.style.overflow="visible";」を入れてやればおk。

JavaScriptで書かれたプラグインは(だけじゃないくてプログラム全般は)functionの集合体みたいな感じなので、どのfunctionがどんな動きをしているのか…というのが分かれば、カスタマイズもお手の物。

自分でロジックを考えてコードを書くのは大変だけど。


今日もまた自分でロジックを考えながら、ひたすらプログラムをやってます。
カスタマイズだけで食べていけたら楽なんだけど、それじゃ面白くないしなぁ…。

プログラム意外に趣味があって、とりあえずお金を稼ぐための手段だってことで割り切ってしまえば、カスタマイズだけでも十分商売になる。


楽天に出店していると、よくこんな営業メールがきます。

「あなたのサイトに効果的なバナーを!」

要は、jQueryとかのスライドバナーやローテーションバナーとかを実装しませんかって営業なんだけど、金額が2万円とかするのに驚いた。
初期費用2万円に、画像とリンクの差し替えが1点1500円とか。

いくつか見て回ったけど、全部フリーのプラグイン使ってました。

でも、使えない人にしてみたらお金を払ってでも…って思っちゃうんだろうなぁ。


えー。
僕が教えている生徒さんたちの大半は、2時間ほどで自分の好きなバナーを設置することができるようになりました。

慣れてくれば1時間もかからないわけで、
「仕事でやったら1日に16万円稼げます!」
ってとこで盛り上がっていましたが…(・∀・)


名簿屋さんから楽天に出店しているショップの名簿買って、ガンガン営業メールでも送ってみたら、それくらいは稼げるかもです。

稼げる技術を持っている人材のほうが企業にとってはありがたい訳で、僕はそういうのを中心に教えてます。



ついでに…。


function custom_width() {
var width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
return width * 0.8;
}

function custom_height() {
var height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
return height * 0.8;
}

thickbox.jsの場合には上記のコードを使って、ウィンドウサイズをパーセント指定できます。

「return width * 0.8」や「return height * 0.8」は、ウィンドウサイズを取得して、その0.8倍(つまり80%)しているだけです。


コードを、どこでもいいので(一番最後でいいかな)追加して、


TB_WIDTH = (params['width']*1) + 30 || 630;
      ▼
TB_WIDTH = (params['width']*1) + 30 || custom_width();

TB_HEIGHT = (params['height']*1) + 40 || 440;

TB_HEIGHT = (params['height']*1) + 40 || custom_height();


といった感じで変更してあげれば、デフォルトで630px×440pxになっているのを変更できます。

ウィンドウのサイズが決まっているプラグインて珍しいんですけどね。

ペヤング

φ(..)メモとして残しておこう…-__.JPG



最近は沖縄でもペヤングソースやきそばが手軽に入手出来るようになりました。

一週間頑張った自分へのご褒美に。

これでニュータッチのネギらーめんも手軽に入手出来れば、最高なのに…。

ペヤングとニュータッチのダブル食いをしてみたい。


--------------------------
Message from iPhone
--------------------------

投稿テスト。

φ(..)メモとして残しておこう…-__.JPG






--------------------------
Message from iPhone
--------------------------

フォーム内の文字をフォーカスで消すjQuery-Plugin 「clearField」


/**
* jQuery-Plugin "clearField"
*
* @version: 1.1, 04.12.2010
*
* @author: Stijn Van Minnebruggen
* stijn@donotfold.be
* http://www.donotfold.be
*
* @example: $('selector').clearField();
* @example: $('selector').clearField({ blurClass: 'myBlurredClass', activeClass: 'myActiveClass' });
*
*/

(function($) {

$.fn.clearField = function(settings) {
settings = jQuery.extend({
blurClass: 'clearFieldBlurred',
activeClass: 'clearFieldActive',
attribute: 'rel',
value: ''
}, settings);

return $(this).each(function() {
var el = $(this);
settings.value = el.val();
if(el.attr(settings.attribute) == undefined) {
el.attr(settings.attribute, el.val()).addClass(settings.blurClass);
} else {
settings.value = el.attr(settings.attribute);
}
el.focus(function() {
if(el.val() == el.attr(settings.attribute)) {
el.val('').removeClass(settings.blurClass).addClass(settings.activeClass);
}

});

el.blur(function() {
if(el.val() == '') {
el.val(el.attr(settings.attribute)).removeClass(settings.activeClass).addClass(settings.blurClass);
}

});


});//return

};//fn.clearField

})(jQuery);


こんなのがあった。

フォームに、文字を表示させておいてフォーカスがあったら、その文字を消すjQueryプラグイン。



<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="jquery.clearfield.js"></script>
<script>
$(document).ready(function() {
$('.clearField').clearField();
});
</script>


で読み込みと設定。
あとはCSSセレクタが「.clearField」なんで、目的のinputタグやtextareaに「class="clearField"」でオッケー。

詳しくはこちらから。


いや、まあ…「HTML5のplaceholder属性」使えばイイって話なんですけどね。。。

PHPでキャリアごとにリダイレクト

タイトルどおりのリダイレクトプログラムのメモ。


<?php
/*
$agent = $_SERVER['HTTP_USER_AGENT'];
if (
(strpos($agent, 'iPhone') !== false && strpos($agent, 'iPad') === false) || strpos($agent, 'iPod') !== false || strpos($agent, 'Android') !== false)
{header("Location: ./smart.html");}
else {

if(ereg("^DoCoMo", $agent)){header("Location: ./docomo.php");}
else if(ereg("^J-PHONE|^Vodafone|^SoftBank", $agent)){header("Location: ./sb.php");}
else if(ereg("^UP.Browser|^KDDI", $agent)){header("Location: ./au.php");}

else {"Location: ./pc.html");}
}
*/
?>


ということで。
JavaScriptだと、JavaScriptに対応していない機種の場合に動作しないのでPHPでやったほうがいい。

Ajaxを使用して外部ファイルをインクルードするjQueryプラグイン「jQuery-inc」


/*

inc v6

A super-tiny client-side include JavaScript jQuery plugin

<http://johannburkard.de/blog/programming/javascript/inc-a-super-tiny-client-side-include-javascript-jquery-plugin.html>

MIT license.

Johann Burkard
<http://johannburkard.de>
<mailto:johann@johannburkard.de>

*/

jQuery.fn.inc = function(url, transform, post, t, f, transfer) {return this.length ? this.each(function() {t = $(this);transfer = function(txt) {t.html($.isFunction(transform) ? transform(txt) : txt);post && post();};if ($.browser.msie) {$('<iframe>').hide().bind('readystatechange', function() {if (/m/.test(this.readyState)) {transfer(this.contentWindow.document.body.innerHTML);$(this).remove();}}).attr('src', url).appendTo(document.body);}else {$.ajax({url: url,complete: function(res, status) {/c/.test(status) && transfer(res.responseText);}});}}) : this;};
$(function() {$('[class*="inc"]').each(function() {$(this).inc(unescape(this.className.replace(/.*inc:([^ $]+)/, '$1')));});});


上記が件のプラグイン。
使用方法はとっても簡単。



<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="inc.js"></script>


で、jQueryとプラグインを読み込む。

あとは

<div class="inc:example.html"></div>

で自動読み込み完了。


詳しくは、ここで。
inc: A super-tiny client-side include JavaScript jQuery plugin

eccube2.11.1->2.11.4へのバージョンアップについて

えー。。。。

なにやら、気づかぬ間に(気づけって話ですが)EC-CUBEがマイナーバージョンアップしているみたいです。

今回も、複数配送の場合に配送先毎に配送料を計算するロジックはありませんでした。

それはさておき。

SC_CartSessionに



/**
* セッション中の商品情報データの調整。
* productsClass項目から、不必要な項目を削除する。
*/


なんて項目(つまり「adjustSessionProductsClass()」です)ができておりまして、「$arrNecessaryItems = array()」の中に削除したくないキーを設定しておかないとSESSIONデータが消えてしまいます。

商品個別の送料周りをいじって、SESSIONからデータを使おうって時には



'deliv_fee' => true,


を追加しないとダメです。

つか、'deliv_fee'って消さなくてもいいような気がするんだけど…。


dtb_products_classじゃなくてdtb_productsからのデータの方がカート処理時に不要なデータの山のような気がしますが。。。

あいかわらずSC_Helper_Purchaseクラスの「getDelivDate()」はswitch処理なので、DB登録できるようにしたほうがいいのでは…。



timeslider.js を使って、出勤管理を書いてみたのでメモ。

要件。

・夜系のお店の出勤管理プログラム。
・データの保存はテキスト形式で保存(DB使用ナシ、複数店舗をファイルごと)。
・データは「今日」から1週間を表示で、毎朝5時に日付変更。

女の子の数が増えていくと、その分だけデータが増えていくわけですが、これをどう保存しようかと検討した結果、serialize()で多次元の配列データをそのままテキストに書き込むことにしました。

今回は出勤表のみですが、よくよく考えてみたらプロフィール登録や写真登録などの統合管理ツールを作らなきゃ…ってときに使い回しができるようにしておきます。

今回は、日付変更処理と曜日のソートでちょっと悩みました。

・データは「今日」から1週間を表示で、毎朝5時に日付変更。
ってとこです。
結局


$update_hour = "5";

//今日の曜日番号を取得
$weekno = date('w');

//五時移行に更新する設定にした
if ( date('G') < $update_hour ) { $weekno = $weekno - 1; }
if ( $weekno < 0 ) { $weekno = 6; }


こんな感じの処理をしてます。
date('w')で、今日の曜日ナンバーを取得。
date('G')で、24時間の「時間」を取得。
取得した時間が5時未満なら、曜日ナンバーを一個減らす(前の日に戻す)処理をする。
曜日ナンバーが0(日曜日)以下の時には曜日ナンバーを6(土曜日)にするという処理です。

そうそう。
曜日の日本語表記は


$weekno = date('w');

$week_list_jp = array(0=>"日曜日",1=>"月曜日",2=>"火曜日",3=>"水曜日",4=>"木曜日",5=>"金曜日",6=>"土曜日",);

$week_data_jp = $week_list_jp[$weekno];


みたいな処理をすればオッケーです。


ちょっと前に流行った「姫君スクリプト」がなくなってしまったようで、夜系業界の人から頼まれて作ったのですが、写真のアップロードやプロフィール等の統合管理ツールとしてちゃんと制作を進めて、フリーで公開しようと思いました。

結構姫君使ってるとこ多いんですよね…夜系の方々。

少なくとも姫君よりは使いやすいものになるようにしたいとは思いますので、夜系の方は乞うご期待。


1年半ほど前にWebの業界に入ったとき、夜系の知り合いからページ制作を頼まれて姫君スクリプトを使おうとしたのですが、既に姫君を使っているWebデザイナーに相談したところ
「真似するな」
と言われて、それで自分でプログラムをしようと始めたのがPHPです。


フリーのプログラムを「真似するな」もなにも…とは思うのですが、その一件がなければ、今こうしてWebエンジニアをやっていたかどうかは分かりません。

ということで、Webエンジニアとしてのきっかけになってくれた「姫君スクリプト」がなくなってしまったのは非常に残念。。。