この記事では、PHPで実装したショッピングカートクラスについて説明します。皆さんの参考に共有してください。具体的な分析は次のとおりです:
このショッピング カート クラスは、CodeIgniter のショッピング カート クラスの模倣に基づいて実装されています。
ショッピングカートの基本的な機能は次のとおりです:
1) ショッピングカートに商品を追加します
2) ショッピングカートから商品を削除します
3) ショッピングカートの商品情報を更新 [+1/-1]
4) ショッピングカートのアイテムの統計
1.トータルプロジェクト
2. 合計数量
3.合計金額
5) 買い物アイテムの数量と金額を計算します
6) ショッピングカートをクリアします
1.cart.php ファイル:
?
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 |
/** * * @著者Quanshuidingdang */ クラスカート{ //物品idおよび名称规则,调试情報制御 プライベート $product_id_rule = '.a-z0-9-_'; //小写字母 | 数字 | ._- private $product_name_rule = '.:a-z0-9-_';//小写字母 | 数字 | ._-: プライベート $debug = TRUE; //购物车 プライベート $_cart_contents = array(); /** * コンストラクター * * @param 配列 */ パブリック関数 __construct() { //初めて使用しましたか? if(isset($_SESSION['cart_contents'])) { $this->_cart_contents = $_SESSION['cart_contents']; } 他 { $this->_cart_contents['cart_total'] = 0; $this->_cart_contents['total_items'] = 0; } if($this->debug === TRUE) { //$this->_log("cart_create_success"); } } /** * カートに商品を追加します * * @アクセス公開 * @param array 1 次元または多次元の配列。キー値の名前が含まれている必要があります: id -> アイテム ID の識別、 数量 -> 数量、 価格 -> 単価(価格)、 名前 -> アイテム名 * @return bool */ パブリック関数 insert($items = array()) { //输入物品パラメータ异常 if( ! is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_items_insert"); } FALSEを返す; } //物品パラメータ处理 $save_cart = FALSE; if(isset($items['id'])) { if($this->_insert($items) === TRUE) { $save_cart = TRUE; } } 他 { foreach($items as $val) { if(is_array($val) AND isset($val['id'])) { if($this->_insert($val) == TRUE) { $save_cart = TRUE; } } } } //当插入成功後セッションにデータを保存します if($save_cart) { $this->_save_cart(); TRUEを返す; } FALSEを返す; } /** *ショッピングカートの商品情報を更新 * * @アクセス公開 * @param 配列 * @return bool */ パブリック関数 update($items = array()) { //输入物品パラメータ异常 if( !is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_items_insert"); } FALSEを返す; } //物品パラメータ处理 $save_cart = FALSE; if(isset($items['rowid']) AND isset($items['qty'])) { if($this->_update($items) === TRUE) { $save_cart = TRUE; } } 他 { foreach($items as $val) { if(is_array($val) AND isset($val['rowid']) AND isset($val['qty'])) { if($this->_update($val) === TRUE) { $save_cart = TRUE; } } } } //当更新成功後データをセッションに保存します if($save_cart) { $this->_save_cart(); TRUEを返す; } FALSEを返す; } /** * ショッピングカートのアイテムの合計金額を取得します * * @return int */ パブリック関数 total() { return $this->_cart_contents['cart_total']; } /** * ショッピングカートのアイテムタイプを取得します * * @return int */ パブリック関数 total_items() { return $this->_cart_contents['total_items']; } /** * ショッピングカートを入手 * * @配列を返す */ パブリック関数contents() { $this->_cart_contents を返す; } /** * ショッピングカートのアイテムオプションを取得します * * @パラメータ文字列 * @配列を返す */ パブリック関数オプション($rowid = '') { if($this->has_options($rowid)) { return $this->_cart_contents[$rowid]['options']; } 他 { 配列を返す(); } } /** * ショッピングカートをクリア * */ パブリック関数 destroy() { unset($this->_cart_contents); $this->_cart_contents['cart_total'] = 0; $this->_cart_contents['total_items'] = 0; unset($_SESSION['cart_contents']); } /** * ショッピングカートのアイテムにオプションがあるかどうかを決定します * * @パラメータ文字列 * @return bool */ プライベート関数 has_options($rowid = '') { if( ! isset($this->_cart_contents[$rowid]['options']) OR count($this->_cart_contents[$rowid]['options']) === 0) { FALSEを返す; } TRUEを返す; } /** * 插入据 * * @アクセス非公開 * @param 配列 * @return bool */ プライベート関数 _insert($items = array()) { //入力項目パラメータが異常です if( ! is_array($items) OR count($items) == 0) { if($this->debug === TRUE) { $this->_log("cart_no_data_insert"); } FALSEを返す; } //商品パラメータが無効な場合(ID/数量/価格/名前がない場合) if( ! isset($items['id']) OR ! isset($items['qty']) OR ! isset($items['price']) OR ! isset($items['name']) ){ if($this->debug === TRUE) { $this->_log("cart_items_data_invalid"); } FALSEを返す; } //商品数量から左のゼロと数字以外の文字を削除します $items['qty'] = トリム(preg_replace('/([^0-9])/i', '', $items['qty'])); $items['qty'] = trim(preg_replace('/^([0]+)/i', '', $items['qty'])); //商品数量が0または番号以外の場合、ショッピングカートでは何も行いません! if( ! is_numeric($items['qty']) OR $items['qty'] == 0) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_invalid"); } FALSEを返す; } //アイテムID定期判定 if( ! preg_match('/^['.$this->product_id_rule.']+$/i', $items['id'])) { if($this->debug === TRUE) { $this->_log("cart_items_data(id)_invalid"); } FALSEを返す; } //項目名規則性判定 if( ! preg_match('/^['.$this->product_name_rule.']+$/i', $items['name'])) { if($this->debug === TRUE) { $this->_log("cart_items_data(name)_invalid"); } FALSEを返す; } //アイテム単価から左のゼロと数字以外の文字(小数点付き)を削除します $items['価格'] = トリム(preg_replace('/([^0-9.])/i', '', $items['価格'])); $items['価格'] = トリム(preg_replace('/^([0]+)/i', '', $items['価格'])); //商品の単価が数字でない場合 if( ! is_numeric($items['price'])) { if($this->debug === TRUE) { $this->_log("cart_items_data(price)_invalid"); } FALSEを返す; } //アイテムの一意の ID を生成します if(isset($items['options']) AND count($items['options']) >0) { $rowid = md5($items['id'].implode('', $items['options'])); } 他 { $rowid = md5($items['id']); } //商品をショッピングカートに追加します unset($this->_cart_contents[$rowid]); $this->_cart_contents[$rowid]['rowid'] = $rowid; foreach($items as $key => $val) { $this->_cart_contents[$rowid][$key] = $val; } TRUEを返す; } /** * ショッピングカートの商品情報(非公開)を更新 * * @アクセス非公開 * @param 配列 * @return bool */ プライベート関数 _update($items = array()) { //入力項目パラメータが異常です if( ! isset($items['rowid']) OR ! isset($items['qty']) OR ! isset($this->_cart_contents[$items['rowid']])) { if($this->debug == TRUE) { $this->_log("cart_items_data_invalid"); } FALSEを返す; } //商品数量から左のゼロと数字以外の文字を削除します $items['qty'] = preg_replace('/([^0-9])/i', '', $items['qty']); $items['qty'] = preg_replace('/^([0]+)/i', '', $items['qty']); //商品数量が数値以外の場合、ショッピングカートへの処理は行われません! if( ! is_numeric($items['qty'])) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_invalid"); } FALSEを返す; } //ショッピングカート内の商品数が更新が必要な商品数と一致する場合は、更新する必要はありません if($this->_cart_contents[$items['rowid']]['qty'] == $items['qty']) { if($this->debug === TRUE) { $this->_log("cart_items_data(qty)_equal"); } FALSEを返す; } //更新する必要があるアイテムの数が 0 の場合、このアイテムは不要であり、ショッピング カートから削除する必要があることを意味します //それ以外の場合、ショッピング カート内の商品数は、入力された商品数と等しくなるように変更されます if($items['qty'] == 0) { unset($this->_cart_contents[$items['rowid']]); } 他 { $this->_cart_contents[$items['rowid']]['qty'] = $items['qty']; } TRUEを返す; } /** * ショッピングカートのデータをセッションに保存します * * @アクセス非公開 * @return bool */ プライベート関数 _save_cart() { //まず、ショッピングカート内のアイテムの種類と合計金額をクリアしてください unset($this->_cart_contents['total_items']); unset($this->_cart_contents['cart_total']); //次に、配列を走査してアイテムの種類と合計金額をカウントします $合計 = 0; foreach($this->cart_contents as $key =>$val) { if( ! is_array($val) OR ! isset($val['price']) OR ! isset($val['qty'])) { 続き; } $合計 += ($val['価格'] * $val['数量']); //各アイテムの合計金額 $this->_cart_contents[$key]['小計'] = ($val['価格'] * $val['数量']); } //ショッピングカート内のアイテムの種類と合計金額を設定します $this->_cart_contents['total_items'] = count($this->_cart_contents); $this->_cart_contents['cart_total'] = $total; //ショッピングカート内の要素の数が 2 以下の場合、ショッピングカートは空であることを意味します if(count($this->_cart_contents) unset($_SESSION['cart_contents']); FALSEを返す; } //ショッピングカートのデータをセッションに保存します $_SESSION['cart_contents'] = $this->_cart_contents; TRUEを返す; } /** * ロギング * * @アクセス非公開 * @パラメータ文字列 * @return bool */ プライベート関数 _log($msg) { return @file_put_contents('cart_err.log', $msg, FILE_APPEND); } } /*cart.php の終わり*/ /*場所 /htdocs/cart.php*/ |
2. cart_demo.php ファイルは次のとおりです。
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
|
session_start(); require_once('cart.php'); $items = 配列( 0 => 配列( 'id' => 'sp001', '数量' => 20, '価格' => '10.50', '名前' => 'a002', 'オプション' => 配列( 「製」=>「中国」、 '会社' => 'bgi' ) )、 1 => 配列( 'id' => 'sp002', '数量' => 1, '価格' => '3.50', '名前' => 'b002' ) ); $arr = 配列( 'rowid' => '86dbb7cb58a667558b4bbb1f60330028', '数量' => 21 ); $cart = 新しいカート(); $カート->挿入($アイテム); //var_dump($cart->contents()); $カート->更新($arr); var_dump($cart->contents()); //$cart->destroy(); //var_dump($_SESSION['cart_contents']); /*phpの終わり*/
|