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