Implemented RowList() and RowCheckbox()
[isso.git] / PrinterTableElement.php
1 <?php
2 /*=====================================================================*
3 || ###################################################################
4 || # Blue Static ISSO Framework
5 || # Copyright ©2002-[#]year[#] Blue Static
6 || #
7 || # This program is free software; you can redistribute it and/or modify
8 || # it under the terms of the GNU General Public License as published by
9 || # the Free Software Foundation; version [#]gpl[#] of the License.
10 || #
11 || # This program is distributed in the hope that it will be useful, but
12 || # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 || # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 || # more details.
15 || #
16 || # You should have received a copy of the GNU General Public License along
17 || # with this program; if not, write to the Free Software Foundation, Inc.,
18 || # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
19 || ###################################################################
20 \*=====================================================================*/
21
22 /**
23 * Printer Table Element (PrinterTableElement.php)
24 *
25 * @package ISSO
26 */
27
28 require_once('ISSO/PrinterRootElementTable.php');
29 require_once('ISSO/PrinterBaseElement.php');
30
31 /**
32 * Printer Table Element
33 *
34 * This represents a table row that holds elements.
35 *
36 * @author Blue Static
37 * @copyright Copyright (c)2002 - [#]year[#], Blue Static
38 * @version $Revision$
39 * @package ISSO
40 *
41 */
42 class BSPrinterTableElement extends BSPrinterElement
43 {
44 /**
45 * Array of child nodes
46 * @var array
47 */
48 private $children = array();
49
50 /**
51 * Number of columns to span
52 * @var integer
53 */
54 private $colspan = 0;
55
56 // ###################################################################
57 /**
58 * Prints a simple row of text and text
59 *
60 * @param string Label (left side)
61 * @param string Value (right side)
62 *
63 * @return BSPrinterTableElement Table row element
64 */
65 public static function RowLabel($label, $value)
66 {
67 $tr = new BSPrinterTableElement();
68
69 $tr->addChild(new BSPrinterLabelElement($label));
70 $tr->addChild(new BSPrinterLabelElement($value));
71
72 return $tr;
73 }
74
75 // ###################################################################
76 /**
77 * Creates an input[text/password] field row
78 *
79 * @param string Label
80 * @param string Field name
81 * @param mixed Default value
82 * @param bool A password field?
83 *
84 * @return BPrinterTableElement Table row element
85 */
86 public static function RowText($label, $name, $value = null, $password = false)
87 {
88 $tr = new BSPrinterTableElement();
89
90 $tr->addChild(new BSPrinterLabelElement($label));
91 $tr->addChild(new BSPrinterBaseElement(($password ? 'password' : 'text'), $name, $value));
92
93 return $tr;
94 }
95
96 // ###################################################################
97 /**
98 * Creates a submit row
99 *
100 * @param array Child elements to add before the buttons
101 * @param string Save button text
102 * @param string Reset button text
103 *
104 * @return BSPrinterTableElement Table row element
105 */
106 public static function RowSubmit(Array $children = null, $save = ':submit:', $reset = ':reset:')
107 {
108 $build = '';
109 if (sizeof($children) > 0)
110 {
111 foreach ($children AS $child)
112 {
113 $build .= "\n\t\t\t" . $child->paint();
114 }
115 }
116
117 $save = ($save == ':submit:' ? _('Submit') : $save);
118 $reset = ($reset == ':reset:' ? _('Reset') : $reset);
119
120 $elm = new BSPrinterBaseElement('submit', '__submit__', " $save ");
121 $build .= "\n\t\t\t" . $elm->paint();
122
123 $elm = new BSPrinterBaseElement('reset', '__reset__', " $reset ");
124 $build .= "\n\t\t\t" . $elm->paint() . "\n\t\t";
125
126 $tr = new BSPrinterTableElement();
127 $tr->addChild(new BSPrinterLabelElement($build));
128 $tr->setCssClass('tfoot');
129
130 return $tr;
131 }
132
133 // ###################################################################
134 /**
135 * Constructs a <select> row from an array of BSPrinterBaseElement's
136 *
137 * @param string Label
138 * @param string Name
139 * @param array Array of BSPrinterBaseElement[option]'s
140 *
141 * @return BSPrinterTableElement Table row
142 */
143 public static function RowList($label, $name, Array $options)
144 {
145 $build = '';
146 foreach ($options AS $option)
147 {
148 if ($option->getType() == 'option')
149 {
150 $build .= $option->paint();
151 }
152 else
153 {
154 trigger_error('Only BSPrinterBaseElement\'s of type "option" are allowed in BSPrinterTableElement::RowList()');
155 }
156 }
157
158 $tr = new BSPrinterTableElement();
159
160 $tr->addChild(new BSPrinterLabelElement($label));
161 $tr->addChild(new BSPrinterBaseElement('select', $name, $build));
162
163 return $tr;
164 }
165
166 // ###################################################################
167 /**
168 * Constructs a row from an array of BSPrinterBaseElement's of checkboxes
169 *
170 * @param string Label
171 * @param string Name
172 * @param array Array of BSPrinterBaseElement[checkbox]'s that follow array(box label => BSPrinterBaseElement)
173 *
174 * @return BSPrinterTableElement Table row
175 */
176 public static function RowCheckbox($label, $name, Array $boxes)
177 {
178 $build = '';
179 foreach ($boxes AS $boxLabel => $box)
180 {
181 if ($box->getType() == 'checkbox')
182 {
183 if ($box->getName() == null)
184 {
185 $box->setName($name . '[]');
186 }
187 $build .= '<div>' . $box->paint() . ' ' . $boxLabel . '</div>';
188 }
189 else
190 {
191 trigger_error('Only BSPrinterBaseElement\'s of type "checkbox" are allowed in BSPrinterTableElement::RowCheckbox()');
192 }
193 }
194
195 $tr = new BSPrinterTableElement();
196
197 $tr->addChild(new BSPrinterLabelElement($label));
198 $tr->addChild(new BSPrinterLabelElement($build));
199
200 return $tr;
201 }
202
203 // ###################################################################
204 /**
205 * Factory method to create an upload form element; requires that the
206 * form this is attached to have the upload flag set
207 *
208 * @param string Label for the element
209 * @param string Name of the <input>
210 *
211 * @return BSPrinterTableElement Upload form
212 */
213 public static function RowUpload($label, $name)
214 {
215 $tr = new BSPrinterTableElement();
216
217 $tr->addChild(new BSPrinterLabelElement($label));
218 $tr->addChild(new BSPrinterBaseElement('upload', $name));
219
220 return $tr;
221 }
222
223 // ###################################################################
224 /**
225 * Creates a row with a radio select option for yes/no
226 *
227 * @param string Row label
228 * @param string Name of the radio buttons
229 * @param bool Yes is selected? (if false, No is selected)
230 *
231 * @return BSPrinterTableElement Yes-No row
232 */
233 public static function RowYesNo($label, $name, $yes)
234 {
235 $elm = new BSPrinterBaseElement('radio', $name, 1);
236 $elm->setActive($yes);
237
238 $build = $elm->paint() . ' ' . _('Yes') . ' ';
239
240 $elm = new BSPrinterBaseElement('radio', $name, 0);
241 $elm->setActive(!$yes);
242
243 $build .= $elm->paint() . ' ' . _('No');
244
245 $tr = new BSPrinterTableElement();
246 $tr->addChild(new BSPrinterLabelElement($label));
247 $tr->addChild(new BSPrinterLabelElement($build));
248 return $tr;
249 }
250
251 // ###################################################################
252 /**
253 * Returns the number of columns in this element
254 *
255 * @return integer Column count
256 */
257 public function numberOfColumns()
258 {
259 return sizeof($this->children);
260 }
261
262 // ###################################################################
263 /**
264 * Adds a child node to the element
265 *
266 * @param BSPrinterElement A child element
267 */
268 public function addChild(BSPrinterElement $child)
269 {
270 $this->children[] = $child;
271 }
272
273 // ###################################################################
274 /**
275 * Sets the number of columns this row should have and pads the <td>
276 * elements accordingly
277 *
278 * @param integer Column count
279 */
280 public function setColumnNumber($cols)
281 {
282 if ($cols < $this->numberOfColumns())
283 {
284 trigger_error('You need to have at least ' . $this->numberOfColumns() . ' columns');
285 }
286 $this->colspan = $cols;
287 }
288
289 // ###################################################################
290 /**
291 * Returns the HTML for all printed children elements
292 *
293 * @return string Printed HTML
294 */
295 protected function _paintChildren()
296 {
297 $builder = '';
298
299 $numCols = $this->numberOfColumns();
300 $even = true;
301
302 if ($this->colspan % $numCols == 0)
303 {
304 $cols = $this->colspan / $numCols;
305 $even = true;
306 }
307 else
308 {
309 $cols = intval($this->colspan / $numCols);
310 $even = false;
311 }
312
313 $i = 0;
314 foreach ($this->children AS $child)
315 {
316 $i++;
317 $colspan = (($i == $numCols AND !$even) ? $cols + 1 : $cols);
318 $builder .= "\n\t\t<td" . ($colspan > 1 ? ' colspan="' . $colspan . '"' : '') . ">" . $child->paint() . "</td>";
319 }
320
321 return $builder;
322 }
323
324 // ###################################################################
325 /**
326 * Paints the entire table row
327 *
328 * @return string Table row HTML
329 */
330 public function paint()
331 {
332 return "\t<tr" . $this->_prepareStyle() . ">" . $this->_paintChildren() . "\n\t</tr>";
333 }
334 }
335
336 /*=====================================================================*
337 || ###################################################################
338 || # $HeadURL$
339 || # $Id$
340 || ###################################################################
341 \*=====================================================================*/
342 ?>