Commit | Line | Data |
---|---|---|
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 | { | |
8fc4efa3 | 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'; | |
2a54eb4d | 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 | { | |
35aedff2 FB |
76 | $this->name = 'wiz_' . $name; |
77 | $this->layout = $layout; | |
2a54eb4d | 78 | $this->stateless = $stateless; |
79 | $this->pages = array(); | |
80 | $this->lookup = array(); | |
81 | if (!isset($_SESSION[$this->name])) { | |
82 | $_SESSION[$this->name] = array(); | |
83 | } | |
35aedff2 | 84 | $_SESSION[$this->name . '_page'] = null; |
2a54eb4d | 85 | } |
86 | ||
35aedff2 | 87 | public function addPage($class, $id = null) |
2a54eb4d | 88 | { |
89 | if ($id != null) { | |
90 | $this->lookup[$id] = count($this->pages); | |
91 | } | |
35aedff2 | 92 | $this->pages[] = $class; |
2a54eb4d | 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 | ||
35aedff2 | 126 | private function &getPage($id) |
2a54eb4d | 127 | { |
128 | $page = $this->pages[$id]; | |
129 | return new $page($this); | |
130 | } | |
131 | ||
8fc4efa3 | 132 | public function apply(PlatalPage &$smarty, $baseurl, $pgid = null) |
2a54eb4d | 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: | |
35aedff2 | 145 | $curpage--; |
2a54eb4d | 146 | break; |
147 | case PlWizard::NEXT_PAGE: | |
35aedff2 | 148 | $curpage++; |
2a54eb4d | 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 | } | |
35aedff2 FB |
158 | } else { |
159 | $curpage = 0; | |
2a54eb4d | 160 | } |
8fc4efa3 | 161 | if ($this->stateless && (in_array($pgid, $this->lookup) || isset($this->pages[$pgid]))) { |
162 | $curpage = $pgid; | |
163 | } | |
2a54eb4d | 164 | |
165 | // Prepare the page | |
166 | $page = $this->getPage($curpage); | |
167 | $smarty->assign('wiz_page', $page->template()); | |
168 | $page->prepare($smarty); | |
169 | } | |
170 | } | |
171 | ||
172 | // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: | |
173 | ?> |