ĐẠI HỌC ĐÀ NẴNG
TRƯỜNG ĐẠI HỌC BÁCH KHOA
KHOA CÔNG NGHỆ THÔNG TIN
!"# $
BÁO CÁO THỰC TẬP TỐT NGHIỆP
NGÀNH CÔNG NGHỆ THÔNG TIN
MÃ NGÀNH: 05115
ĐỀ TÀI:
DU LỊCH VIỆT NAM
SINH VIÊN : Huỳnh Đức Dũng - 06T1
Nguyễn Văn Huỳnh – 06T2
ĐƠN VỊ : Công Ty Toàn Cầu Xanh
CBHD : Nguyễn Hữu Dũng
ĐÀ NẴNG, 01/2011
Tãn âãö taìi åí âáy 2
LỜI CẢM ƠN
Chúng tôi chân thành cảm ơn anh Nguyễn Hữu Dũng đã tận tình giúp đỡ, hướng
dẫn, góp ý cho đề tài. Chúng tôi xin cảm ơn ban lãnh đạo và tập thể nhóm lập trình của
công ty TNHH TT – KTS Toàn Cầu Xanh đã tạo điều kiện thuận lợi, hỗ trợ rất nhiều
trong quá trình thực tập. Cảm ơn sự giúp đỡ quý báu của các bạn hữu về tài liệu và
kinh nghiệm.
% &#'()(*+, /0111
Tãn âãö taìi åí âáy 3
LỜI CAM ĐOAN
Chúng tôi xin cam đoan:
Những nội dung trong báo cáo này là do chúng tôi thực hiện dưới sự
hướng dẫn trực tiếp của anh Nguyễn Hữu Dũng.
Mọi tham khảo dùng trong báo cáo này đều được trích dẫn rõ ràng tên
tác giả, tên công trình, thời gian, địa điểm công bố.
Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, chúng
tôi xin chịu hoàn toàn trách nhiệm.
Sinh viên,
Huỳnh Đức Dũng
Nguyễn Văn Huỳnh
% &#'()(*+, /0111
MỤC LỤC
CHƯƠNG 0
MỞ ĐẦU
I. Giới thiệu đơn vị thực tập
Công ty TNHH Truyền Thông - Kỹ Thuật Số Toàn Cầu Xanh234#56 5789:;
<"6= '6,>?>??#@ '#5 5+ 59A#6B '8=CD#+# '6 5 '5E5=9
2F '#5G,HC= 'I 5J#K< 535HLH85+CM #+#N 'O 'CP E
3Q 'R85+885S "E"5HLH 57 ; 53T '5;Toàn Cầu XanhJ56=#U234#
"F2F 'V#5,P P 5* P '6L 5 '5;"LH 5N##5,P "W X29 '
YF 'V3Q ,( #G#W ',Toàn Cầu XanhW 2Z '56 5#@ 'L5+#556 ' 5["
23C 5\ ''R85+8X3 5Q" '2H J56] '#5=L5+#556 'D 5\ 'R
85^"#U#5Q34 '#=#@ 'D'+56 5548_
:D"O#PC`56 5"F2T a#U,( C= 'I 5J#K<9:;<"6A#
2"9 5\ '; (#5#5=L5+#556 '#5b 'WcL5W ' 'd ' * '#=Ce 52F#G '#X
2F 'V#RH * '#=#5Q34 'R 85^"2M '6,#6 '#U 5\ 'R 85^"X5T
85O#OL5+#556 '
II. Giới thiệu đề tài
:;<"C= ' 5\ ' f"'S 2*,#U3D#85+CM Q 34 '9=J '234#
5e 5R 562M"2H 5* 5; 5Q8g L5+#5BX34 'L5+#5hX#H2H :;
<"2 ' '6,#6 'f '<H 53 f"???:;<"2U C;34L5+#5
hX#H f"??6C;34L5+#5hX#H6 f"??XL5+#5a#52H
:;<"c34#= XC;3434"O#P 2S6C;34:D
X#2Ff 'C3` 'C 'e 556 ' f"E34 'L5+#5L5=R '?i:;<" '6,
#6 'L5j '2a 56"F2M"2H 5Q8g CP R 2Za#55H'DBXL5+#5
F2a f"??#V '3D#29C;345 578da#5L5=R '???k
2Z '2U ''U8L5=R 'ilm0'Rh,H;#6"#5=C;=2F '
d5J#n 2U 5U"#5b '""= '"X N 'O ' 5o#6=I 5J#
a#52M'U885S a#5:;<" '6,#6 '6"F2M"2H ,P5(#5CP 5H'D
mJ+ pm-a#5:;<"q6"F5;5X ''Z"r685S "E"#59,CP
2F 's5L5+#52H :;<"D 5\ '#5H#"C85= CP ,5eL5+#5
a#5n6 '2a 5a234#o2F#G"e 5 5thl0B<HL5+#5#U#685S
"E"pm-a#5:;<"q5en6 '#5u 5\ '5e 5R 5"e 5#5O8234#P
rhl0vBYZ '5t85S "E"CP 2F '#] # '#Q8 5E5W '
w(#5Ea#5 53e"23t 'e""+,xy#+#2a 5a#5'S aC(5;
9#+#h+ f 2z#R :Drd 5\ '5e 5R 5# '#Q8d '3t@ '6
L5+#55e92"2H #5= '3t@ 'CR '5;"a#5hR 5CQ5J#H
c'X ' 53"F"9 '%5FEa#5{9 2a#59 #5u5e 5R 5P
r{9 |#G9 6="H#R" 57 #5u Le 5#5o R 52}8{P
#9 5r#] #U 5\ '#5N# f '3T 'J 5385S "E"CP 2F 'e"
23t 'e"xy5e#] P LH2H D 5E 5656 'L5+#59 2M# '#Q8
5W ' P r#5=85~8P 5;2z56 '=
III. Mục đích đề tài
1*,J '5;5X '85S "E"pm-a#5:;<"qCP r62; 5=92F '
•R '+5e 5R 5:;<"D9 ECP =6 5H'D
y '94 57 #5= '6 5L 5= 5a#5:;<"
IV. Mục tiêu và kết quả đề tài
• e"5MKL858
• e"5M€€y!
• e"5Ml=='y8x8
• l0B
•J+ 6,#W ';##S 29#G 5U"6*,J '2M5;5X '(#5548'\
r62; 5=9•;5X '# '#Q8L5R f ' 53
• mJ6=l0B2a 5a234#o2F#GL5+#5
• e"23t '2e"5W ' #S 5H 5656 'L5+#59 ; 5P #W '
P
• 1*,J '234#rC#2MR 5#5O8d2; 5=9234#2f 'P r
• 1*,J '234#"9 '%5Fa#5CJ#,H
5=#5b 'W2*,6"F2E65,65H5J#<5U"#5b 'W"= ' 57 234#J
'U8_#G#+#5S,#W53D 'g 2M5J#5; 56 5"F2E6X '5;8
CHƯƠNG 1
CAKEPHP
I. Giới thiệu
KL8586"FC"r=CL85+CM 5 5#G0•0@ '#+#"W5e 55HLH85wH
234#H2H 53x#v#=Cx=#= my88 'C= K= C=C6y:KyO#
2(#5#5( 5#G#5b '6# '#Q8"F#QCb#C"r=CL#5=85~8 '3t@ '0•0`"o
#Q82F85+CM "F#+#5 5 5#5U '"FN 'O 'r"9 5"6L5W '6""Q2Q
#N( 5 55=9
yFC"r=CL0•06"FF#=#= #+#"%53; D86"WC3t 'C "
'b8 '3t85+CM *,J 'C 'r 5 55T ‚3` '#5( 5;#ƒO '#+#
C"r=CL6# '#Q8#5= '3t85+CM D#+##5N# f '5W '53t '6"F#QCb#
#TR 2M5o#U5M*,J 'CP N 'O '#G5o•S5H 5\ ' '3t85+CM 0•0#U
6L 5 '5;"6"F78#+#53; #G5o6#QCb#2M'b8#5b '85+CM 5 5
5T e5o#U5MƒO '#+#"%#TR #G5od"F8C=„# 6,D#+#8C=„#L5+#
<53 ';#*,J '"FN 'O 'rCP "FC"r=CL"% 'Z "` 53KL0•0
C…C6 '#U 5\ '4(#5#G U:D U '3t85+CM L5W '#5†ƒO 'L 5 '5;"#G
5o"6#] L 5 '5;"#G 5E '3t85+CM L5+#6 5\ ' '3t2%@ '685+CM
C"r=CLC"r=CL#V ' #7,5T e U234#@ '6LM"C` 5E '3t85+
CM N 'O '{P #9 52U@ '"FC"r=CL 53KL0•0#U 5E57 4"6Q#R
'3t85+CM P h C= '8C=„#85R5=h3D#6h‡#'X ' 52M#QCb#
N 'O 'YE 6,C` P n6 '5T #5= 5\ ' '3t85+CM "D2M'Rh,H H
#5b '#@ 'h3D##GC"r=CL
II. Cấu trúc thư mục của cake
s59 "`'UKL9 c5Q,234##+#=C#5( 5
88K5N#+#6=C#5=N 'O '#G9 53"O#88653"O#85+
CM N 'O '#G9 #5N#+#=C6#+#P C= '
#LK5N#+#53; #=CKL{9 L5W ' P 2O '6= 5\ '53"O# 6,Cd
L59 H9 2 '6"'e
=#K5N#+#6;KL#5j '59 53C"#=8,C'565,2w#+#
='{9 #U5M3C\6;#G#5( 59 C= '53"O# 6,
CK5N8C,#=53"O# 6,#U5M#5N#+#53; 5C8C,#5j '
59 53'UBryC#5=;#'`"F "
:;##553"O#53; "z#2a 5#=CKLd53"O#N '@ '6"#5=#UL5R
f '2M 5EN 'O 'L5+# 5#5u"FR #62zKL:D#QCb#53"O#
6,9 #U5Mn6 ' * '#Q885P R KL2%Z 9"6L5W 'R 553` 'DQ
#NN 'O ' 6=9 2%H{R '"WR#5H#QCb#53"O#KL"z#2a 5
53"O# yWR
88
#= '>
#= C=C>
#="8= >
> 858
=#>
"=>
8' >
>
"8>
=C>
r>
" >
CC=C>
58C>
,=>
rC==>
#>
>
"'>
„>
53 "O# #5 #5= N ' O ' #G
9
K5N#+##Q5e 5#5=#QCb#
#5 '#5j '59 53LH X#T`
\;R="7C,#78#= C=
K5N#+##= C=CC= 'N '
O '(OCˆ#= C=C858
K5N #+# C
#="8=
K5= 85~8 9 8=,CM L5
KLD>88 53m=#" v==
K5N#+#=# T n C
ƒ_DhX#H5U
K5N#+#"=
K5N#+#8'
K5N#+#53"O#6#+#
m@ '#5=##56='
K5N#+#53; 5C58C,
K5N#+#53"O#6#+#r
#5=;#5M 5a'5=r#8
!"
K="CC=C8'
•8C
K+#,=N 'O '
m=#" v==#5=N 'O '
K5N#+#N 'O ',5
K5NQ#N 6=
K5N2Z5o
K5N#+#€B#C8
#L> K5N#+#53; #=CKL
=C> K5N#+#53; 5C8C,#5=Q
#R#+#N 'O '
Figure 1: Cấu trúc thư mục Cake
III. Mô hình Model View Controller – MVC
KL* 5=#QCb#y:K#5=N 'O '#G9 Y*,6"W5e 55HLH234#
@ '5W '53t 'C= '85+CM 85S "E"`2U#=234##56"85S #5( 5
"=r#= C=Cy=#5==6 F3T '+#Dr#5=;#Q
C65M 5a#= C=C#5=Q#R#+#; 55,#C8#5= 5786=68C='C"=ryF
N 'O '2M 5e 50•0CF 5\ '#5N# f ' 6,C= '#@ '"F#=6"#5= UL5U,
Ce" 6'
Y*,6] 'C,E =r2M 5e 5#5=0•0#C8 '
Figure 2: The typical flow for PHP scripting
K '`,P#S2H "F0•0#C8[ ';#'…"F‰v-5=z###L6="F
L
B#C8ƒ_\;62U'`,P#S\;CJ#H8D
B#C8 57 Q#N\;C6ƒ_\;
B#C89=C=86=CrC UDCe 5,;#G#
<UU"9"o5N234##5NC= '"F0•0#C8{[ ';#ƒO '56" #
'3t85+CM #`ŠQ#R#+#56"5W '53t '6=#+# '=6L5+#6"#5= U#U
5M'R"234#J35dK+#N 'O '0•085N#98 5Q@ '#+#2X34 '#U5M'o
Q#N2*C= 'N 'O '2U6#5† 5ƒ@,5F#6=#+#H 6#+#5H78#5,M
6=#5b '<'3t85+CM L5@ '#+#2X34 '6#+#D8#U5M#QCb#N 'O '5=
5E#+#5
y:K85+CM JCP 0•0=r66"FLI575;hRC= ';#9=C#+#2X
34 'D85;@ 'C= '=6 FN 'O 'yO#P#5( 52[ 'y:K69=C"‹
#5N# f '#GN 'O '234#H"FS 6#5†"FS e5H] '#=234#'R"3
5dKL29234#"O#2(#5 6,[ ';#L5W '#5†# '#Q86 ',P #5=y:K#U5M
6"234#"6#] [ ';#ƒO '"F853T '85+8 5Qh+ #5= T2M3C\#+#5=9
2F 'C= 'N 'O 'YT 'R 2zP #+##G9 "F#+#5#5‡##5‡ #5=85~8KL
548 5E#+#6 ',P D 5"6L5W '@ 'Q#N"%#5†2a 5 6=
IV. Cách làm việc của MVC
y:K#U5ML5+# 5@,5F#6=C"r=CL"69 2 '6";# 53 ' U#5 '
U6";# 53
Figure 3: How Cake makes use of the MVC structure
K '`,P#S"FC 'DN 'O '[ ';#'…"F‰v-5,##L6=
"F L5=h3D#"F‰v-2M 5e 553t '#U#QCb#
58>>Œm=" •#=">Œx88#= •>ŒK= C=C•>Œx#= •>Œ0C"C#•
m8#5C '3t'`2#C885* (#5#QCb#‰v-6h,H2a 5#= C=C
6=2M5J#5<U#V '#U5M#5,M 8#@ 'DQ#N56 52F '6#+#5"XD
#= C=C
•6"C= '#= C=C#U5M#S 2Mƒ_ 5E\;5T #+#5"X=CrC
`8#5C<U#U5M#59, 5EC,Q D#T`\;6‡8H8\;
s5"=Q,8Q#N\;d5=z#'`\;2H UCRE
=8#G UD#= C=C
K= C=Cƒ_\;6QDr
:r5P"6=Q#N5HLH5=z#5M 5a\;D#= C=CQ6'`;#
Q#G UDCe 5,;#G#
-4(#5#G;#ƒO 'y:K2M85+CM #+#C 'r6#+##5N# f '234#z89
6#+# 5;"O#U5M234##5#‡e7,#5=85~8#5† 5ƒ 5 55T 57"#5( U#U
5M'b8C= ';#'ŽCXyF‹234#'\C= 'Xh+Ce 53T '+#D
53t '53t 'Q 2Ec` T 6=2UC= '"F"=•M234#3T '+#R,
C#5†"F T6"#5= Un6 ''Rh,H 5\ 'Q 2E
IV.1. Model
C= 'KL0•0"F"=5M 5a"FR '#T`\;#O5M-;#U"F"=
Q#R"%0•0P h 2H C,#785P"#5† 5ƒ5,U#+#R '5dR '2E`
C= '"=y=#V '#5N#+##=2a 5 '5Ih 5;#G UD#+#
"=L5+#<U#V '2a 5 '5I#+#h‡#2EL; \;L55P"6#78 57\;
#5="=2Uy=#U5M234#5M 536S '\;#GN 'O 'y=#V '6 T
R,C ='#P h D"=2U P 234#2a 5 '5I:(O H#U"F"=
2M5M 5a#+#5TQ#R#+#56 52F 'P h 2H U 53"+ P 234#
2a 5 '5IC= '"=2U
IV.2. Controller
C= ' KL0•0#= C=C2EL5M ] 'N 'O '5,='##GN 'O 'y‹
C 'r,P#S234#CJ#H82H "F#= C=C#O5M T"6 '3t@ ' 5786=\
;0•B5=z#l!234##5Q8 57 B2U#= C=C='##5Q8 57 2+8N ''e234#
9=CK= C=C='#53t '#5N#+#t'oD#+#"=2MC,#78\;6#V '#U
#+# #5N# f ' 53 LM" C C,#78 2E L5M KX #@ ' #= C=C #5,M 2+8
N '=8DrK= C=C#U5M234#5M 53S '='##GN 'O '<532%2E
#78`CP "= P #UQ#R ='##G"FN 'O 'K= C=C P G, 5;"
#+#5=92F 'D"=5HLHL5=5o#53t '234# U2H 53p"= 5
#= C=Cq
IV.3. View
:r6#+#2SC=85=z##+#2+8N '234#'`C`9D '3t@ 'L5"F,P
#S234#ƒ_KTR #5b ''Z""%"CL8 53•y- 5b 'D"%0•0 53 '
#5b '#V '#U5M#U#+#=C"L5+##5=2SC 531y-0m@,5F#6=5=6 #R 5
:r#U5M234#5M 536S '5M 5a#GN 'O '
V. Quy ước đặt tên của cake
V.1. Cách đặt tên Controller
P D885R6X 5E685R#UK= C=C234# X5=(O‰CK= C=C
<H2X34 '#U 5E5T "Fd5ed5N585R‡2SD"F#5\5= 536
OnlineUsersControllers5W '@ 'L(J'9#53D2M#5#‡#+#d
P 85R6 X 5ED ˆ#= C=C X 5= 62W 6 858 ( O 53
users_controller.php<H2X34 '#U 5E5T "Fd5e5=#+#d6
Q'9#53D(O 53online_users_controller.php.
V.2. Cách đặt tên Model
P D885R6X( 53‰C<H2X34 '#U 5E5T "Fd5ed5N585R‡
2S[ 'L(J5= 53• ‰C
P 85R6X(D2W858 53user.php<H2X34 '#U 5E5T "Fd
5e5=#+#d6Q'9#53D 53online_user.php.
V.3. Cách đặt tên View
P r234#Q,`P #G56 52F '#= C= '#= C=C:(O 532X
34 ' #U "F 853T ' 5N# 6 UsersController::show() 5e 23t ' g 6
88>r>C>5=r#8
V.4. Cách đặt tên bảng
P R 'C= '#T`\;85R6X 5ED#+#d234##5C`Q'9#53D
53#= C,ˆ#={9 #U5M'52|h3D#2zP 6,[ ';#5H785F#( 5
•#5=P R '"69 "X
:(O9 #U5M5H78 53
$useTable=’mytable’;
:D",6P #G"FR 'C= '#T`\;
VI. Components
K="8= 6#+#D8234#2a 5 '5I2M5J#5#+# 5;"ON 'O '#O5M2M5‹
C4#= C=CKL*,J '‘ 5E#="8= #5j '59 53x5#5=+#5J#
'3t@ '6 5U"!"B= vh• Cx##5=2EL5M C,#78 '3t
@ '6 5U"K="8= #U234#234#2a 5 '5I` '3t@ '
Q #R #+# #="8= "6 9 85+ CM 85R 234# 3 C\ C= ' 53 "O#
88>#= C=C>#="8=
VII. Helpers
•8C6#+#D85‹C42M'R"5t' 85+CM [ ';## '#Q8#+#5=C#2M
9=C#+#56 585S 5M 5aK+#58C234#3C\C= '53"O#88>r>58C
{R '"WU"‡658C#U‘ C= 'KLYMe"5MLI5T EKL58C5%,
6= LKLx0’9C '58>>8#L858=C'
•8C yWR
•y- lb89=CJ2F '#+#56 585S •y-
6#V '#5=85~89=C#+#5u•y-
[ ';##5Q8 57 685* (#5#+#H
•8C 6,234#'oC= 'r[ ';#
ƒO '2X34 '•5"YM='Z""F
5"#5HD58C•y- @ 'H
$helpers=array(‘Html’).
=C" lb89=C#+#=C"6ƒ_m@ '2X
34 '•=C"D#+#56"#G U2M9=#+#
56 585S =C"
x„ lb82M2T 'R #+# 5;"Ox„<U
,P #S #* ; 5 $javascript-
>link(array(‘prototype’))C= '
r 5" #5H 0C==,8 €B#C8
C"r=CL2M6";#2b '#+#5C= '
"Fr
€B#C8 lb82T 'R #+# 5;"O €B#C8
5369=C2X34 '€B#C8•„#
<== €B•< d "F "R ' @ '
$javascript->object(). YM '‡
"F J L; D "F 56 5 85S @ '
$javascript->event().
0' =C lb82a 59 '\;56 5 5EC '
5,‡8H8\;JCP 65"X
B= K '#Q8#+#56"2Mƒ_DCe 5hR
_ = :( O 2M 23 C "F
"'@ ' $session->flash().
YM2o#Q#R#+#'+Ca3C\C= '"F
= #5=C3D#@ '
$session->read().
K '#Q8#+#56"2MƒbD5=z#
C '
" lb8hR _6"
1y- lb85;#5† 51y-YM9=C#+#56 5
85S 1y-@ '56"$xml->elem().
Figure 4: Helpers
VIII. Data Validation
m:= 6"F85S 5H ,H#G2R" R==6 } 6#5( 5+#\;
"` '3t@ '5W 'h"Fr=C"KL*,J '6LI57P#5^
{9 #5†2a 5#+#h‡#C= '"F"=6KLcJ2F '+8O '#+#h‡#2UL5"F
r=C"234#LH XD"=2UK+#h‡#2U#V '#U5M+8O '#5=\;1y-
IX. Quan hệ các bảng trong cakephp
C= 'KL0•0h 5;'\#+#R 'C= '#T`\;234#2a 5 '5I5W 'hJ
LH548=#= {[ ';#ƒO 'KL0•0•vy=„#C= "88 '#U
5M3C,O#U\;P h 6=5=z#d 5ER 'L5+# 52T 'R 6 5 5
5T "6L5W '#S 85RH 5E#*; 5C,Q B•-85N#98D 5E#*; 5€•’<
\
2%H#ULMh 5;#TR '\#+#R 'C= '#T`\;
= == 5=
= =" ,5" ,
" ,=" ,5 = '=" ,
YMe"5ME#+#"Xh 5; 6,#5b '*,J '"FN 'O '='2T 'R @ '
#= '2MLM"C“ 'O ' 6,c'b8#5b '5R=7 E#+#LH548C= '"F
#+#5n6 '5T @ 'KL9="FN 'O 'KLP ='
5HLH\;
CREATE TABLE `posts` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) default NULL,
`date` datetime default NULL,
`content` text,
`user_id` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `comments` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(100) default NULL,
`content` text,
`post_id` int(11) default NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(100) default NULL,
`email` varchar(150) default NULL,
`firstname` varchar(60) default NULL,
`lastname` varchar(60) default NULL,
PRIMARY KEY (`id`)
);
{R 'Cc#5N 5+#5#+#+#'R5; #U#+#6='s5"F6H234#9=
C Uc234#'+ "F+#'RdR 'CK5b_C[ '#U"FC3t 'C= 'R '8=P
CˆK+ 6,c2b '"#5DC3t 'C= 'R 'C UP LH"F+#'RD
6H3T 'JC= 'R '#="" "‹#5b5(#5c234#'+ D"F6HC= '
#@ '"FLM3T 'JC= 'C3t '548 6,#U"FC3t 'P 8=ˆc2b '"#5
DC3t 'C= 'R '8=
C= '#+#"=9 c'R5(#5C…C6 '8=#+#LH548 6,2MKL#U5M
L~=8#5b 'D 5•T \9 #U5MLM"CX#+#59 d#5†2a 5#+#LH548
6,@ '2z#( 5#= '
“Belongs To”
s5LH548#+#R '9 #S U#5=KLLMh 5;'e"‹R 'D#+#R 'L5+#
{='c#U"Fh 5;p= '=qC= '"FF2W#=8#+#R 'YSP "‹6
H='c234#'+ D"F+#'R2%#5†2 5"‹68=='p= '=q"FC
{9 2z"FC3t 'CˆC= 'R '8=2M3"Xh 5; 6,y‹R ''5C= '
R '8="FC= '#+#R ''5dR 'Cc234#39[ ';#'+ "F’m#G U
DCˆ
YM*,J 'h 5; 6,C= '"=2SP C= '"=0=88>"=>8=858
5P"6=#+#] '#=2M'+ U"Fh 5;p= '=qD‰C"=
<?
class Post extends AppModel {
var $name = 'Post';
var $belongsTo = array('User');
}
?>
{9 6"2E 6,[ '#+#5'+ "F"R '#G#+#"=2U685S #Gh 5;D
"=5; 9{H 2X34 ' class KL@ '2M*,J 'h 5;p= '=q6
5F#( 5C$belongsTo.
C= 'Q#NN 'O 'KL"Xh 5;p= '=q234#9=C` 5\ '] '#=
CP {9 #V '#U5M5P"6=#+#"Xh 5;[ '#+#5 ##5b 'C= '"F#b85+8
, "R '
className
yFdL5U#U5M234#='Z"D5H78•= '=6#<"YT 'R
#<"6"="65; 9"=5F#EC= 'C3t '548 6, Uc234#5H78
6‰C '5I6P D8#G"=#GR 'C
foreignKey Parameter
dL5U 6,5H78L5U '=9e"5Q,C= '"=P h :;#5H78 6,5\
(#5#5=;##5†2a 5 5E"Xh 5;p= '=q
Conditions Parameter
dL5U 6,#5N"F#5‹B•-o##+#R ''5"=P h <U#5 ' Uc
#5N#*; 5B•-h> =h#5="FC3t '(O0=85”
Fields Parameter
yz#2a 5KLcCREQ#R#+#C3t 'dR 'LH548C= 'C3t '548 6,#+#
C3t 'dR ''5‰C234#LH548D8=5; 9c234#23C66"#5=5;
O 'D"=0={9 #U5M59 #5H2E 6,[ ';#@ 'dL5U
{9 #U5M5H78 5\ 'dL5U 6,#5=#+#'+Ca#G9 [ ';#'+ #5b ' 536
"F"R 'D"‹2X34 'C= '"R '•= '=Y=9 #=c#5†Ch 5;0=
p= '=qDQ#R#+#dL5U234#5M 5a
var $belongsTo = array(
'User'=>array(
'className'=>'User',
'foreignKey'=>'user_id',
'conditions'=>null,
'fields'=>null
)
);
“Has One”
y‹h 5;DLH548+ 5985R234##5†2a 5C= '#R553D 'y‹68=
5F#E#+#C6#532G{9 85R#5†2a 5C= '"=‰C#+#5#+#C234#LH
548DQ#NR 'L5+#C= 'C3t '548 6,"FCc#U 5E8={"Xh
5;6p5= qq5" ,qq5 = '=" ,q
yXh 5;p5= q 6,5J##5Q6h 5;= == C= ' 5EN 'O ''+
8C=DC#5j '59 #+#C 'r"Xh 5;p5= q234#@ 'y‹C#U
"F8C=5; C9 '6"F8C=5F#E#5†"FC
YM5H78"Xh 5;p5= q9 5H785F#( 5$hasOne 53#+#59 2%
6"D$blongsTo C= '"=0=5H78h 5;
var $hasOne = array('Post');
className Parameter
C= '"Xh 5;p5= q#<"W W 234#5H78D"="6#5N
5F#( 5= '=#5†6=8= 6="=5; 9
foreignKey,conditions,and fields Parameters
lX ' 53C= 'p= '=q
dependent Parameter
s5U#+#R ''5C= 'h 5;p5= q#U5M9 "X #R5#5ELH548
234#U:(OL5"FC#U"F8C=6C2UaU9 "X 8C=LH548
#V 'aU5=C= 'C3t '548 6,dL5U8 c#5=85~89 6"2E 6,
"F#+#5n6 'yz#2a 5 U234#5H785H788 56 5C2MUQ
#R#+#C3t 'C= '#RR 'L556 52F 'U234##59,5W 'h#+#"=LH548
“Has Many”
{9 d9=C0="='t9=C‰C"=C= '53"O#88>"=9=CC
"=D] '#=
<?
class User extends AppModel {
var $name = 'User';
var $hasMany = array('Post');
}
?>
C= '='"‹Cc#U 5E68=57"#5( HC#5† 5786="F68=
9 g "X h 5; 6,c#U5M3C\ 5E5T "F8=CP C
{[ ';# U#5=‰C"=C[ ' 5E8=C#=C234#LH548D U65=6
#5† 5h 5;C= '"=0=D5F#( 5= '=KL#U5MP LH"=D
5
YMƒ_ 5E5T 9 "X 5P"6=#+#5"X#5="Xh 5; 6,
className,foreignKey,conditions,and fields Parameters
K+#5"X 6,234#"WR`CP
dependent Parameter
C= 'h 5;p5" ,q5H788 56 5Cc6";#"F#+#52;h,
<U #+#5 L5+# H 9 5H 78 5F# ( 5 •5y , C= ' ‰C "= 56 5
8 ”•C5eQ#NL5 6="FCaUQ#R#+#8=234#'+ DC2Uc
aU
Order Paramter
{9 #U5Mƒ_;#‡8H85NJ#+#R ''5LH548[ ';#5P"6=#b85+8
B•- C= ' 5" X 6, :( O C= ' ‰C "= 9 #U 5M 5H 78 =CC 56 5
0="xBK6 Uc‡8H8Q#R#+#6HP LH8=D '6,'t5=5NJ
f 'S
limit Parameter
:6#T`\;,P#SCRE"FX34 '#+#R ''5LH548=#
{9 #U5M59 #5HX34 '#+#R ''5CRE2M#‡'R"5t' =CP CC{9
6"2E 6,[ ';#5H785F#( 5 6,D"F'+Ca5M 5aX34 'X2#+#
R ''5LH548KLc23Cd#T`\;
yXh 5;p5" ,q#J#L–5\(#5#5=;#'b82Ž2M5HLH5;hR
<H9 HC[ '9 J2a 52z"F" #5o C= 'N 'O '#G9 #5=
5EJ#5o c234#3C\C= '"Xh 5; 6,c'b89 6"2E2U"6
L5W '85RH"F 5+#5I 5C= '•y-5,6=2U9 #U5M*,J '"FR '
2M3C\ 5\ 'J#5o 6,6LH548#5b '5W 'h#+#"=@ 'h 5;p5
" ,q
Kiểm tra các kết hợp này:
yF#+#52T 'R 2MLM"C2U6@ '5F#( 5#= '{9 2%9=C0=6
‰C"='t9 #S 9=C#+##= C=C2M#59,#=
9=8=ˆ#= C=C858C= '53"O#88>#= C=C65P"6] '#=
<?
class PostsController extends AppController {
var $name = 'Posts';
var $scaffold;
}
?>
9=C88>#= C=C>Cˆ#= C=C85865P"6=6] '#=
<?
class UsersController extends AppController {
var $name = 'Users';
var $scaffold;
}
?>
“Has and Belongs to Many”
Y*,6"Xh 5;#UN#"9 5D 8=rC 53 '#V '#U#5bL5UL5f 2MLM"
=+"C<5EC 'r@ ''5u2M5H8=CC F '#G5o<5E
=''+ "F#'=C,D"F8=c#U"F 5+#5#+#'#U5M234#'+ 5ES
D 5E#*#5,; 6 '34#9Y*,6"Xh 5; 5E 5E'\8=6'yF
8=#U5M#U 5E'6"‹'#U5M5F#E 5E8=
KT`\;#U5Mƒ_#+#"Xh 5;" ,=" , H#U"FR '5N3
C\"Xh 5; 6,C= '(O8=='"FR '5NP 8='c234#9=C
<Uc#5†#U5C3t '68=ˆ6'ˆ
YM5P""Xh 5;p5 = '=",q6=N 'O '='#S 9=C"F
R '"DP 'C= '#T`\;
CREATE TABLE `tags` (
`id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(100) default NULL,
`longname` varchar(255) default NULL,
PRIMARY KEY (`id`)
);
{R ' 6,c3C\5W ' #'=C,=9'2Mw#5N#X5T C3t ' "c
6C3t '85 "C#234#ƒ O ' C= ';# C,#78' 5W 'h‰v-C3t '
= ' "c3C\#+##G#'=C,#5=;#@ ' L68'5 '
:eR ''cP LHDR '8=C= '"Xh 5;p5 = '=" ,q
9 85R9=C"FR 'L5+#2M3'\#+#LH548 6,P R ' 6,c5=h,‡#2z
P #GKLYU6P 85R234#‡8H85=5NOD"‹P #+#R 'LH548234##5
#+#5`L(J'9#53D{P C= 'R ' 6,9 # '#Q8L5U '=96L5U '=9LH
548 53#+#C3t 'D#+#P 5=h,3D#2zP #5="Xh 5;= =" ,C= '
C3t '548 6,#+#C3t 'P 234#2z5=5NJ85#,D8=ˆ2SP 6
'ˆ5N5{R '"Dc68=ˆ'
CREATE TABLE `posts_tags` (
`id` int(11) unsigned NOT NULL auto_increment,
`post_id` int(11) unsigned default NULL,
`tag_id` int(11) unsigned default NULL,
PRIMARY KEY (`id`)
);
9=C88>"=>'858
<?
class Tag extends AppModel {
var $name = 'Tag';
var $hasAndBelongsToMany = array('Post');
}
?>
K5† 5ƒC= '"=0=
<?
class Post extends AppModel {
var $name = 'Post';
var $belongsTo = array('User');
var $hasAndBelongsToMany = array('Tag');
}
?>
KX#@ '9=C'#= C=CD#= '2M9 #U5M'2MLM"C
h 5;p5 = '=" ,q
<?
class TagsController extends AppController {
var $name = 'Tags';
var $scaffold;
}
?>
YMƒ_X5T CP h 5; 6,@ '#+#5"X
className Parameter
P 6,3T 'N 'D"=LH548C= '(O0='"=0=c#S
#<"234#5H7856 5'
joinTable Parameter
KS 5DC[ '#+#59 9=CR '5N2M#5NQ#R#+#LH548#5=8=6'
YE 6,234#+"#5†2H 6„= 6#U5M234#5H78@ '5"X„= {9
c5H788=ˆ'
foreignKey and associationForeignKey Parameters
s5U#G"=5; 9C= 'R ' X6 associationForeignKeyC= '
C3t '548 6,c68=ˆ#5=0="=5"X=C' L,6#5=#+#"=L5+#2U
6'ˆ#5=0="=
#= = =CC "0C"C
<5\ '5"X 6,234#ƒ_'X ' 53#+#LH548L5+#
CHƯƠNG 2
J2ME
I. Giới thiệu
€y!€0=C"y#C=!= 6 E R '€85P R 5 5Š#GB
y#C=,"€y!234#*,J ' 5["" '2H L5R f '85+CM N 'O '29 '
85= '85b#5=#+#5Ha2F ':D35H#G 'W '\€JCP 59S '"9 '#U
‘ #Gx0€y!#U5M@ '2M*,J '#+#N 'O 'd2T 'R 2H 85N#98 HLH
548D#+##W ' '5;85(CC
€y!5‹C4#+#5Hap"#C=q29 '"6 U'o6#+#p5; C9 'q8C= 53 '
Q#R#5b '2EL~"L5R f '5T =D"+,( 5#+ 5* C= '€y!N#"9 5K0‰F
5D3C\6L5R f 'LH X2Ea59 #5H#U5M6CQ '5P" 'z
I.1. Khái quát lớp J2ME
yO#P#G€y!6#5=85~8 '3t78Ce 5H#+#N 'O '2F#78D5Ha
2F 'L5W '#S h *"2H 85S #N '57JYM29234#"O#P 6,€y!234#*,
J '[ '#+#S ',CL5+# 52M'Q2;#5J#5; 85S #N 'L5Š 5685+CM
B2*,6#+#S '#G€y!234#*,J 'CP K-mK
Figure 5: Các tầng của CLDC J2ME
y‹S '`CP S '5CrC6S 'Cd34 '5T # '#Q8#5=78Ce 5P 5E
'=; 78Ce 5N 'O 'x0’—x88#= 0C='C"’ C#5* 5; 5T
S '3DP CP
S '85S #N '5Ham#•CrC-,C
Y*,#5( 565Ha2F '57JD#Q5e 585S #N '#G UEF 5D6X#2F
ƒ_mI 5P 57C UL5W '85R6"F85S #G€y! 53 ' U6 TQ85+K+#
5Ha2F 'L5+# 5#U5M#U#+#Fƒ_L5+# 5D78"%; 5L5+# 5
yO#P#G€y!6# '#Q8"F#5^ #5=Q#R#+#=95Ha2F 'L5+# 5
S '"+,R=€€:Cy#5 -,C
s5"% 'Z €234#P a#5 U234##5,M 2w56 5"%,#=y%,#=
6,2U234##5,M 56 5"% 'W '\"+,#G5Ha2F 'S '"+,R=€=
'Z"s:ys:Cy#5 6FP a#5"%,#=#U 5;"O#5,M "%
,#=#G#53T 'Ce 5€56 5 'W '\"+,2M#59,CP 5Ha2F 'S ' 6,
# '#Q8"FJ#5^ 5U#5=#+#5Ha2F '2MN 'O '€y!L52%P a#5
#U5M5=92F 'CP QL–5Ha2F ' 6=#U€y!s:y
S '#Q5e 5K= 'C= -,C
S '#Q5e 5#GK-mK2a 5 '5I'=; 'W '\€€- ''’ C#
#TR 2M#5=85~8#53T 'Ce 5€#59,CP 5Ha2F 'Y*,6"F78#+#x0’2a 5
'5I…#G 'W '\€y!-78Ce 5P #U5MƒO '#+#D86853T '5N##G#+#
x0’ 6,, '5P 78#+#x0’5\O '5T 234##5NC= 'S '5; C9 '0C=
-,C
S '5; C9 '0C=-,C
S '5; C9 '5,y’m05; C9 '5Ha5W ' 2F '—y=’ =C"=
m#0C=# '#Q878#+#x0’5\O '5T #5=78Ce 5P yO#2(#5#G5;
C9 '6*,J 'CP D8#Q5e 56# '#Q8 5E53; N 'O '5T y’m02a 5
'5I#+#x0’CP ';#5=5Ha2F 'KV '#U5M#U#+#5; C9 '6#+#x0’L5+#
'=6y’m0234#@ '#5=N 'O ':(O#U5M#U5; C9 '0mx2a 5 '5I#+#D86
853T '5N#5\O '#5=;#9=#+#N 'O '0mxa#5w5} w2a#5†KV '#U5M
#U"F5; C9 '2a 5 '5I#+#x0’#5=;#9=#+#N 'O '{==55J#H#+#5;
C9 'LMCP 678#+#x0’2 '234#*,J 'K5^ 5; C9 '0mx62z#R€Bv—
6#5^ {==5x0’62z#R€Bv—D€Bv6H‡#G€B8##= vh
I.2. Máy ảo Java (hay KVM)
:C]#G"+,R=€5,s:y6a#5"%,#=234# 5Cd#53T 'Ce 5€
2%P a#5 ' 'W '\"+,K5( 5s:yc#5^ 5U=8#G#+##53T 'Ce 5€
#5=#+#5Ha2F 'L5+# 5#U5M#UFƒ_678; 5L5+# 5s5W '#U
s:y#+##53T 'Ce 5€85R234#P a#556 578; 5#5="‹5Ha2F '
<537,78Ce 5P 85R*,J ' 5E2(#5#5="‹=95Ha2F '•e 52*,
Mn H Ce 5*,J 'N 'O 'y’m5=6 #5† 56C]#Gs:y
Figure 6: Tiến trình xây dựng MIDlet
•+Ce 585+ CM N 'O 'y’mD ’m! yWC3t '85+CM (#5 548—
’ 'Cm=8" ! C="
-78Ce 5P 9=#+#78 'Z €
{3D#2SP 678Ce 5P 85R9="% 'Z €#U5M#U 5E78 ˜„
CP ’m!{FP 5„€€K="8C{P a#5"% 'Z 56 5"%,#=
{FP a#5€cP a#5"% 'Z 56 5"%,#=y%,#= 6,c234#
s:ya#556 5"%"+,y%,#=2%P a#5c234#3C= '#+#78 ˜#6
c#U"F78 ˜# 5C#5="‹D8€
CP ’m!{FE LM"C0CCCsM"C( 5548;#G"%,#=
yFC= ' 5\ ',P#S =6 #G€y!6R=2R""%,#=#5,M #5=s:y6
548;6L5W 'C,Q#+#D85,F 5D '=6'D59 #G#5b 'm=2UQ#R#+#D8
2E85R234#E LM"CC3D#L5#5b '#U5M234#=r =E5Ha2F ':;#
E LM"C234#"6"F85S #G"WC3t '85+CM 6"#5=s:y#U5M234#5
5Š5T {FE LM"Cc'+ 5% D8[ '"F5F#( 5C2z#;#5†C[ '
D82U2%234#E LM"C5F#( 5 6,f '5P"L5=R 'iL(#553D##GD86c
234#LM"C`FLM"CCP 5Ha2F '
CP ’m!9=78 €xv
’m!c9="F78 €xv#53
Q#R#+#78 ˜#
K+#5e 5R 5#GN 'O '•; 9#5†5‹C478 ˜8 '
K+#78 \;#U5M234#,P#S`N 'O '
yF78 LPL5" "# '#Q8"WREN 'O '#5=FhR _N '
O '88#= " 'CCP 5Ha2F '
78 €xv234#+ 5=z#234#85* 85X2H '3t@ '2S#X
BL52%'ŽCX6LM"C"%; 5CP Ce 5"W85Š '"=C"%; 52%‘
'234#LM"CCP 2; 5=92F '62U234#85* 85X#5= '3t@ '
<'3t@ 'm=r =N 'O 'E5Ha2F '
<'3t@ '2U=r =78 €xv#5NN 'O 'E5Ha2F 'C= '5S
5H#+#2; 5=92F '#U#+#52M=r =N 'O '
sH X#+8\;d0K '#w '\;#G2; 5=92F ':;# 6,,P#S
'3t@ '85R#U78 €xv57J685S "E"C,E 5W '2M=r =N '
O ' '5Ha5W 'h#+8\;
Kw '5Z ' '=9’v’ Cv0=C:;# 6,,P#S '3t@ '85R#U78
€xv57J685S "E"C,E 5W '2M=r =N 'O ' '5Ha5W 'h
#w '5Z ' '=9
•x•C5xCBƒO '853T '5N# 6, '3t@ '85RH2a#5†‰v-#5†
2H 78 €xv
CP 5Ha2F '
{FE LM"CsM"C"%,#=
{FE LM"CLM"CQ#R#+#D82E#U"F5F#( 5548;2%234#5P"6=
`FE LM"CCP C9"85+85+CM N 'O '<HH Ce 5E LM"C5Q
95eN 'O 'cL5==' =r =E5Ha2F '
{FhR _N 'O '-3C\#53T 'Ce 5
{FhR _N 'O 'CP 5Ha2F 'c3C\#53T 'Ce 5CP 5Ha2F '{w
hR _N 'O '#V '2EL5M C9 '5+#GN 'O 'C= '5t' 5J#56#U
5M9"d 'N 'O 'L5#U#F#'o5=z# 5‡ 2H
<'3t@ '5J#5N 'O '
{FhR _N 'O 'c#5,M N 'O '#5=s:y2M#59,CP 5Ha2F '
s:y5J#5"%,#=L5#53T 'Ce 5#59,
s:ya#5"%,#= ' 'W '\"+,#G5Ha2F '2M#59,
I.3. Tầng CLDC (Connected Limited Device Configuration)
S '€y!LHCP S 's:y6K-mK5,#Q5e 55HaLH X'D59 yO#2(#5
#GS ' 6,6# '#Q8"F78X5M#+#53; #5=85~8"FN 'O '€#59,CP
5Ha2F '<U# '#Q8#T`#5=S '5; C9 'S ' 6,c#5N 5Ex0’#5,P
;5T
K+#K-mKx0’234#2a 5 '5IDJ548+#D#W ',6F857 #G€K0€
K="" ,0C=#<5U" 6,'b8R=2R"C[ '#+#x0’234#2a 5 '5Ic5\O '6
5H5J##5=#R 5685+CM g 56R Q5Ha2F 'K+#2z#R#G€K0234#'+
#+#X€Bv€B8##= vh•,2a 5K-mK85P R ?234#'+ X€Bv—
?
I.3.1. CLDC – Connected Limited Device Configuration
059"Ya 5 '5I#+#53; X5M6#+#x0’
Ya 5 '5I
3T '5(#5 'W '\€:y
K+#53; …
’>•
y9 '
{R="7
•X#H5U
s5W '2a 5 '5I
K5L–X 'N 'O '
l=; '3t@ '
•R _JL;
l=; N 'O '6 '3t@ '
K+#D8…€#TR "8>=8"9 '6R="7234#2a 5 '5IC= 'K-mK
K+#x0’5\O '5T 53'=; '3t@ '6hR _JL; 234#6 5#5=5;
C9 'y’m0
€y!6"F85P R 5 5Š#G€B!ƒO '(F 5D5T 2M U#U5M5(#5548
D#+#5Ha2F 'a'D59 F 5DyO#P#G€y!6"F78#= ??i3T '
5(#5#G€B!
•e 5Mn "XP 5;'\€B!6€y!KmK6K-mK
Figure 7: J2ME và J2SE
I.3.2. Sự khác nhau giữa J2ME và J2SE
K+#2M"L5+# 56="FC= '5_=m=D8€2%aŠ22M'R"L(#553D#
#G€y!5=z#=D8aŠ`e UR 553` '2H J =6 R="7#G5Ha2F '
5,#G#+#N 'O 'L5+#CP 5Ha2F '#U5Mg 2H 85+CM C
YM"L5+#;#5( 56L5W '#U85~8=+ X5J#s5W '#U€<’€<’ C#
B88=C=2U9 L5W '5MC,Q#+##53T 'Ce 5L5+#234#H[ ' 'W '\#G
5Ha 53K5,K™™,H 2=9 5C234##5=85~8 53 'L5W '#U#+# 5U"
,H 2=9 5C'C=86#+#"= 5C
K-mK2a 5 '5I"F"W5e 5 =6 R="7234#5HLH2MR=;5Ha2F '
s:y6#+#N 'O 'L5+#L5Š#+#"%85+5=9•F857 234#2a 5 '5I`K-mK
6,6FE LM"C6"W5e 5 =
•e 5Mn #+#5"6FE LM"C6FLM"C6";#D 52MLM"C
"%#53T 'Ce 5€C3D#L5#5,M U#5=s:y