2a54eb4d |
1 | <?php |
2 | /*************************************************************************** |
3 | * Copyright (C) 2003-2007 Polytechnique.org * |
4 | * http://opensource.polytechnique.org/ * |
5 | * * |
6 | * This program is free software; you can redistribute it and/or modify * |
7 | * it under the terms of the GNU General Public License as published by * |
8 | * the Free Software Foundation; either version 2 of the License, or * |
9 | * (at your option) any later version. * |
10 | * * |
11 | * This program is distributed in the hope that it will be useful, * |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of * |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * |
14 | * GNU General Public License for more details. * |
15 | * * |
16 | * You should have received a copy of the GNU General Public License * |
17 | * along with this program; if not, write to the Free Software * |
18 | * Foundation, Inc., * |
19 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * |
20 | **************************************************************************/ |
21 | |
22 | /** A Wizard Page is a page of a wizard. It is a self-contained step which |
23 | * handles both the creation and initialisation of the step (by using the |
24 | * Wizard global state, if needed) and the processing of the action the |
25 | * user made on it. |
26 | */ |
27 | interface PlWizardPage |
28 | { |
29 | /** Build a new instance of the class |
30 | * associated with the given wizard master. |
31 | */ |
32 | public function __construct(PlWizard &$wiz); |
33 | |
34 | /** Return the name of the templace describing the page. |
35 | */ |
36 | public function template(); |
37 | |
38 | /** Prepare the page by assigning to it any useful value. |
39 | */ |
40 | public function prepare(PlatalPage &$page); |
41 | |
42 | /** Process information resulting of the application of the page. |
43 | * This function must return a clue indicating the next page to show. |
44 | * This clue can be either a page id, a page number or a navigation |
45 | * id (PlWizard::FIRST_PAGE, PlWizard::NEXT_PAGE, PlWizard::CURRENT_PAGE |
46 | * PlWizard::PREVIOUS_PAGE, PlWizard::LAST_PAGE). |
47 | */ |
48 | public function process(); |
49 | } |
50 | |
51 | /** A PlWizard is a set of pages through which the user can navigate, |
52 | * his action on a page determining which the next one will be. |
53 | * |
54 | * A Wizard can either a stateless wizard (which is only a set of |
55 | * independent pages through which the user can easily navigate) or |
56 | * stateful (a suite of steps where each step gives clue for the next |
57 | * one). |
58 | */ |
59 | class PlWizard |
60 | { |
61 | const FIRST_PAGE = "bt_first"; |
62 | const NEXT_PAGE = "bt_next"; |
63 | const CURRENT_PAGE = "bt_current"; |
64 | const PREVIOUS_PAGE = "bt_previous"; |
65 | const LAST_PAGE = "bt_last"; |
66 | |
67 | protected $name; |
68 | protected $layout; |
69 | protected $stateless; |
70 | |
71 | protected $pages; |
72 | protected $lookup; |
73 | |
74 | public function __construct($name, $layout, $stateless = false) |
75 | { |
76 | $this->name = 'wiz_' . $name; |
77 | $this->layout = $layout; |
78 | $this->stateless = $stateless; |
79 | $this->pages = array(); |
80 | $this->lookup = array(); |
81 | if (!isset($_SESSION[$this->name])) { |
82 | $_SESSION[$this->name] = array(); |
83 | } |
84 | $_SESSION[$this->name . '_page'] = null; |
85 | } |
86 | |
87 | public function addPage($class, $id = null) |
88 | { |
89 | if ($id != null) { |
90 | $this->lookup[$id] = count($this->pages); |
91 | } |
92 | $this->pages[] = $class; |
93 | } |
94 | |
95 | public function set($varname, $value) |
96 | { |
97 | $_SESSION[$this->name][$varname] = $value; |
98 | } |
99 | |
100 | public function get($varname, $default = null) |
101 | { |
102 | return isset($_SESSION[$this->name][$varname]) ? |
103 | $_SESSION[$this->name][$varname] : $default; |
104 | } |
105 | |
106 | public function v($varname, $default = "") |
107 | { |
108 | return $this->get($varname, $default); |
109 | } |
110 | |
111 | public function i($varname, $default = 0) |
112 | { |
113 | return (int)$this->get($varname, $default); |
114 | } |
115 | |
116 | public function clear($varname = null) |
117 | { |
118 | if (is_null($varname)) { |
119 | $_SESSION[$this->name] = array(); |
120 | } else { |
121 | unset($_SESSION[$this->name][$varname]); |
122 | } |
123 | $_SESSION[$this->name . '_page'] = null; |
124 | } |
125 | |
126 | private function &getPage($id) |
127 | { |
128 | $page = $this->pages[$id]; |
129 | return new $page($this); |
130 | } |
131 | |
132 | public function apply(PlatalPage &$smarty, $baseurl) |
133 | { |
134 | $curpage =& $_SESSION[$this->name . '_page']; |
135 | |
136 | // Process the previous page |
137 | if (!is_null($curpage)) { |
138 | $page = $this->getPage($curpage); |
139 | $next = $page->process(); |
140 | switch ($next) { |
141 | case PlWizard::FIRST_PAGE: |
142 | $curpage = 0; |
143 | break; |
144 | case PlWizard::PREVIOUS_PAGE: |
145 | $curpage--; |
146 | break; |
147 | case PlWizard::NEXT_PAGE: |
148 | $curpage++; |
149 | break; |
150 | case PlWizard::LAST_PAGE: |
151 | $curpage = count($this->pages) - 1; |
152 | break; |
153 | case PlWizard::CURRENT_PAGE: break; // don't change the page |
154 | default: |
155 | $curpage = is_numeric($next) ? $next : $this->lookup[$curpage]; |
156 | break; |
157 | } |
158 | } else { |
159 | $curpage = 0; |
160 | } |
161 | |
162 | // Prepare the page |
163 | $page = $this->getPage($curpage); |
164 | $smarty->assign('wiz_page', $page->template()); |
165 | $page->prepare($smarty); |
166 | } |
167 | } |
168 | |
169 | // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: |
170 | ?> |