DCL 3.7.4
Loading...
Searching...
No Matches
ViewShoppingBasket.cpp
Go to the documentation of this file.
1#include <dcl/Config.h>
2
3#ifdef __WINNT__
4#include <windows.h>
5#endif
6
7#include <dcl/Files.h>
8
9#include "EShopServlet.h"
10
11__DCL_BEGIN_NAMESPACE
12
13#if __DCL_HAVE_THIS_FILE__
14#undef __THIS_FILE__
15static const char_t __THIS_FILE__[] = L"eshop/ShoppingBasket.cpp";
16#endif
17
18void EShopServlet::onViewShoppingBasket(
20 const EShopSession& session
21)
22{
23 Writer& out = ctx.writer();
24
25 ListedStringToStringArrayMap& params = ctx.__formMap;
26 StringArray& vPID = params[PRODUCT_STR];
27 StringArray& vQty = params[L"qty"];
28
29 SQLQuery q(session.SQLConn());
30 if (!vPID.isEmpty()) {
31 if (vPID.size() == 1 && vQty.isEmpty()) {
32 // 상품목록에서 "장바구니 추가"를 클릭했다.
33 int nProductID = 0;
34 try {
35 nProductID = Int32::parse(vPID[0]);
36 }
37 catch(Exception* e) {
38 e->destroy();
39 }
40 q.prepare(L""
41 "SELECT PRODUCT_ID "
42 " FROM ES_SHOPPING_BASKET "
43 " WHERE SESSION_ID = :SESSION_ID "
44 " AND PRODUCT_ID = :PRODUCT_ID"
45 );
46 q.params()[0].setValue(session.sessionID());
47 q.params()[1].setValue(nProductID);
48 q.execute();
49
50 q.fetch();
51 if (q.eof()) {
52 q.prepare(L""
53 "INSERT INTO ES_SHOPPING_BASKET "
54 " VALUES(:SESSION_ID, :PRODUCT_ID, 1)"
55 );
56 q.params()[0].setValue(session.sessionID());
57 q.params()[1].setValue(nProductID);
58 q.execute();
59
60// __DCL_TRACE1(L"insert : %d\n", q.affectedRows());
61 }
62 }
63 else {
64 // 장바구니 보기에서 "다시계산"을 클릭했다.
65 __DCL_ASSERT(vPID.size() == vQty.size());
66 q.prepare(L""
67 "UPDATE ES_SHOPPING_BASKET "
68 " SET QUANTITY = :QUANTITY "
69 " WHERE SESSION_ID = :SESSION_ID"
70 " AND PRODUCT_ID = :PRODUCT_ID"
71 );
72 for(size_t i = 0; i < vPID.size(); i++) {
73 int nProductID = 0;
74 int nQuantity = 0;
75
76 try {
77 nProductID = Int32::parse(vPID[i]);
78 }
79 catch(Exception* e) {
80 e->destroy();
81 }
82 try {
83 nQuantity = Int32::parse(vQty[i]);
84 }
85 catch(Exception* e) {
86 e->destroy();
87 }
88 q.params()[0].setValue(nQuantity);
89 q.params()[1].setValue(session.sessionID());
90 q.params()[2].setValue(nProductID);
91
92 q.execute();
93 }
94
95 q.execute(L""
96 "DELETE FROM ES_SHOPPING_BASKET "
97 " WHERE SESSION_ID = \'" + session.sessionID()
98 + L"\' AND QUANTITY = 0 "
99 );
100 }
101 }
102
103 TextTemplate tpl = *__pViewShoppingBasket;
104 TextTemplate& row = tpl[L"ROW"];
105
106 String strActionHREF = String::format(L"?%ls=%d",
108 tpl.assign(L"ACTION_HREF", strActionHREF);
109 tpl.assign(L"PRODUCT_STR", PRODUCT_STR);
110
111 String sql = L""
112 "SELECT S.PRODUCT_ID, S.QUANTITY, P.PRODUCT_NAME, P.QUALITY, P.PRICE,"
113 " S.QUANTITY, P.PRICE * S.QUANTITY AS AMOUNT, P.IMAGE_FILE_NAME "
114 " FROM ES_SHOPPING_BASKET S \n"
115 " INNER JOIN ES_PRODUCT P "
116 " ON S.PRODUCT_ID = P.PRODUCT_ID \n"
117 " WHERE S.SESSION_ID = \'"
118 + session.sessionID() + L'\'';
119 __DCL_TRACE1(L"[%ls]\n", sql.data());
120 q.execute(sql);
121
122 q.fetch();
123 if (q.eof()) {
124 tpl.erase(L"ROW");
125 tpl.assign(L"TOTAL", L"0");
126 }
127 else {
128 int64_t nTotal = 0;
129 while(!q.eof()) {
130 int64_t nAmount;
131 q.fields().byName(L"AMOUNT").getValue(nAmount);
132 nTotal += nAmount;
133
134 String strImage = Files::dirname(ctx.path()) + L"image/"
135 + q.fields().byName(L"IMAGE_FILE_NAME").asString();
136
137 row.assign(L"PRODUCT_STR", PRODUCT_STR);
138 row.assign(q.fields(), L"&nbsp;");
139 row.assign(L"IMAGE", strImage);
140 tpl.append(L"ROW", row);
141 q.fetch();
142 }
143 tpl.assign(L"TOTAL", String::valueOf(nTotal));
144 }
145
146 if (session.isGuest()) {
147 tpl.erase(L"ORDER");
148 TextTemplate& tplNotLogin = tpl[L"NOT_LOGIN"];
149 tpl.assign(L"NOT_LOGIN", tplNotLogin);
150 }
151 else {
152 tpl.erase(L"NOT_LOGIN");
153 TextTemplate& tplOrder = tpl[L"ORDER"];
154 tplOrder.assign(L"USER_NAME", session.userName());
155
156 strActionHREF = String::format(L"?%ls=%d",
158 tplOrder.assign(L"ACTION_HREF", strActionHREF);
159
160 tpl.assign(L"ORDER", tplOrder);
161 }
162 out << tpl;
163}
164
165__DCL_END_NAMESPACE
#define __THIS_FILE__
Definition _trace.h:14
wchar_t char_t
Definition Config.h:247
#define COMMAND_STR
@ CM_VIEW_SHOPPING_BASKET
@ CM_ORDER
#define PRODUCT_STR
#define __DCL_TRACE1(fmt, arg1)
Definition Object.h:399
#define __DCL_ASSERT(expr)
Definition Object.h:394
const String & userName() const
const String & sessionID() const
bool isGuest() const
SQLConnection * SQLConn() const
virtual void destroy()
Definition Exception.cpp:74
static String dirname(const String &_path)
Definition Files.cpp:268
StringWriter & writer()
static int32_t parse(const wchar_t *_number, unsigned _base=10) __DCL_THROWS1(NumericConvertException *)
Definition Numeric.cpp:264