[Pieforms-commit] SF.net SVN: pieforms: [241] pieforms-php5/trunk/src
Status: Alpha
Brought to you by:
oracleshinoda
From: <ora...@us...> - 2007-12-27 23:45:52
|
Revision: 241 http://pieforms.svn.sourceforge.net/pieforms/?rev=241&view=rev Author: oracleshinoda Date: 2007-12-27 15:45:56 -0800 (Thu, 27 Dec 2007) Log Message: ----------- Templating support. Now, if the 'template' directive is provided, pieforms will use a template for rendering a form, rather than a renderer, allowing full layout control. See the recently committed documentation for more information. Modified Paths: -------------- pieforms-php5/trunk/src/pieform/renderers/div.php pieforms-php5/trunk/src/pieform/renderers/multicolumntable.php pieforms-php5/trunk/src/pieform/renderers/oneline.php pieforms-php5/trunk/src/pieform/renderers/table.php pieforms-php5/trunk/src/pieform.php Modified: pieforms-php5/trunk/src/pieform/renderers/div.php =================================================================== --- pieforms-php5/trunk/src/pieform/renderers/div.php 2007-12-27 23:43:59 UTC (rev 240) +++ pieforms-php5/trunk/src/pieform/renderers/div.php 2007-12-27 23:45:56 UTC (rev 241) @@ -27,59 +27,41 @@ /** * Renders form elements inside <div>s. * - * @param Pieform $form The form the element is being rendered for - * @param string $builtelement The element, already built - * @param array $rawelement The element in raw form, for looking up - * information about it. - * @return string The element rendered inside an appropriate - * container. + * @param Pieform $form The form the element is being rendered for + * @param array $element The element to be rendered + * @return string The element rendered inside an appropriate container */ -function pieform_renderer_div(Pieform $form, $builtelement, $rawelement) { +function pieform_renderer_div(Pieform $form, $element) { $formname = $form->get_name(); // Set the class of the enclosing <div> to match that of the element $result = '<div'; - if (isset($rawelement['name'])) { - $result .= ' id="' . $formname . '_' . $rawelement['name'] . '_container"'; + if (isset($element['name'])) { + $result .= ' id="' . $formname . '_' . $element['name'] . '_container"'; } - if ($rawelement['class']) { - $result .= ' class="' . $rawelement['class'] . '"'; + if (!empty($element['class'])) { + $result .= ' class="' . $element['class'] . '"'; } $result .= '>'; - if (isset($rawelement['title']) && $rawelement['title'] !== '' && $rawelement['type'] != 'fieldset') { - if (!empty($rawelement['nolabel'])) { - // Don't bother with a label for the element - $result .= Pieform::hsc($rawelement['title']); - } - else { - $result .= '<label for="' . $formname . '_' . $rawelement['id'] . '">' . Pieform::hsc($rawelement['title']) . '</label>'; - } - if ($form->get_property('requiredmarker') && !empty($rawelement['rules']['required'])) { - $result .= ' <span class="requiredmarker">*</span>'; - } + if (isset($element['labelhtml'])) { + $result .= $element['labelhtml']; } - $result .= $builtelement; + //$result .= $builtelement; + $result .= $element['html']; - // Contextual help - if (!empty($rawelement['help'])) { - $function = $form->get_property('helpcallback'); - if (function_exists($function)) { - $result .= $function($form, $rawelement); - } - else { - $result .= ' <span class="help"><a href="#" title="' . Pieform::hsc($rawelement['help']) . '">?</a></span>'; - } + if (isset($element['helphtml'])) { + $result .= ' ' . $element['helphtml']; } // Description - optional description of the element, or other note that should be visible // on the form itself (without the user having to hover over contextual help - if ((!$form->has_errors() || $form->get_property('showdescriptiononerror')) && !empty($rawelement['description'])) { - $result .= '<div class="description"> ' . Pieform::hsc($rawelement['description']) . "</div>"; + if ((!$form->has_errors() || $form->get_property('showdescriptiononerror')) && !empty($element['description'])) { + $result .= '<div class="description"> ' . Pieform::hsc($element['description']) . "</div>"; } - if (!empty($rawelement['error'])) { - $result .= '<div class="errmsg">' . Pieform::hsc($rawelement['error']) . '</div>'; + if (!empty($element['error'])) { + $result .= '<div class="errmsg">' . Pieform::hsc($element['error']) . '</div>'; } $result .= "</div>\n"; Modified: pieforms-php5/trunk/src/pieform/renderers/multicolumntable.php =================================================================== --- pieforms-php5/trunk/src/pieform/renderers/multicolumntable.php 2007-12-27 23:43:59 UTC (rev 240) +++ pieforms-php5/trunk/src/pieform/renderers/multicolumntable.php 2007-12-27 23:45:56 UTC (rev 241) @@ -33,16 +33,13 @@ * Renders form elements inside a <table>. If elements have the same title, * they will be rendered in the same table row, allowing a grid layout. * - * @param Pieform $form The form the element is being rendered for - * @param string $builtelement The element, already built - * @param array $rawelement The element in raw form, for looking up - * information about it. - * @return string The element rendered inside an appropriate - * container. + * @param Pieform $form The form the element is being rendered for + * @param array $element The element to be rendered + * @return string The element rendered inside an appropriate container */ -function pieform_renderer_multicolumntable(Pieform $form, $builtelement, $rawelement) { +function pieform_renderer_multicolumntable(Pieform $form, $element) { global $formrenderermct; - $formrenderermct->add_element($builtelement, $rawelement); + $formrenderermct->add_element($element['html'], $element); $formrenderermct->set_form($form); } Modified: pieforms-php5/trunk/src/pieform/renderers/oneline.php =================================================================== --- pieforms-php5/trunk/src/pieform/renderers/oneline.php 2007-12-27 23:43:59 UTC (rev 240) +++ pieforms-php5/trunk/src/pieform/renderers/oneline.php 2007-12-27 23:45:56 UTC (rev 241) @@ -35,39 +35,36 @@ /** * Renders form elements all on one line. * - * @param Pieform $form The form the element is being rendered for - * @param string $builtelement The element, already built - * @param array $rawelement The element in raw form, for looking up - * information about it. - * @return string The element rendered inside an appropriate - * container. + * @param Pieform $form The form the element is being rendered for + * @param array $element The element that is being rendered + * @return string The element rendered inside an appropriate container */ -function pieform_renderer_oneline(Pieform $form, $builtelement, $rawelement) { +function pieform_renderer_oneline(Pieform $form, $element) { $formname = $form->get_name(); // Set the class of the enclosing <div> to match that of the element $result = '<span'; - if (isset($rawelement['name'])) { - $result .= ' id="' . $formname . '_' . $rawelement['name'] . '_container"'; + if (isset($element['name'])) { + $result .= ' id="' . $formname . '_' . $element['name'] . '_container"'; } - if ($rawelement['class']) { - $result .= ' class="' . $rawelement['class'] . '"'; + if (!empty($element['class'])) { + $result .= ' class="' . $element['class'] . '"'; } $result .= '>'; - if (isset($rawelement['title']) && $rawelement['title'] !== '' && $rawelement['type'] != 'fieldset') { - if (!empty($rawelement['nolabel'])) { + if (isset($element['title']) && $element['title'] !== '' && $element['type'] != 'fieldset') { + if (!empty($element['nolabel'])) { // Don't bother with a label for the element - $result .= Pieform::hsc($rawelement['title']); + $result .= Pieform::hsc($element['title']); } else { - $result .= '<label for="' . $rawelement['id'] . '">' . Pieform::hsc($rawelement['title']) . '</label>'; + $result .= '<label for="' . $element['id'] . '">' . Pieform::hsc($element['title']) . '</label>'; } - if ($form->get_property('requiredmarker') && !empty($rawelement['rules']['required'])) { + if ($form->get_property('requiredmarker') && !empty($element['rules']['required'])) { $result .= ' <span class="requiredmarker">*</span>'; } } - $result .= $builtelement; + $result .= $element['html']; $result .= "</span>"; return $result; Modified: pieforms-php5/trunk/src/pieform/renderers/table.php =================================================================== --- pieforms-php5/trunk/src/pieform/renderers/table.php 2007-12-27 23:43:59 UTC (rev 240) +++ pieforms-php5/trunk/src/pieform/renderers/table.php 2007-12-27 23:45:56 UTC (rev 241) @@ -27,17 +27,15 @@ /** * Renders form elements inside a <table>. * - * @param Pieform $form The form the element is being rendered for - * @param string $builtelement The element, already built - * @param array $rawelement The element in raw form, for looking up - * information about it. - * @return string The element rendered inside an appropriate - * container. + * @param Pieform $form The form the element is being rendered for + * @param array $element The element to be rendered + * @return string The element rendered inside an appropriate container */ -function pieform_renderer_table(Pieform $form, $builtelement, $rawelement) { +function pieform_renderer_table(Pieform $form, $element) { $formname = $form->get_name(); - if ($rawelement['type'] == 'fieldset') { + if ($element['type'] == 'fieldset') { // Add table tags to the build element, to preserve HTML compliance + $builtelement = $element['html']; if (0 === strpos($builtelement, "\n<fieldset")) { $closelegendpos = strpos($builtelement, '</legend>'); if ($closelegendpos !== false) { @@ -61,53 +59,35 @@ } $result = "\t<tr"; - $result .= ' id="' . $formname . '_' . $rawelement['name'] . '_container"'; + $result .= ' id="' . $formname . '_' . $element['name'] . '_container"'; // Set the class of the enclosing <tr> to match that of the element - if ($rawelement['class']) { - $result .= ' class="' . $rawelement['class'] . '"'; + if (!empty($element['class'])) { + $result .= ' class="' . $element['class'] . '"'; } $result .= ">\n\t\t"; $result .= '<th>'; - if (isset($rawelement['title']) && $rawelement['title'] !== '') { - if (!empty($rawelement['nolabel'])) { - // Don't bother with a label for the element - $result .= Pieform::hsc($rawelement['title']); - } - else { - $result .= '<label for="' . $formname . '_' . $rawelement['id'] . '">' . Pieform::hsc($rawelement['title']) . '</label>'; - } - if ($form->get_property('requiredmarker') && !empty($rawelement['rules']['required'])) { - $result .= ' <span class="requiredmarker">*</span>'; - } + if (isset($element['labelhtml'])) { + $result .= $element['labelhtml']; } $result .= "</th>\n\t\t<td>"; - $result .= $builtelement; - - // Contextual help - if (!empty($rawelement['help'])) { - $function = $form->get_property('helpcallback'); - if (function_exists($function)) { - $result .= $function($form, $rawelement); - } - else { - $result .= ' <span class="help"><a href="#" title="' . Pieform::hsc($rawelement['help']) . '">?</a></span>'; - } + $result .= $element['html']; + if (isset($element['helphtml'])) { + $result .= ' ' . $element['helphtml']; } - $result .= "</td>\n\t</tr>\n"; // Description - optional description of the element, or other note that should be visible // on the form itself (without the user having to hover over contextual help - if ((!$form->has_errors() || $form->get_property('showdescriptiononerror')) && !empty($rawelement['description'])) { + if ((!$form->has_errors() || $form->get_property('showdescriptiononerror')) && !empty($element['description'])) { $result .= "\t<tr>\n\t\t<td colspan=\"2\" class=\"description\">"; - $result .= $rawelement['description']; + $result .= $element['description']; $result .= "</td>\n\t</tr>\n"; } - if (!empty($rawelement['error'])) { + if (!empty($element['error'])) { $result .= "\t<tr>\n\t\t<td colspan=\"2\" class=\"errmsg\">"; - $result .= $rawelement['error']; + $result .= $element['error']; $result .= "</td>\n\t</tr>\n"; } Modified: pieforms-php5/trunk/src/pieform.php =================================================================== --- pieforms-php5/trunk/src/pieform.php 2007-12-27 23:43:59 UTC (rev 240) +++ pieforms-php5/trunk/src/pieform.php 2007-12-27 23:45:56 UTC (rev 241) @@ -208,6 +208,12 @@ // The form renderer (see the pieform/renderers directory) 'renderer' => 'table', + // The directory (relative to the include path) to search for templates + 'templatedir' => '', + + // Whether to ignore E_NOTICE messages in templates + 'ignoretemplatenotices' => true, + // Whether to validate the form. Non validated forms have none of the // validate, success or error callbacks called on them 'validate' => true, @@ -393,6 +399,9 @@ } } if ($element['type'] == 'fieldset') { + if ($this->get_property('template')) { + self::info("Your form '$this->name' has a fieldset, but is using a template. Fieldsets make no sense when using templates"); + } $this->include_plugin('element', 'fieldset'); foreach ($element['elements'] as $subname => &$subelement) { // The name can be in the element itself. This is compatibility for the perl version @@ -599,7 +608,10 @@ * @return mixed */ public function get_property($key) { - return $this->data[$key]; + if (array_key_exists($key, $this->data)) { + return $this->data[$key]; + } + return null; } /** @@ -651,64 +663,127 @@ */ public function build($outputformtags=true) { $result = ''; - if ($outputformtags) { - $result = $this->get_form_tag() . "\n"; - } - $this->include_plugin('renderer', $this->data['renderer']); - - // Form header - $function = 'pieform_renderer_' . $this->data['renderer'] . '_header'; - if (function_exists($function)) { - $result .= $function(); + // Builds the HTML each element (see the build_element_html method for + // more information) + foreach ($this->data['elements'] as &$elem) { + if ($elem['type'] == 'fieldset') { + foreach ($elem['elements'] as &$subelem) { + $this->build_element_html($subelem); + } + } + else { + $this->build_element_html($elem); + } } - // Render each element - foreach ($this->data['elements'] as $name => $elem) { - if ($elem['type'] != 'hidden') { - $result .= pieform_render_element($this, $elem); + // If a template is to be used, use it instead of a renderer + if (!empty($this->data['template'])) { + $form_tag = $this->get_form_tag(); + + // $elements is a convenience variable that contains all of the form elements (minus fieldsets and + // hidden elements) + $elements = array(); + foreach ($this->get_elements() as $element) { + if ($element['type'] != 'hidden') { + $elements[$element['name']] = $element; + } } - } - // Form footer - $function = 'pieform_renderer_' . $this->data['renderer'] . '_footer'; - if (function_exists($function)) { - $result .= $function(); - } + // Hidden elements + $this->include_plugin('element', 'hidden'); + $hidden_elements = ''; + foreach ($this->get_elements() as $element) { + if ($element['type'] == 'hidden') { + $hidden_elements .= pieform_element_hidden($this, $element); + } + } + $element = array( + 'type' => 'hidden', + 'name' => 'pieform_' . $this->get_name(), + 'value' => '' + ); + $hidden_elements .= pieform_element_hidden($this, $element); - // Hidden elements - $this->include_plugin('element', 'hidden'); - foreach ($this->get_elements() as $element) { - if ($element['type'] == 'hidden') { - $result .= pieform_element_hidden($element, $this); + ob_start(); + + if ($this->get_property('ignoretemplatenotices')) { + $old_level = error_reporting(E_ALL & ~E_NOTICE); } + + $templatepath = $this->get_property('templatedir'); + $templatepath = ($templatepath && substr($templatepath, -1) != '/') ? $templatepath . '/' : $templatepath; + $templatepath .= $this->get_property('template'); + require($templatepath); + + if ($this->get_property('ignoretemplatenotices')) { + error_reporting($old_level); + } + + $result = ob_get_contents(); + ob_end_clean(); } - $element = array( - 'type' => 'hidden', - 'name' => 'pieform_' . $this->name, - 'value' => '' - ); - $result .= pieform_element_hidden($element, $this); - if ($outputformtags) { - $result .= "</form>\n"; - } + else { + // No template being used - instead use a renderer + if ($outputformtags) { + $result = $this->get_form_tag() . "\n"; + } - if ($this->data['jsform'] || $this->data['presubmitcallback']) { - $result .= '<script type="text/javascript">'; + $this->include_plugin('renderer', $this->data['renderer']); + + // Form header + $function = 'pieform_renderer_' . $this->data['renderer'] . '_header'; + if (function_exists($function)) { + $result .= $function(); + } + + // Render each element + foreach ($this->data['elements'] as $name => $element) { + if ($element['type'] != 'hidden') { + $result .= pieform_render_element($this, $element); + } + } + + // Form footer + $function = 'pieform_renderer_' . $this->data['renderer'] . '_footer'; + if (function_exists($function)) { + $result .= $function(); + } + + // Hidden elements + $this->include_plugin('element', 'hidden'); + foreach ($this->get_elements() as $element) { + if ($element['type'] == 'hidden') { + $result .= pieform_element_hidden($this, $element); + } + } + $element = array( + 'type' => 'hidden', + 'name' => 'pieform_' . $this->name, + 'value' => '' + ); + $result .= pieform_element_hidden($this, $element); if ($outputformtags) { - $result .= "\n" . $this->whichbutton_js(); + $result .= "</form>\n"; } + + if ($this->data['jsform'] || $this->data['presubmitcallback']) { + $result .= '<script type="text/javascript">'; + if ($outputformtags) { + $result .= "\n" . $this->whichbutton_js(); + } + } + if ($this->data['jsform']) { + $result .= $this->submit_js(); + } + else if ($this->data['presubmitcallback'] && $outputformtags) { + $result .= 'connect(\'' . $this->name . '\', \'onsubmit\', ' + . 'function() { ' . $this->data['presubmitcallback'] . "('{$this->name}', {$this->name}_btn); });"; + } + if ($this->data['jsform'] || $this->data['presubmitcallback']) { + $result .= "\n</script>\n"; + } } - if ($this->data['jsform']) { - $result .= $this->submit_js(); - } - else if ($this->data['presubmitcallback'] && $outputformtags) { - $result .= 'connect(\'' . $this->name . '\', \'onsubmit\', ' - . 'function() { ' . $this->data['presubmitcallback'] . "('{$this->name}', {$this->name}_btn); });"; - } - if ($this->data['jsform'] || $this->data['presubmitcallback']) { - $result .= "\n</script>\n"; - } return $result; } @@ -1340,6 +1415,55 @@ } } } + + /** + * Given an element, builds all of the HTML for it - for example, the label + * and the raw HTML of the element itself + * + * The element is passed by reference, and various properties are set + * directly on the element, namely: + * + * * 'html' - The element in its built, HTML form + * * 'labelhtml' - The HTML for the element label + * * 'helphtml' - The HTML for the help icon + * + * @param array &$element The element to build the HTML for + */ + private function build_element_html(&$element) { + // Set ID and class for elements + $element['id'] = $this->make_id($element); + $element['class'] = $this->make_class($element); + + // Build the element html + $function = 'pieform_element_' . $element['type']; + $element['html'] = $function($this, $element); + + // Element title + if (isset($element['title']) && $element['title'] !== '') { + if (!empty($element['nolabel'])) { + // Don't bother with a label for the element + $element['labelhtml'] = self::hsc($element['title']); + } + else { + $element['labelhtml'] = '<label for="' . $this->name . '_' . $element['id'] . '">' . Pieform::hsc($element['title']) . '</label>'; + } + if ($this->get_property('requiredmarker') && !empty($element['rules']['required'])) { + $element['labelhtml'] .= ' <span class="requiredmarker">*</span>'; + } + } + + // Help icon + if (!empty($element['help'])) { + $function = $this->get_property('helpcallback'); + if (function_exists($function)) { + $element['helphtml'] = $function($this, $element); + } + else { + $element['helphtml'] = '<span class="help"><a href="" title="' . Pieform::hsc($element['help']) . '" onclick="return false;">?</a></span>'; + } + } + } + } @@ -1367,22 +1491,23 @@ } // Make sure that the function to render the element type is available - $function = 'pieform_element_' . $element['type']; - $rendererfunction = 'pieform_renderer_' . $form->get_property('renderer'); if (!function_exists($rendererfunction)) { throw new PieformException('No such form renderer function: "' . $rendererfunction . '"'); } - $element['id'] = $form->make_id($element); - $element['class'] = $form->make_class($element); - $builtelement = $function($form, $element); - // Remove the 'autofocus' class, because we only want it on the form input // itself, not the wrapping HTML - $element['class'] = preg_replace('/\s?autofocus/', '', $element['class']); + if (isset($element['class'])) { + $element['class'] = preg_replace('/\s?autofocus/', '', $element['class']); + } - return $rendererfunction($form, $builtelement, $element); + // Render fieldsets now + if ($element['type'] == 'fieldset') { + $element['html'] = pieform_element_fieldset($form, $element); + } + + return $rendererfunction($form, $element); } function pieform_get_headdata() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |