Auto-redirects HTML pages to HTTPS
[platal.git] / classes / plwizard.php
CommitLineData
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 */
27interface 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 */
59class 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 {
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
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:
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 }
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?>