- Added BSPrinterTableElement::RowTextarea()
[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 * Creates a table element; takes a variable number of arguments which
59 * are added as children in the order passed
60 *
61 * @param BSPrinterTableElement... Variable number (or no) children
62 */
63 public function __construct()
64 {
65 $childs = func_get_args();
66 if (is_array($childs))
67 {
68 $this->children = $childs;
69 }
70 }
71
72 // ###################################################################
73 /**
74 * Prints a simple row of text and text
75 *
76 * @param string Label (left side)
77 * @param string Value (right side)
78 *
79 * @return BSPrinterTableElement Table row element
80 */
81 public static function RowLabel($label, $value)
82 {
83 $tr = new BSPrinterTableElement();
84
85 $tr->addChild(new BSPrinterLabelElement($label));
86 $tr->addChild(new BSPrinterLabelElement($value));
87
88 return $tr;
89 }
90
91 // ###################################################################
92 /**
93 * Creates an input[text/password] field row
94 *
95 * @param string Label
96 * @param string Field name
97 * @param mixed Default value
98 * @param bool A password field?
99 *
100 * @return BPrinterTableElement Table row element
101 */
102 public static function RowText($label, $name, $value = null, $password = false)
103 {
104 $tr = new BSPrinterTableElement();
105
106 $tr->addChild(new BSPrinterLabelElement($label));
107 $tr->addChild(new BSPrinterBaseElement(($password ? 'password' : 'text'), $name, $value));
108
109 return $tr;
110 }
111
112 // ###################################################################
113 /**
114 * Creates a submit row
115 *
116 * @param array Child elements to add before the buttons
117 * @param string Save button text
118 * @param string Reset button text
119 *
120 * @return BSPrinterTableElement Table row element
121 */
122 public static function RowSubmit(Array $children = null, $save = ':submit:', $reset = ':reset:')
123 {
124 $build = '';
125 if (sizeof($children) > 0)
126 {
127 foreach ($children AS $child)
128 {
129 $build .= "\n\t\t\t" . $child->paint();
130 }
131 }
132
133 $save = ($save == ':submit:' ? _('Submit') : $save);
134 $reset = ($reset == ':reset:' ? _('Reset') : $reset);
135
136 if (!is_null($save))
137 {
138 $elm = new BSPrinterBaseElement('submit', '__submit__', " $save ");
139 $build .= "\n\t\t\t" . $elm->paint();
140 }
141
142 if (!is_null($reset))
143 {
144 $elm = new BSPrinterBaseElement('reset', '__reset__', " $reset ");
145 $build .= "\n\t\t\t" . $elm->paint() . "\n\t\t";
146 }
147
148 $tr = new BSPrinterTableElement();
149 $tr->addChild(new BSPrinterLabelElement($build));
150 $tr->setCssClass('tfoot');
151
152 return $tr;
153 }
154
155 // ###################################################################
156 /**
157 * Constructs a <select> row from an array of BSPrinterBaseElement's
158 *
159 * @param string Label
160 * @param string Name
161 * @param array Array of BSPrinterBaseElement[option]'s
162 *
163 * @return BSPrinterTableElement Table row
164 */
165 public static function RowList($label, $name, Array $options)
166 {
167 $build = '';
168 foreach ($options AS $option)
169 {
170 if ($option->getType() == 'option')
171 {
172 $build .= $option->paint();
173 }
174 else
175 {
176 trigger_error('Only BSPrinterBaseElement\'s of type "option" are allowed in BSPrinterTableElement::RowList()');
177 }
178 }
179
180 $tr = new BSPrinterTableElement();
181
182 $tr->addChild(new BSPrinterLabelElement($label));
183 $tr->addChild(new BSPrinterBaseElement('select', $name, $build));
184
185 return $tr;
186 }
187
188 // ###################################################################
189 /**
190 * Constructs a row from an array of BSPrinterBaseElement's of checkboxes
191 *
192 * @param string Label
193 * @param string Name
194 * @param array Array of BSPrinterBaseElement[checkbox]'s that follow array(box label => BSPrinterBaseElement)
195 *
196 * @return BSPrinterTableElement Table row
197 */
198 public static function RowCheckbox($label, $name, Array $boxes)
199 {
200 $build = '';
201 foreach ($boxes AS $boxLabel => $box)
202 {
203 if ($box->getType() == 'checkbox')
204 {
205 if ($box->getName() == null)
206 {
207 $box->setName($name . '[]');
208 }
209 $build .= '<div>' . $box->paint() . ' ' . $boxLabel . '</div>';
210 }
211 else
212 {
213 trigger_error('Only BSPrinterBaseElement\'s of type "checkbox" are allowed in BSPrinterTableElement::RowCheckbox()');
214 }
215 }
216
217 $tr = new BSPrinterTableElement();
218
219 $tr->addChild(new BSPrinterLabelElement($label));
220 $tr->addChild(new BSPrinterLabelElement($build));
221
222 return $tr;
223 }
224
225 // ###################################################################
226 /**
227 * Factory method to create an upload form element; requires that the
228 * form this is attached to have the upload flag set
229 *
230 * @param string Label for the element
231 * @param string Name of the <input>
232 *
233 * @return BSPrinterTableElement Upload form
234 */
235 public static function RowUpload($label, $name)
236 {
237 $tr = new BSPrinterTableElement();
238
239 $tr->addChild(new BSPrinterLabelElement($label));
240 $tr->addChild(new BSPrinterBaseElement('upload', $name));
241
242 return $tr;
243 }
244
245 // ###################################################################
246 /**
247 * Creates a row with a radio select option for yes/no
248 *
249 * @param string Row label
250 * @param string Name of the radio buttons
251 * @param bool Yes is selected? (if false, No is selected)
252 *
253 * @return BSPrinterTableElement Yes-No row
254 */
255 public static function RowYesNo($label, $name, $yes)
256 {
257 $elm = new BSPrinterBaseElement('radio', $name, 1);
258 $elm->setActive($yes);
259
260 $build = $elm->paint() . ' ' . _('Yes') . ' ';
261
262 $elm = new BSPrinterBaseElement('radio', $name, 0);
263 $elm->setActive(!$yes);
264
265 $build .= $elm->paint() . ' ' . _('No');
266
267 $tr = new BSPrinterTableElement();
268 $tr->addChild(new BSPrinterLabelElement($label));
269 $tr->addChild(new BSPrinterLabelElement($build));
270 return $tr;
271 }
272
273 // ###################################################################
274 /**
275 * Prints a row with a textarea
276 *
277 * @param string Label
278 * @param string Textarea name
279 * @param string Value to fill with
280 *
281 * @return BSPrinterTableElement Table row
282 */
283 public static function RowTextarea($label, $name, $value = null)
284 {
285 $tr = new BSPrinterTableElement();
286
287 $tr->addChild(new BSPrinterLabelElement($label));
288 $tr->addChild(new BSPrinterBaseElement('textarea', $name, $value));
289
290 return $tr;
291 }
292
293 // ###################################################################
294 /**
295 * Returns the number of columns in this element
296 *
297 * @return integer Column count
298 */
299 public function numberOfColumns()
300 {
301 return sizeof($this->children);
302 }
303
304 // ###################################################################
305 /**
306 * Adds a child node to the element
307 *
308 * @param BSPrinterElement A child element
309 */
310 public function addChild(BSPrinterElement $child)
311 {
312 $this->children[] = $child;
313 }
314
315 // ###################################################################
316 /**
317 * Sets the number of columns this row should have and pads the <td>
318 * elements accordingly
319 *
320 * @param integer Column count
321 */
322 public function setColumnNumber($cols)
323 {
324 if ($cols < $this->numberOfColumns())
325 {
326 trigger_error('You need to have at least ' . $this->numberOfColumns() . ' columns');
327 }
328 $this->colspan = $cols;
329 }
330
331 // ###################################################################
332 /**
333 * Returns the HTML for all printed children elements
334 *
335 * @return string Printed HTML
336 */
337 protected function _paintChildren()
338 {
339 $builder = '';
340
341 $numCols = $this->numberOfColumns();
342 $even = true;
343
344 if ($this->colspan % $numCols == 0)
345 {
346 $cols = $this->colspan / $numCols;
347 $even = true;
348 }
349 else
350 {
351 $cols = intval($this->colspan / $numCols);
352 $even = false;
353 }
354
355 $i = 0;
356 foreach ($this->children AS $child)
357 {
358 $i++;
359 $colspan = (($i == $numCols AND !$even) ? $cols + 1 : $cols);
360 $builder .= "\n\t\t<td" . ($colspan > 1 ? ' colspan="' . $colspan . '"' : '') . ">" . $child->paint() . "</td>";
361 }
362
363 return $builder;
364 }
365
366 // ###################################################################
367 /**
368 * Paints the entire table row
369 *
370 * @return string Table row HTML
371 */
372 public function paint()
373 {
374 return "\t<tr" . $this->_prepareStyle() . ">" . $this->_paintChildren() . "\n\t</tr>";
375 }
376 }
377
378 /*=====================================================================*
379 || ###################################################################
380 || # $HeadURL$
381 || # $Id$
382 || ###################################################################
383 \*=====================================================================*/
384 ?>