Shop::index()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 40

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 40
rs 9.28
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
/* 簡易ショッピングカート
3
 * 
4
 */
5
6
/**
7
 * @property Shop_model $shop_model
8
 * @property Inventory_model $inventory_model
9
 * @property Cart_model $cart_model
10
 * @property Customer_model $customer_model
11
 * @property Field_validation $field_validation
12
 * @property Generate_pagination $generate_pagination
13
 * @property Twig $twig
14
 * @property CI_Session $session
15
 * @property CI_Form_validation $form_validation
16
 * @property CI_Config $config
17
 * @property CI_Input $input
18
 */
19
class Shop extends MY_Controller {
20
21
	public $limit;	// 1ページに表示する商品の数
22
	public $admin;	// 管理者のメールアドレス
23
24
	public function __construct()
25
	{
26
		parent::__construct();
27
		$this->load->library(['session', 'twig']);
28
		$this->load->helper(['form', 'url']);
29
30
# モデルをロードします。ロード後のモデルオブジェクトは、$this->shop_modelなど
31
# として利用できます。
32
		$this->load->model([
33
			'shop/shop_model',
34
			'shop/inventory_model',
35
			'shop/cart_model',
36
			'shop/customer_model',
37
		]);
38
39
# このアプリケーション専用の設定ファイルconfig_shop.phpを読み込みます。
40
# load()メソッドの第2引数にTRUEを指定すると、他の設定ファイルで使われている
41
# 設定項目名との衝突を気にしなくても済みます。
42
		$this->config->load('config_shop', TRUE);
43
# 上記のように読み込んだ場合、設定値は、以下のようにitem()メソッドに引数で
44
# 「設定項目名」と「設定ファイル名」を渡すことで取得できます。
45
		$this->limit = $this->config->item('per_page', 'config_shop');
46
		$this->admin = $this->config->item('admin_email', 'config_shop');
47
	}
48
49
	// トップページ = カテゴリ別商品一覧
50
	public function index($cat_id = '1', $offset = '0')
51
	{
52
# カテゴリーIDとオフセットを検証します。
53
		$this->load->library('validation/field_validation');
54
		$this->field_validation->validate(
55
			$cat_id, 'required|is_natural|max_length[11]'
56
		);
57
		$this->field_validation->validate(
58
			$offset, 'required|is_natural|max_length[3]'
59
		);
60
61
		$data = [];
62
63
# モデルからカテゴリの一覧を取得します。
64
		$data['cat_list'] = $this->inventory_model->get_category_list();
65
66
# カテゴリIDとoffset値と、1ページに表示する商品の数を渡し、モデルより
67
# 商品一覧を取得します。
68
		$data['list'] = $this->inventory_model->get_product_list(
69
			$cat_id, $this->limit, $offset
70
		);
71
# カテゴリIDより、カテゴリ名を取得します。
72
		$data['category'] = $this->inventory_model->get_category_name($cat_id);
73
74
# モデルよりそのカテゴリの商品数を取得し、ページネーションを生成します。
75
		$this->load->library('generate_pagination');
76
		$path  = '/shop/index/' . $cat_id;
77
		$total = $this->inventory_model->get_product_count($cat_id);
78
		$data['pagination'] = $this->generate_pagination->get_links($path, $total, 4);
79
80
		$data['total'] = $total;
81
82
		$data['main'] = 'shop_list';
83
84
# モデルよりカートの中の商品アイテム数を取得します。
85
		$data['item_count'] = $this->cart_model->count();
86
87
# ビューを表示します。
88
		$this->twig->display('shop_tmpl_shop', $data);
89
	}
90
91
	// 商品詳細ページ
92
	public function product($prod_id = '1')
93
	{
94
# 商品IDを検証します。
95
		$this->load->library('validation/field_validation');
96
		$this->field_validation->validate(
97
			$prod_id, 'required|is_natural|max_length[11]'
98
		);
99
100
		$data = [];
101
		$data['cat_list'] = $this->inventory_model->get_category_list();
102
103
# モデルより商品データを取得します。
104
		$data['item'] = $this->inventory_model->get_product_item($prod_id);
105
		$data['main'] = 'shop_product';
106
107
		$data['item_count'] = $this->cart_model->count();
108
		$this->twig->display('shop_tmpl_shop', $data);
109
	}
110
111
	// カゴに入れる
112
	public function add($prod_id = '0')
113
	{
114
# 商品IDを検証します。
115
		$this->load->library('validation/field_validation');
116
		$this->field_validation->validate(
117
			$prod_id, 'required|is_natural|max_length[11]'
118
		);
119
# POSTされたqtyフィールドより、数量を取得します。
120
		$qty = $this->input->post('qty');
121
# 数量を検証します。
122
		$this->field_validation->validate(
123
			$qty, 'required|is_natural|max_length[3]'
124
		);
125
126
		$this->cart_model->add($prod_id, $qty);
127
128
# コントローラのcart()メソッドを呼び出し、カートを表示します。
129
		$this->cart();
130
	}
131
132
	// 買い物カゴページ
133
	public function cart()
134
	{
135
		$data = [];
136
		$data['cat_list'] = $this->inventory_model->get_category_list();
137
138
# モデルより、カートの情報を取得します。
139
		$cart = $this->cart_model->get_all();
140
		$data['total']      = $cart['total'];
141
		$data['cart']       = $cart['items'];
142
		$data['item_count'] = $cart['line'];
143
144
		$data['main'] = 'shop_cart';
145
		$this->twig->display('shop_tmpl_shop', $data);
146
	}
147
148
	// 検索ページ
149
	public function search($offset = '0')
150
	{
151
# オフセットを検証します。
152
		$this->load->library('validation/field_validation');
153
		$this->field_validation->validate(
154
			$offset, 'required|is_natural|max_length[3]'
155
		);
156
157
# 検索キーワードをクエリ文字列から取得します。
158
		$q = (string) $this->input->get('q');
159
# 全角スペースを半角スペースに変換します。
160
		$q = trim(mb_convert_kana($q, 's'));
161
# 検索キーワードを検証します。
162
		$this->field_validation->validate(
163
			$q, 'max_length[100]'
164
		);
165
166
		$data = [];
167
		$data['cat_list'] = $this->inventory_model->get_category_list();
168
169
# モデルから、キーワードで検索した商品データと総件数を取得します。
170
		$data['list'] = $this->inventory_model->get_product_by_search(
171
			$q, $this->limit, $offset
172
		);
173
		$total = $this->inventory_model->get_count_by_search($q);
174
175
# ページネーションを生成します。
176
		$this->load->library('generate_pagination');
177
		$path  = '/shop/search';
178
		$data['pagination'] = $this->generate_pagination->get_links($path, $total, 3);
179
180
		$data['q'] = $q;
181
		$data['total'] = $total;
182
183
		$data['main']   = 'shop_search';
184
		$data['item_count'] = $this->cart_model->count();
185
		$this->twig->display('shop_tmpl_shop', $data);
186
	}
187
188
	// お客様情報入力ページ
189
	public function customer_info()
190
	{
191
# 検証ルールを設定します。
192
		$this->load->library('validation/shop_validation_customer');
193
		$this->form_validation->run();
194
195
		$data = [
196
			'action' => 'お客様情報の入力',
197
			'main'   => 'shop_customer_info',
198
		];
199
		$this->twig->display('shop_tmpl_checkout', $data);
200
	}
201
202
	// 注文内容確認
203
	public function confirm()
204
	{
205
		$this->load->library('validation/shop_validation_customer');
206
207
		if ($this->form_validation->run() == TRUE)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
208
		{
209
# 検証をパスした入力データは、モデルを使って保存します。
210
			$data = [
211
				'name'  => $this->input->post('name'),
212
				'zip'   => $this->input->post('zip'),
213
				'addr'  => $this->input->post('addr'),
214
				'tel'   => $this->input->post('tel'),
215
				'email' => $this->input->post('email'),
216
			];
217
			$this->customer_model->set($data);
218
219
			$cart = $this->cart_model->get_all();
220
			$data['total'] = $cart['total'];
221
			$data['cart']  = $cart['items'];
222
223
			$data['action'] = '注文内容の確認';
224
			$data['main']   = 'shop_confirm';
225
		}
226
		else
227
		{
228
			$data = [
229
				'action' => 'お客様情報の入力',
230
				'main'   => 'shop_customer_info',
231
			];
232
		}
233
234
		$this->twig->display('shop_tmpl_checkout', $data);
235
	}
236
237
	// 注文処理
238
	public function order()
239
	{
240
		if ($this->cart_model->count() == 0)
241
		{
242
			echo '買い物カゴには何も入っていません。';
243
		}
244
# モデルのorder()メソッドを呼び出し、注文データの処理を依頼します。
245
		elseif ($this->shop_model->order())
246
		{
247
			$data = [
248
				'action' => '注文の完了',
249
				'main'   => 'shop_thankyou',
250
			];
251
			$this->twig->display('shop_tmpl_checkout', $data);
252
# 注文が完了したので、セッションを破棄します。
253
			$this->session->sess_destroy();
254
		}
255
		else
256
		{
257
			echo 'システムエラー';
258
		}
259
	}
260
}
261