Další věcí kterou se naučíme je jak vytvářet komponenty a jak je skládat. Například si vytvoříme komponentu pro přihlašování která pak může být součástí libovolné stránky. Všechno kolem přihlašování je zapouzdřeno do komponenty a tu pak jen používáme aniž bychom se museli o něco starat.
Princip komponenty je zapouzdření funkčnosti do samostatného objektu.
Příklad 51.23. Ukázka komponenty
1 class LoginComponent < Page 2 def initialize 3 @username = nil 4 end 5 def login(user, pass) 6 authorized = authentication(user, pass) 7 @username = user if authorized 8 authorized 9 end 10 def authentication(user, pass) 11 user == pass12 end 13 def render_on(r) 14 name = pass = nil
15 r.form do 16 r.print "Name:" 17 r.text_input(''){|name|} 18 r.print "Password:" 19 r.password_input(''){|pass|} 20 r.submit({'value'=>'Login'}){login(name, pass)} 21 end 22 end 23 end
Použití komponenty ve stránce pak vypadá asi takto
První pokus o komponentu je návrh přihlašovací komponenty do hlavní stránky.
1 #!/usr/bin/env ruby
2 # $Id: login3.rb,v 1.1 2003/12/08 18:40:07 radek Exp $
3 # $Source: /home/radek/cvs/ruby-book/example/net/web/borges02/login3.rb,v $
4 # Component example
5 # Copyright (c) 2003 Radek Hnilica
6 require 'borges'
7 require 'borges/Page'
8
9 include Borges
10
11 # Component class. In real word it will be probably in separated file.
12 class LoginComponent < Page
13 def initialize
14 @username = nil
15 end
16 def login(username, password)
17 # Use user authorization code for login in
18 # This is simple fake code.
19 if username == 'radek' and password == 'pass' then
20 puts "#{username}> P�ihl�enn� bylo �sp�n�."
21 @username = username
22 else
23 puts "#{username}> ERR: Bad password given!"
24 @username = nil
25 end
26 end
27 def render_on(r)
28 username = password = nil # Declaring local variables.
29 r.form do
30 r.table({'frame'=>'border', 'align'=>'center', 'bgcolor'=>'#e0e8ff'}) do
31 r.tr do
32 r.td({'colspan'=>'2', 'align'=>'center', 'bgcolor'=>'#d0c0e0'}){
33 r.print "<b>Pros�m, p�ihlaste se:</b>"}
34 end
35 r.tr do
36 r.td{r.print "Jm�no:"}
37 r.td{r.text_input(""){|username|}}
38 end
39 r.tr do
40 r.td{r.print "Heslo:"}
41 r.td{r.password_input(""){|n| password = n;}}
42 end
43 r.tr do
44 r.td({'colspan'=>'2', 'align'=>'center'}){
45 r.submit({'value'=>'P�ihl�sit'}){
46 login(username, password)}}
47 end
48 end
49 end
50 end
51 end
52
53 class Login < Page
54 attr_reader :username
55
56 def initialize()
57 @login = LoginComponent.new
58 @title = "Hlavn� str�nka s p�ihla�ovac� komponentou"
59 end
60
61 def render_on(r)
62 r.tag('html') do
63 # html/head just to be correct especially with charset.
64 r.tag('head') do
65 r.print "<title>P�ihla�ovac� dialog varianta 2</title>"
66 r.print %q{<meta http-equiv="Content-Type" }
67 r.print %Q{content="text/html; charset=iso-8859-2">\n}
68 end
69 r.tag('body') do
70 # Page main table construction
71 r.table({'rules'=>'all', 'frame'=>'border'}) do
72 r.tr do
73 r.td{r.print "LOGO"}
74 r.td{r.heading @title}
75 r.td do
76 # use the login component
77 @login.render_on(r)
78 end
79 end
80 r.tr do
81 r.td({'rowspan'=>'2'}){r.print "Left<br>Side<br>Menu"}
82 r.td{r.print "<a href="">Restart</a> <a>Nothing</a>"}
83 r.td({'rowspan'=>'2'}){r.print "Right<br>Side<br>Column"}
84 end
85 r.tr do
86 #Left Side Menu spans here
87 r.td{r.print "CONTENTS"}
88 #Right Side Colume spans here
89 end
90 r.tr do
91 r.td({'colspan'=>'3'}){r.print "BOTTOM"}
92 end
93 end
94 end
95 end
96 end
97 end
98
99 Borges::register_application("login-three", Login)
100
101 if $0 == __FILE__ then
102 require 'borges/Webrick'
103 Borges::WebrickConnection.start({:Port=>7000})
104 end
105 #Keep this comment at the end of the file
106 #Local variables:
107 #indent-tabs-mode: nil
108 #End:
109
