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

eccube2.11 クール便の設定について

ちょいと、コメントをいただきましたので、処理について書こうと思います。

-------------コメント内容--------------------------------

弊社は生ものなどを扱っていまして、
1)冷凍便
2)冷蔵便
3)常温便
の3パターンでの発送手配を行っています。
そこで、たとえば1人のお客様が
1)・3)をご購入されたとして、送料は
1)700円(クール込210円)
2)490円(クールなし)
合計1190円という具合にしたいのです。


商品個別送料を設定ではなく、お届け先件数に対してクールか否かを判別し、クールであれば常温送料プラスクール代210円追加とできればと思います。

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

これはもう、クール便のフラグをたてるという方法にしたらいいと思います。
DBのどこにそれを追加してもいいと思いますが、とりあえず「通常便」「クール便」の2種類のフラグをもたせれば。

冷凍も冷蔵も、クール料金は一緒の場合が多いので。

まずは、dtb_productsにフラグ用のカラムを作成します。
「cool_flg,int(1),デフォルト=1」みたいな感じでしょうか。

そしたら、/data/class/pages/admin/products/LC_Page_Admin_Products_Product.php
の336行目に以下を追加

$objFormParam->addParam("クールフラグ", "cool_flg", '', "", array());

これで、商品詳細編集ページにDBからデータを読み込んでくることができます。
今度は同じファイルのDBに商品を登録する「function lfRegistProduct(…」の中の

// INSERTする値を作成する。
というコメント以下に「$sqlval['****'] = $arrList['****'];」ってのが並んでいると思うので

$sqlval['cool_flg'] = $arrList['cool_flg'];

ってのを追加します。

これで、DBにフラグ登録ができるようになりました。

あとは、/data/Smarty/templates/admin/products/product.tplに

<tr>
<th>クール便フラグ</th>
<td>
<span class="attention"><!--{$arrErr.cool_flg}--></span>
<input type="text" name="cool_flg" value="<!--{$arrForm.cool_flg|h}-->" size="6" class="box6" maxlength="<!--{$smarty.const.AMOUNT_LEN}-->" style="<!--{if $arrErr.sale_limit != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}-->"/>
<span class="attention"> (0=通常便、1=クール便)</span>
</td>
</tr>

なんてのを追加してあげて、/data/Smarty/templates/admin/products/confirm.tplに

<tr>
<th>クール便フラグ</th>
<td>
<!--{$arrForm.cool_flg|h}-->
</td>
</tr>


と追加してあげます。
これで、管理画面から商品のクール便フラグを設定することが出来ます。
今回は直接入力ですが、必要に応じてプルダウンメニューで選べるようにしてあげたり。

DBへの登録まわりが終わったら、後は送料計算のロジックにフラグによる送料を加えるだけです。

とりあえず、data/class/SC_Product.phpの663行目に

dtb_products.cool_flg,

を追加。
要は詳細データを取得するSQLにcool_flgも追加するってことです。

後は

function getAllCartList() のforeachの中(ネストされた方のforeach)で

$cool = ( $cartItem["productsClass"]["cool_flg"] > 0 )? "on":"off";

とでもやって、クール便がひとつでも入っていたらフラグを"on"にするとかして
function calculate()内にフラグ"on"ならクール料金を加算する処理を書けばOKかと。


複数配送アリの場合にはロジックが違うので
(「全商品」ではなく「配送先毎の全商品」なのでgetAllCartList()は使えない…?)

商品分の繰り返しの中に、処理を書けばオッケー。
SC_Productクラスを使うのがめんどくさかったら、

$objQuery = new SC_Query();
$cool = ( $objQuery->getOne("SELECT cool_flg FROM dtb_products;") > 0 ) ? "on":"off";

でフラグたてて、人数分の繰り返しの中でクール料金を加算する処理を書けばいいかと。


今度、時間のある時にでも試してみます…。

場合によってはSC_Productクラスの「function lists()」とか「 prdclsSQL()」にもcool_flgの追加が必要になるのかな…?
ま、必要はなさそうだけど。



追記。
「SC_CartSession.php」の処理も書いてみましたので、アップしときます。
2.11.4&XAMPP環境では確認できてますが、細かいところはまだ確認してません。

…またまた追記。
確認の結果、コードを修正しました。

この記事に修正したコードがあります。



XAMPP Portable キタ━━━(゚∀゚)━━━!!

久しぶりにXAMPP for Windowsを覗いてみたら、USBメモリ上に環境を作る「Portable」判があることに気づいた。

…まぢ?

(゚∀゚)キタコレ!!


現在、使用しているパソコンは

23インチiMac:2006(自宅)
MacBook:2010(自宅)
MacBook Air(会社)

…と3台のMacを使用していて(でも全部bootcampでwindows使用)、どこにXAMPP環境を作るかで悩んでいたけど、一気に解決。

同時進行のプロジェクトごとにバーチャルドメインの設定も必要なし。
USBメモリが安いから、プロジェクトごとにUSBメモリで管理すればよし。


さっそく、USBメモリにインストール。

当たり前だけど、どのマシンでもいける!


いろんなツールを使って仕事の効率を上げよう。


・NaviCAT
・Viveza2
・devas
・macdrive
・VectorMagic
・Wysiwyg Web Builder
・iWisoft videoconverter

オブジェクト配列を連想配列に変える

$object = new Example();
var_dump($object->DATAload);

こんな感じでとってきたデータをdumpしたとき、以下のような状態でした。


array(2) {
[0]=>
object(stdClass)#1 (4) {
["id"]=>
string(1) "1"
["name"]=>
string(15) "おにぎり"
["price"]=>
string(3) "110"
["comment"]=>
string(31) "おにぎり/■\ワショーイ"
}
[1]=>
object(stdClass)#2 (4) {
["id"]=>
string(1) "2"
["name"]=>
string(18) "お茶"
["price"]=>
string(3) "120"
["comment"]=>
string(43) "(・∀・)つ目 オチャノメ!"
}


えー。。。

オブジェクト配列ってんですか?
クラスファイルを見ないとなんとも言えないんですが、とりあえずフツーの連想配列にしたい。

という時には、これを。


function obj2arr($obj) {
if ( !is_object($obj) ) return $obj;
$arr = (array)$obj;
foreach($arr as $k => &$v) {
if(is_object($v)) {
$v = obj2arr($v);
}
}
return $arr;
}

var_dump( obj2arr( $object->DATAload ));

-------結果------

array(2) {
[0]=>
array(4) {
["id"]=>
string(1) "1"
["name"]=>
string(15) "おにぎり"
["price"]=>
string(3) "110"
["comment"]=>
string(31) "おにぎり/■\ワショーイ"
}
[1]=>
array(4) {
["id"]=>
string(1) "2"
["name"]=>
string(18) "お茶"
["price"]=>
string(3) "120"
["comment"]=>
string(43) "(・∀・)つ目 オチャノメ!"
}



全部一括で変換してくれます。

いろいろ探してたら、海外のサイトでこんなコードを見つけた。


function object2array($object) {
if (is_object($object)) {
foreach ($object as $key => $value) {
$array[$key] = $value;
}
}
else {
$array = $object;
}

return $array;
}


こいつの場合には、


var_dump( object2array( $object->DATAload[0] ));

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

array(4) {
["id"]=>
string(1) "1"
["name"]=>
string(15) "おにぎり"
["price"]=>
string(3) "110"
["comment"]=>
string(31) "おにぎり/■\ワショーイ"
}


みたいな感じで使います。

スマホサイトにはFLASHを使ってはいけない理由 ( HTML5のLast Callもきたし )

スマホ用のサイトにFLASHコンテンツを使用してはいけない理由はこれ。

Flash to Focus on PC Browsing and Mobile Apps

… no longer continue to develop Flash Player in the browser to work with new mobile device …

もう、モバイル端末向けのブラウザ用にプラグインを開発するのを、ADOBE自身がやめてしまったのだから、当然といえば当然ですね。

一応、パソコン向けのプラグインは開発を続けるということだけど、モバイルサイト(スマホサイト)の今後の重要性を考えると、今からFLASHでのWebコンテンツ開発をガチで勉強しようという人間は減ってくるのかもしれない。

ActionScript3.0でのPC用Webアプリ開発やAIRのデスクトップアプリをやるっていうことなら、勉強してもいいとは思うけど…。

基本的に僕はActionScript2.0までしかわからないので、出来たとしてもガラケー向けのゲーム開発だったりするわけですが、ガラケーが淘汰され、1億総スマホ時代になったときに、FLASHコンテンツの動かないスマホ用のゲームを開発するということであれば、これはHTML5でやるしかないわけです。

これから先、FLASHが向かうところはスマホOS用のネイティブアプリ開発やAIRによるデスクトップアプリケーションということなのでしょう。

ADOBE自身もCSS shadersのようなHTML5寄りの開発に資金を注ぎ込んでいくとアナウンスしているし…。

Apple,Google,Adobe…これらの企業が、これからのWebのスタンダードはHTML5になると認めているのだから、そうなっていくでしょう。


WHATWGからHTML5のLast Callもキタ━(゚∀゚)━!


WHATWGの開発者向けHTML5仕様書はこちら


膨大な解説はこっち

タグ一覧はこのあたりかな?
(http://www.whatwg.org/specs/web-apps/current-work/#elements-1)





さて。。。

この仕様の中からどれだけのものがW3Cでの最終決定仕様に採用されるのだろうか。

仕様決定から、デファクトスタンダードになっていくまでにはまだ数年はかかりそう。

いまから始めても、全然チャンスはある。

時間帯を選ぶ時に、スライダーで入力したいので、timeslider.jsを使う。

ECサイトの構築をしていると、配送時間でもっといい入力方法はないかなと考えることがある。

たとえば、12時とか14時とかいう時間帯指定ではなく
・10時~18時
・10時~12時以外ならいつでも
なんて指定をしたい人は多いけれど、そういう指定の仕方はできない。

結局、備考欄に書かなきゃいけないわけだけど、要はデータとして情報を持っていればいいので、それを入力できるスライダーはないかな…と探していて見つけたのが「timeslider.js」。

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

こんな感じのスライダーなんだけど、なんと、作ったのが日本人ということで、ちょっと感動。

サイトはこちらから

「いまいち「コレッ!」っていうのが見あたらなかったので作ってみました。」というコメントにもあるとおり、ネットで探してみると、本当にこれというのが見当たらないので、助かりました。

これは使いにくい

これはシンプルすぎ?


あとは、この記事を参考に自作してみるとかね。




KCFinderの設定について。

とりあえず、config.php


$_CONFIG = array(

'disabled' => false,
'readonly' => false,
'denyZipDownload' => true,

'theme' => "oxygen",

//アップロードフォルダ
'uploadURL' => "upload",
'uploadDir' => "",

'dirPerms' => 0755,
'filePerms' => 0644,

'deniedExts' => "exe com msi bat php cgi pl",

'types' => array(

// CKEditor & FCKEditor types
'files' => "",
'flash' => "swf",
'images' => "*img",

// TinyMCE types
'file' => "",
'media' => "swf flv avi mpg mpeg qt mov wmv asf rm",
'image' => "*img",
),

'mime_magic' => "",

'maxImageWidth' => 0,
'maxImageHeight' => 0,

'thumbWidth' => 100,
'thumbHeight' => 100,

'thumbsDir' => ".thumbs",

'jpegQuality' => 90,

'cookieDomain' => "",
'cookiePath' => "",
'cookiePrefix' => 'KCFINDER_',

// THE FOLLOWING SETTINGS CANNOT BE OVERRIDED WITH SESSION CONFIGURATION

//KCFinderから見たtinymce.jsの場所
'_tinyMCEPath' => "../jscripts/tiny_mce",

'_sessionVar' => &$_SESSION['KCFINDER'],

);



core/autoload.php


ini_set('display_errors', 1);
ini_set('error_reporting', 2047);

function __autoload($class) {
if ($class == "uploader")
require "core/uploader.php";
elseif ($class == "browser")
require "core/browser.php";
elseif (file_exists("core/types/$class.php"))
require "core/types/$class.php";
elseif (file_exists("lib/class_$class.php"))
require "lib/class_$class.php";
elseif (file_exists("lib/helper_$class.php"))
require "lib/helper_$class.php";
}



そして、肝心の編集ページのtinyMCE.init()の中はこんな感じ。



// General options
mode : "textareas",
theme : "advanced",
convert_urls: false,
plugins : "autolink,lists,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,wordcount,advlist,autosave",
//日本語にします
language : "ja", // Theme options

//KCFinderの呼び出し
file_browser_callback: 'openKCFinder'
,

// Theme options
theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,styleselect,formatselect,fontselect,fontsizeselect",
theme_advanced_buttons2 : "cut,copy,paste,pastetext,pasteword,|,search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor",
theme_advanced_buttons3 : "tablecontrols,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,iespell,media,advhr,|,print,|,ltr,rtl,|,fullscreen",
theme_advanced_buttons4 : "insertlayer,moveforward,movebackward,absolute,|,styleprops,|,cite,abbr,acronym,del,ins,attribs,|,visualchars,nonbreaking,template,pagebreak,restoredraft",
theme_advanced_toolbar_location : "top",
theme_advanced_toolbar_align : "left",
theme_advanced_statusbar_location : "bottom",
theme_advanced_resizing : true,

// Example content CSS (should be your site CSS)
content_css : "css/content.css",

// Drop lists for link/image/media/template dialogs
template_external_list_url : "lists/template_list.js",
external_link_list_url : "lists/link_list.js",
external_image_list_url : "lists/image_list.js",
media_external_list_url : "lists/media_list.js",

});

//---[KCFinder]---
function openKCFinder(field_name, url, type, win) {
tinyMCE.activeEditor.windowManager.open({
file: '../kcfinder/browse.php?opener=tinymce&type=' + type,
title: 'KCFinder',
width: 700,
height: 500,
resizable: "yes",
inline: true,
close_previous: "no",
popup_css: false
}, {
window: win,
input: field_name
});
return false;
}
//---[KCFinder]---




とりあえず、tinyMCEにKCFinderを組み込んだときに動かないのはクルクル σ@( ゚∀ ゚) パー!?ミッションの設定が問題になっているパターンが多い。

kcfinderの下のphpファイルは755に。
kcfinder/coreの中のphpも755に。
kcfinder/core/typesの下のphpも755…って感じで設定する。

upload用のフォルダは777に設定しておけば間違いない。


確認は、kcfinder/browse.phpを直接叩いてみるって手も。


openKCFinder()の中のfile: '../kcfinder/browse.php?opener=tinymce&type=' + type,で開いている通りなのだから、tinyMCEとかとりあえず関係なく、直接見に行ってみること。

jQueryUIの使い方をPDFにしたYO!

jQuery UIの使い方をPDFにしてみたんでどぞ。

UI-TAB.pdf(1.2MB)

ECcube2.11 個別送料計算とか、送料計算のロジックを書き直したょ。

商品ごとに送料が違う。
配送先都道府県で送料が違う。
さらに、送料合計が各都道府県で設定された金額を超えた場合には、その金額を上限にする。

つまり

OPTION_PRODUCT_DELIV_FEE == 1

OPTION_DELIV_FEE == 1

トータルのOPTION_PRODUCT_DELIV_FEE > OPTION_DELIV_FEE

の場合には、

$results['deliv_fee'] = OPTION_DELIV_FEE

にしなきゃ。。。

というわけで、SC_CartSession.phpの

// 配送業者の送料を加算
のところに
&& $results['deliv_fee'] != 0
を追加して

$results['deliv_fee'] += $objDb->sfGetDelivFee($deliv_pref, $deliv_id);
            ▼
$results['deliv_fee'] = $objDb->sfGetDelivFee($deliv_pref, $deliv_id);

こう変更。


個別送料計算のロジックに


//送料の計算(商品毎に加算)
$deliv_fee .= $haisou['shipping'];
//商品毎の送料が1000円(最大送料)を超えたら、その人宛の送料は1000円に
if ( $deliv_fee > $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"])) {
$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
}


こいつを追加。


結局、ソースはこうなりました。


function calculate()の中身…

$objDb = new SC_Helper_DB_Ex();
$total_point = $this->getAllProductsPoint($productTypeId);
$results['tax'] = $this->getAllProductsTax($productTypeId);
$results['subtotal'] = $this->getAllProductsTotal($productTypeId);
$results['deliv_fee'] = 0;

// 商品ごとの送料を加算
if (OPTION_PRODUCT_DELIV_FEE == 1) {
$cartItems = $this->getCartList($productTypeId);
foreach ($cartItems as $item) {
$results['deliv_fee'] += $item['productsClass']['deliv_fee'] * $item['quantity'];
}
}

// 配送業者の送料を加算
if (OPTION_DELIV_FEE == 1
//追加
&& $results['deliv_fee'] != 0

&& !SC_Utils_Ex::isBlank($deliv_pref)
&& !SC_Utils_Ex::isBlank($deliv_id)) {
//商品毎の合計送料が地域送料を超えていた場合には、送料を地域送料額にする
//(全て同梱できると仮定して)
$results['deliv_fee'] = $objDb->sfGetDelivFee($deliv_pref, $deliv_id);

}

// 送料無料チェック
if ($this->isDelivFree($productTypeId)) {
$results['deliv_fee'] = 0;
}

/*▼▼▼お届け先が複数ならそれごとに送料を再計算▼▼▼*/

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

//---------[初期処理]-------------

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

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

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

//---------[初期処理終了]---------

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

//フラグ関係を初期化
$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'];

$objQuery = new SC_Query();
$haisou = $objQuery->getOne("SELECT
price02,
deliv_fee
FROM
dtb_products_class
where
product_code = " . $item_code . ";
");

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

$subTotal_fee[] = $haisou['deliv_fee'];

//送料の計算(商品毎に加算)
$deliv_fee .= $haisou['deliv_fee'];

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

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

}


}//商品分の繰り返し

//送料無料条件を超えていたら0円に、超えていなかったら商品別送料の中で一番高い金額を設定
$deliv_fee =
( $total_indiv > $objQuery->getOne("SELECT free_rule FROM dtb_base_info;") ) ? 0:max($subTotal_fee);

// 地域別の送料を計算(あれ?必要かな…これ…商品分の繰り返しでやってるからいらないかな?)
if (OPTION_DELIV_FEE == 1
&& $deliv_fee <> 0
&& !SC_Utils_Ex::isBlank($deliv_pref)
&& !SC_Utils_Ex::isBlank($deliv_id)) {
$deliv_fee = $objDb->sfGetDelivFee($deli["shipping_pref"], $deli["deliv_id"]);
}

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

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

$multi++;

}//人数分の繰り返し

}

/* ▲▲▲お届け先ごとに送料を再計算(ここまで)▲▲▲ */


とりあえず、困ったときには
$objQuery = new SC_Query();
$objQuery->getOne()とかでDBからデータ取ってきて処理ですね。

それだけでなんとかなるもんです。

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



いつもお世話になってる「CODROPS」でドラッグ可能な全画面イメージギャラリー発見。

いつもお世話になってる「CODROPS」でドラッグ可能な全画面タイル状のイメージギャラリー発見。

Draggable Image Boxes Grid

ここんちはいつも勉強がてら利用しているのですが、なかなかわかりやすいチュートリアルがあって重宝するサイトです。

結構、ここで拾ったコードを自分なりにカスタマイズしてECサイトに組み込んだりしてます。

ECサイトって、写真を見せることで商品の魅力を最大限に伝えたほうがいいと思うので、こんな感じのフォトギャラリーとEC-CUBEを組み合わせることで面白いECサイトを作ることが多いです。

ギャラリーの構造さえ分かってしまえば、データベースから一覧や商品ページを生成するのはとても簡単なので、時にはこんな感じのフォトギャラリーを「買って」きて、EC-CUBEと組み合わせることも。

サイトデザインが安価で購入出来るなんて、いい時代になりました。
と同時に、安価でデザインを切り売りするようなレイヤーではなく、それを利用してプログラムやシステムを開発するレイヤーにいてよかったと思います。

まあ、2年前にいずれこうなると思ってこっち側に移ってきたんだけど、早めに決断してよかったぁ。


最近は購入したサイトをカスタマイズして安価で販売なんて案件も増えてます。

ちなみに、僕は$40~50のサイトをカスタマイズ後、10万円位で納品…というのが多いですね。

円高万歳!

4000円のサイトデザインを購入してきて、コンテンツを入れ替えて10万円で納品とか、美味しいですよね。


あ、もちろんEC-CUBEの組み込みは別料金です。

サイト購入→カスタマイズ→EC-CUBE組み込み
この流れで、だいたい15~20万円くらいでしょうか。


この美味しいモデルを、貧困国とかででやってみたいんですけどねぇ。
4000円が、ちょっとしたカスタマイズ(というより、ほぼコンテンツ入れ替え)だけで10万円になるわけです。


普通にサイト制作会社に発注したら30~50万円くらいかかるようなクオリティのサイトが10万円なら安いもんでしょう?

今構築中の新サービスにぴったりのjQueryプラグインを発見。。。

今構築中の新サービスにぴったりのjQueryプラグインを発見。

MobilePhotoAlbum

デモはこっち

まさに、こんなプラグインが欲しかった。



これも。。。
モバイル端末用スワイプイベント実装jQueryプラグイン「TouchSwipe

実装はこんな感じ。


var swipeOptions=
{
swipe:swipe,
threshold:0
}

$(function(){
//Enable swiping...
$("#test").swipe( swipeOptions );
});

function swipe(event, direction){
$("#test").text("You swiped " + direction );
}

HTML)
<div id="test">Swipe me</div>


デモページまんまだけどね。