]> git.llucax.com Git - mecon/meconlib.git/blob - lib/MLIB/HTML/QuickForm/Renderer/TablaHorizontal.php
Agrego tareas pendientes al TODO.
[mecon/meconlib.git] / lib / MLIB / HTML / QuickForm / Renderer / TablaHorizontal.php
1 <?php /* vim: set binary expandtab tabstop=4 shiftwidth=4 textwidth=80:
2 -------------------------------------------------------------------------------
3                              Ministerio de Economía
4                                     meconlib
5 -------------------------------------------------------------------------------
6 This file is part of meconlib.
7
8 meconlib is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 2 of the License, or (at your option)
11 any later version.
12
13 meconlib is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
15 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16  
17 You should have received a copy of the GNU General Public License; if not,
18 write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
19 Boston, MA  02111-1307  USA
20 -------------------------------------------------------------------------------
21 Creado: mar mar 30 16:06:26 ART 2004
22 Autor:  Leandro Lucarella <llucar@mecon.gov.ar>
23 -------------------------------------------------------------------------------
24 $Id: Tabla.php 462 2004-01-09 21:11:01Z www-data $
25 -----------------------------------------------------------------------------*/
26
27 require_once 'HTML/QuickForm/Renderer.php';
28 require_once 'MECON/HTML/Tabla.php';
29
30 /**
31  * QuickForm renderer que usa Tabla como backend. Es similar a
32  * MECON_HTML_QuickForm_Renderer_Tabla pero dibuja la tabla horizontalmente.
33  * Ej:
34  * <code>
35  * $form = new MECON_HTML_QuickForm();
36  * $form->renderer = new MECON_HTML_QuickForm_Renderer_TablaHorizontal(array('width' => 400));
37  * // Sigo creando el formulario normalmente...
38  * </code>
39  */
40 class MECON_HTML_QuickForm_Renderer_TablaHorizontal extends HTML_QuickForm_Renderer {
41
42     /**
43      * Tabla usada para dibujar el formulario.
44      * @var      object Tabla
45      * @access   private
46      */
47     var $tabla;
48
49     /**
50      * Estructura de la tabla en filas a usar para renderizar.
51      * @access   private
52      */
53     var $_rows = array();
54
55     /**
56      * Guarda posición de la fila donde comienzan los elementos.
57      * @private
58      */
59     var $_elementsPos = null;
60
61     /**
62      * Guarda elementos del formulario.
63      * @private
64      */
65     var $_elements = array();
66
67     /**
68      * Guarda opciones del renderer.
69      * @private
70      */
71     var $_opts = array();
72
73     /**
74      * HTML con los scripts para poner antes del formulario (tipicamente
75      * un javascript).
76      * @var      string
77      * @access   private
78      */
79     var $_script = '';
80   
81     /**
82      * HTML para agregar antes de la tabla (tipicamente un javascript).
83      * @var      string
84      * @access   private
85      */
86     var $_prepend = '';
87   
88     /**
89      * HTML para agregar despues de la tabla.
90      * @var      string
91      * @access   private
92      */
93     var $_append = '';
94   
95     /**
96      * True if we are inside a group 
97      * @var      bool
98      * @access   private
99      */
100     var $_inGroup = false;
101   
102     /**
103      * Group error related message.
104      * @var      string
105      * @access   private
106      */
107     var $_groupError = '';
108   
109     /**
110      * Array with HTML generated for group elements
111      * @var      array
112      * @access   private
113      */
114     var $_groupElements = array();
115
116    /**
117     * Constructor.
118     *
119     * @param $param Array o sting con el estilo de la tabla u objeto
120     *               tabla alternativo para usar.
121     * @param $opts  Opciones, pueden ser:
122     *               - btn_row: Si es true, se dibujan los botones en una fila
123     *                          completa, después de los campos. Si es false, se
124     *                          dibuja como un elemento con un rowspan para que
125     *                          ocupe la celda del label y del contenido.
126     *               - req_note: Si es true, se incluye una fila adicional con la
127     *                           'require note'. Si es false no se la muestra.
128     *
129     * @access public
130     */
131     function MECON_HTML_QuickForm_Renderer_TablaHorizontal($param = array(), $opts = array())
132     {
133         parent::HTML_QuickForm_Renderer();
134         $this->_opts = $opts;
135         if (is_a($param, 'Tabla')) {
136             $this->setTable($param);
137         }
138         else {
139             $this->setTable(new MECON_HTML_Tabla($param));
140         }
141     } // end constructor
142
143    /**
144     * returns the HTML generated for the form
145     *
146     * @access public
147     * @return string
148     */
149     function toHtml()
150     {
151         $pos = $this->_elementsPos;
152         $rows = count($this->_rows);
153         foreach ($this->_elements as $e) {
154             list($label, $elem) = $e;
155             $cols = array();
156             for ($i = 0; $i < $pos; ++$i) {
157                 $cols[] = '';
158             }
159             if (is_null($label)) { // Para caso especial como botones.
160                 $cols[] = $elem;
161                 $cols[] = '';
162             } else { // Para caso común.
163                 $cols[] = $label;
164                 $cols[] = $elem;
165             }
166             for ($i = $pos + 2; $i < $rows; ++$i) {
167                 $cols[] = '';
168             }
169             $id = $this->tabla->addCol($cols, array(array('align' => 'center')));
170             if (is_null($label)) { // Para caso especial como botones.
171                 $this->tabla->updateCellAttributes($pos, $id, array('rowspan' => 2));
172             } else { // Para caso común.
173                 $this->tabla->updateCellAttributes($pos, $id, array('titulo' => true));
174             }
175         }
176         foreach ($this->_rows as $i => $row) {
177             if ($row) { // Si no son las filas de los elementos...
178                 list($html, $attrs) = $row;
179                 $attrs['colspan'] = count($this->_elements);
180                 $this->tabla->updateRowAttributes($i, $attrs);
181                 $this->tabla->setCellContents($i, 0, $html);
182             }
183         }
184         return  $this->_script . $this->_prepend .
185                 $this->tabla->toHtml() .
186                 $this->_append;
187     } // end func toHtml
188     
189    /**
190     * Called when visiting a form, before processing any form elements
191     *
192     * @param    object      An HTML_QuickForm object being visited
193     * @access   public
194     * @return   void
195     */
196     function startForm(&$form)
197     {
198         $attrs = $form->getAttributes(true);
199         $this->_prepend = "\n<form$attrs>\n";
200
201     } // end func startForm
202
203    /**
204     * Called when visiting a form, after processing all form elements
205     * Adds required note, form attributes, validation javascript and form content.
206     * 
207     * @param    object      An HTML_QuickForm object being visited
208     * @access   public
209     * @return   void
210     */
211     function finishForm(&$form)
212     {
213         // add a required note, if one is needed
214         if (@$this->_opts['req_note'] and !empty($form->_required) && !$form->_freezeAll) {
215             $this->_rows[] = array('<font size="-2">'.$form->getRequiredNote().'</font>', array('cabecera' => true));
216         }
217         // add a validation script
218         $this->_script = strval($form->getValidationScript());
219         $this->_append = "\n</form>\n";
220     } // end func finishForm
221       
222    /**
223     * Called when visiting a header element
224     *
225     * @param    object     An HTML_QuickForm_header element being visited
226     * @access   public
227     * @return   void
228     */
229     function renderHeader(&$header)
230     {
231         $this->_rows[] = array($header->toHtml(),
232             array($header->getName() => true));
233     } // end func renderHeader
234
235    /**
236     * Renders an element Html
237     * Called when visiting an element
238     *
239     * @param object     An HTML_QuickForm_element object being visited
240     * @param bool       Whether an element is required
241     * @param string     An error message associated with an element
242     * @access public
243     * @return void
244     */
245     function renderElement(&$element, $required, $error)
246     {
247         if (!$this->_inGroup) {
248             $this->_checkInElements();
249             $this->_elements[] = array(
250                 $element->getLabel() . ($required ? '<font color="red">*</font>' : ''),
251                 $element->toHtml() . ($error ? "<br><font color=\"red\">$error</font>" : ''));
252         } else {
253             $this->_groupElements[] = ($element->getLabel() ? ($element->getLabel().'&nbsp;') : '') . $element->toHtml();
254         }
255     } // end func renderElement
256    
257    /**
258     * Renders an hidden element
259     * Called when visiting a hidden element
260     * 
261     * @param object     An HTML_QuickForm_hidden object being visited
262     * @access public
263     * @return void
264     */
265     function renderHidden(&$element)
266     {
267         $this->_prepend .= "\n\t". $element->toHtml();
268     } // end func renderHidden
269
270    /**
271     * Called when visiting a raw HTML/text pseudo-element
272     * 
273     * @param  object     An HTML_QuickForm_html element being visited
274     * @access public
275     * @return void
276     */
277     function renderHtml(&$data)
278     {
279         $this->_rows[] = array(&$data, array());
280     } // end func renderHtml
281
282    /**
283     * Called when visiting a group, before processing any group elements
284     *
285     * @param object     An HTML_QuickForm_group object being visited
286     * @param bool       Whether a group is required
287     * @param string     An error message associated with a group
288     * @access public
289     * @return void
290     */
291     function startGroup(&$group, $required, $error)
292     {
293         $this->_groupElements = array();
294         $this->_groupError    = $error;
295         $this->_inGroup       = true;
296     } // end func startGroup
297
298    /**
299     * Called when visiting a group, after processing all group elements
300     *
301     * @param    object      An HTML_QuickForm_group object being visited
302     * @access   public
303     * @return   void
304     */
305     function finishGroup(&$group)
306     {
307         $name = $group->getName();
308         $sep = $group->_separator;
309         $label = $group->getLabel();
310         if (!@$this->_opts['btn_row'] and strtolower($name) == 'botones') {
311             $label = null;
312         }
313         if (@$this->_opts['btn_row']) {
314             $this->_rows[] = array(join('', $this->_groupElements), array('valign' => 'middle', 'align' => 'center'));
315         } else {
316             $this->_checkInElements();
317             $this->_elements[] = array($label, join($sep, $this->_groupElements));
318             $this->_inGroup = false;
319         }
320     } // end func finishGroup
321
322     function _checkInElements() {
323         if (is_null($this->_elementsPos)) {
324             $this->_elementsPos = count($this->_rows);
325             $this->_rows[] = false;
326             $this->_rows[] = false;
327         }
328     }
329
330     function setTable(&$table) {
331         $this->tabla =& $table;
332     }
333
334     function getCSS() {
335         return $this->tabla->getCSS();
336     }
337
338 } // end class HTML_QuickForm_Renderer_Default
339
340 ?>