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