DCL 3.7.4
Loading...
Searching...
No Matches
ViewProduct.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 <stdio.h>
8
9#include <dcl/Files.h>
10#include <dcl/Regex.h>
11#include <dcl/SQL.h>
12//#include <dcl/core/CollectionHashMap.h>
13#include <dcl/TextTemplate.h>
14
15#include "EShopServlet.h"
16
17#if __DCL_HAVE_THIS_FILE__
18#undef __THIS_FILE__
19static const char_t __THIS_FILE__[] = L"eshop/ViewProduct.cpp";
20#endif
21
22__DCL_BEGIN_NAMESPACE
23
24static String getContent(SQLFields& fields)
25{
26 StringBuilder strContent;
27 String strType = fields.byName(L"CONTENT_TYPE").asString();
28 if (!strType.compareNoCase(L"text", 4)) {
29 SQLField& f = fields.byName(L"CONTENT");
30 if (f.isNull())
31 strContent = L"&nbsp;";
32 else {
33 strContent = f.asString();
34
35 if (strType == L"text/plain") {
36 StringBuilder str = L"<p>";
37 str += strContent.toString().replace_r(L"\r?\n", L"</p><p>", true);
38 str += L"</p>";
39 strContent = str.toString();
40 }
41 }
42 }
43 else {
44 // image/
45 SQLField& f = fields.byName(L"FILE_NAME");
46 if (f.isNull())
47 strContent = L"&nbsp;";
48 else {
49 strContent = L"<img src=\"image/";
50 strContent += f.asString() + L"\" alt=\"image\">";
51 }
52 }
53 return strContent;
54}
55
56static void productDetail(TextTemplate& pi, SQLQuery& q, int nProductID)
57{
58 StringBuilder strSQL = L""
59 "SELECT DISP_POSITION, CONTENT_TYPE, FILE_NAME, CONTENT "
60 " FROM ES_PRODUCT_DETAIL "
61 " WHERE PRODUCT_ID = ";
62 strSQL += String::valueOf(nProductID) + L" ORDER BY DISP_ORDER";
63 q.execute(strSQL);
64 q.fetch();
65
66 if (q.eof()) {
67 pi.assign(L"PRODUCT_DETAIL", L"&nbsp;");
68 return;
69 }
70
71 TextTemplate& pd = pi[L"PRODUCT_DETAIL"];
72 TextTemplate& row = pd[L"ROW"];
73 int nSaveDispPosition = 0;
74 while(!q.eof()) {
75 SQLFields& fields = q.fields();
76
77 int nDispPosition = fields.byName(L"DISP_POSITION").asInteger();
78
79 switch(nDispPosition) {
80 default:
81 nDispPosition = 0;
82 case 0: {
83 if (nSaveDispPosition == 1) {
84 row.append(L"CONTENT", L"<td>&nbsp;</td>");
85 pd.append(L"ROW", row);
86 }
87 row.assign(L"CONTENT", L"<td colspan=\"2\">");
88 row.append(L"CONTENT", getContent(fields));
89 row.append(L"CONTENT", L"</td>");
90 pd.append(L"ROW", row);
91 break;
92 }
93 case 1: { // left
94 if (nSaveDispPosition == 1) {
95 row.append(L"CONTENT", L"<td>&nbsp;</td>");
96 pd.append(L"ROW", row);
97 }
98 row.assign(L"CONTENT", L"<td>");
99 row.append(L"CONTENT", getContent(fields));
100 row.append(L"CONTENT", L"</td>");
101 break;
102 }
103 case 2: {
104 if (nSaveDispPosition != 1)
105 row.assign(L"CONTENT", L"<td>&nbsp;</td>");
106
107 row.append(L"CONTENT", L"<td>");
108 row.append(L"CONTENT", getContent(fields));
109 row.append(L"CONTENT", L"</td>");
110 pd.append(L"ROW", row);
111 }
112 }
113 q.fetch();
114 nSaveDispPosition = nDispPosition;
115 } // end of while
116
117 if (nSaveDispPosition == 1) {
118 row.assign(L"CONTENT", L"<td>&nbsp;</td>");
119 row.append(L"CONTENT", L"<td>");
120 pd.append(L"ROW", row);
121 }
122
123 pi.assign(L"PRODUCT_DETAIL", pd);
124}
125
126bool EShopServlet::onViewProduct(
128 const EShopSession& session
129)
130{
131 Writer& out = ctx.writer();
132
133 TextTemplate tpl = *__pViewProduct;
134
135 SQLQuery q(session.SQLConn());
136
137 int nCategoryID = 0;
138
139 ListedStringToStringArrayMap::Iterator it =
140 ctx.__queryMap.find(PRODUCT_STR);
141 if (it == ctx.__queryMap.end() || (*it).value.isEmpty()) {
142 StringArray& v = ctx.__queryMap[CATEGORY_STR];
143 if (v.size() > 0) {
144 try {
145 nCategoryID = Int32::parse(v[0]);
146 }
147 catch(Exception* e) {
148 e->destroy();
149 }
150 }
151 else {
152 q.execute(L"SELECT MIN(CATEGORY_ID) FROM ES_CATEGORY");
153 q.fetch();
154 if (!q.eof())
155 nCategoryID = q.fields()[0].asInteger();
156 }
157
158 if (nCategoryID == 0) //assert nCategoryID > 0
159 return false;
160
161 TextTemplate& productList = tpl[L"PRODUCT_LIST"];
162 TextTemplate& row = productList[L"ROW"];
163 q.execute(L""
164 "SELECT PRODUCT_ID, PRODUCT_NAME, PRICE, SUMMARY, IMAGE_FILE_NAME "
165 " FROM ES_PRODUCT"
166 " WHERE CATEGORY_ID = " + String::valueOf(nCategoryID)
167 + L" ORDER BY PRODUCT_ID"
168 );
169 q.fetch();
170 int nID = 0;
171 if (q.eof()) {
172 tpl.assign(L"PRODUCT_LIST", L"<p>등록된 목록이 없습니다.</p>\n");
173 }
174 else {
175 String strActionHREF = String::format(L"?%ls=%d",
177 );
178 productList.assign(L"ACTION_HREF", strActionHREF);
179 productList.assign(L"PRODUCT_STR", PRODUCT_STR);
180 while(!q.eof()) {
181 SQLFields& fields = q.fields();
182 nID = fields[0].asInteger();
183
184 String strImage = Files::dirname(ctx.path()) + L"image/"
185 + fields.byName(L"IMAGE_FILE_NAME").asString();
186
187 String sz = String::format(L"?%ls=%d&%ls=%d",
189 PRODUCT_STR, nID);
190
191 row.assign(L"IMAGE", strImage);
192 row.assign(L"HREF", sz);
193 row.assign(fields, L"&nbsp;");
194
195 productList.append(L"ROW", row);
196
197 q.fetch();
198 }
199 tpl.assign(L"PRODUCT_LIST", productList);
200 }
201 tpl.erase(L"PRODUCT_INFO");
202 }
203 else {
204 // CM_PRODUCT_INFO
205 int nProductID = 0;
206 StringArray& v= ctx.__queryMap[PRODUCT_STR];
207 if (v.size() > 0) {
208 try {
209 nProductID = Int32::parse(v[0]);
210 }
211 catch(Exception* e) {
212 e->destroy();
213 }
214 }
215
216 q.execute(L""
217 "SELECT CATEGORY_ID, PRODUCT_ID, PRODUCT_NAME, PRICE, UNIT, "
218 " SPEC, QUALITY, ORIGIN, PRODUCER, SUMMARY "
219 " FROM ES_PRODUCT "
220 " WHERE PRODUCT_ID = " + String::valueOf(nProductID)
221 );
222 q.fetch();
223
224 if (q.eof())
225 return false;
226
227 nCategoryID = q.fields()[0].asInteger();
228
229 TextTemplate& pi = tpl[L"PRODUCT_INFO"];
230 String strActionHREF = String::format(L"?%ls=%d",
232 );
233 pi.assign(L"ACTION_HREF", strActionHREF);
234 pi.assign(L"PRODUCT_STR", PRODUCT_STR);
235
236 pi.assign(L"IMAGE", L"image/" + q.fields()[1].asString() + L"s.jpg");
237 pi.assign(q.fields(), L"&nbsp;");
238
239 productDetail(pi, q, nProductID);
240
241 tpl.assign(L"PRODUCT_INFO", pi);
242 tpl.erase(L"PRODUCT_LIST");
243 }
244
245 // 카테고리 목록출력
246 // 템플릿에는 CATEGORY_LINK와 CATEGORY_ACTIVE 두개의 내부 템플릿이
247 // 포함되어 있다.
248 TextTemplate& caLink = tpl[L"CATEGORY_LINK"];
249
250 // CATEGORY_ACTIVE 매크로를 삭제한다.
251 tpl.erase(L"CATEGORY_ACTIVE");
252
253 q.execute(L""
254 "SELECT CATEGORY_ID, CATEGORY_NAME "
255 " FROM ES_CATEGORY "
256 " ORDER BY CATEGORY_ID"
257 );
258 q.fetch();
259 int nID = 0;
260 String strName;
261 while(!q.eof()) {
262 SQLFields& fields = q.fields();
263 nID = fields[0].asInteger();
264 strName = fields[1].asString();
265
266 if (nID == nCategoryID) {
267 TextTemplate& caActive = tpl[L"CATEGORY_ACTIVE"];
268 caActive.assign(L"CAPTION", strName);
269 tpl.append(L"CATEGORY_LINK", caActive);
270 }
271 else {
272 String sz = String::format(L"?%ls=%d&%ls=%d",
274 CATEGORY_STR, nID
275 );
276 caLink.assign(L"HREF", sz);
277 caLink.assign(L"CAPTION", strName);
278 tpl.append(L"CATEGORY_LINK", caLink);
279 }
280 q.fetch();
281 }
282
283 out << tpl;
284 return true;
285}
286
287__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_VIEW_PRODUCT
#define CATEGORY_STR
#define PRODUCT_STR
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
Definition SQL.h:48
_CONST SQLField & byName(const wchar_t *_name) _CONST __DCL_THROWS1(InvalidIndexException *)
Definition SQLQuery.cpp:77
_CONST SQLFields & fields() _CONST
Definition SQL.inl:101
void execute() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:316
bool eof() const
Definition SQL.inl:91
void fetch() __DCL_THROWS1(SQLException *)
Definition SQLQuery.cpp:336