[nycphp-talk] QuickForm / PHP (Zend Engine) Bug - callback function never called
Dan Cech
dcech at phpwerx.net
Thu Mar 17 08:15:56 EST 2005
Jay,
As far as I know function definitions within conditional blocks are
executed inline with the other code, thus the behaviour you describe
would be correct as the function would not yet have been defined.
I could be way off though...
Dan
Jayesh Sheth wrote:
> Hello all,
>
> I have come across commonly occuring QuickForm bug that might be due to
> either a QuickForm bug or a Zend Engine bug (unless I am doing something
> really stupid here.)
>
> Okay, here's the gist of it:
>
> If a QuickForm object is instantiated inside of a conditional check, the
> callback processing function will not be run, UNLESS the callback
> function is defined BEFORE the if "( $form->validate() )" check.
>
> (The following examples are based on sample code from David Sklar's
> "Essential PHP Tools" book.)
> For example, in the following case, the callback function will NOT be run:
> ---------------------------
> <?php
> /*
> praise_book() function is defined AFTER 'if ($form->validate())'
> The callback function will now NOT be run
> This is a PHP or QF bug
> */
>
> define ("IS_TRUE", true);
>
> if (IS_TRUE)
> {
> // Load the HTML_QuickForm module
> require 'HTML/QuickForm.php';
>
> // Instantiate a new form
> $form = new HTML_QuickForm('book');
> // Add a text box
> $form->addElement('text','title','Book Title:');
> // Add a select box
> $subjects = array('Math','Ice Fishing','Anatomy');
> $form->addElement('select','subject','Subject(s): ',$subjects);
> // Add a submit button
> $form->addElement('submit','save','Save Book');
>
> // Add a validation rule: title is required
> $form->addRule('title','Please Enter a Book Title','required');
>
> $praise_book_called = false;
>
> // Call the processing function if the submitted form
> // data is valid; otherwise, display the form
> if ( $form->validate() )
> {
> $f = $form->process('praise_book');
> if (! $f || ! $praise_book_called)
> {
> if ( ! $praise_book_called )
> {
> echo "<p> Error / PHP Bug: </p>";
> echo "<pre>";
> print_r($f);
> echo "</pre>";
> }
> else
> {
> echo "<p>Other error.</p>";
> }
> }
> }
> else
> {
> $form->display();
> }
>
> // Define a function to process the form data
> function praise_book($v)
> {
> global $subjects, $praise_book_called;
> $praise_book_called = true;
> // Entity-encode any special characters in $v['title']
> $v['title'] = htmlentities($v['title']);
> print "<i>$v[title]</i> is a great book about ";
> print $subjects[$v['subject']] . '.';
> return true;
> }
>
> }
> else
> {
> exit("<p>Error: An unknown error has occured. Exiting.</p>");
> }
> ?>
> ---------------------------
> The following error will be outputted (via print_r() )
>
> ---------------------------
> Error / PHP Bug:
>
> HTML_QuickForm_Error Object
> (
> [error_message_prefix] => QuickForm Error: [mode] => 1
> [level] => 1024
> [code] => -7
> [message] => process callback does not exist
> [userinfo] => Callback function does not exist in QuickForm::process()
> [backtrace] => Array
> (
> [0] => Array
> (
> [file] =>
> c:\apachefriends\xampp\php\pear\HTML\QuickForm.php
> [line] => 1818
> [function] => PEAR_Error
> [class] => HTML_QuickForm_Error
> [type] => ->
> [args] => Array
> (
> [0] => process callback does not exist
> [1] => -7
> [2] => 1
> [3] => 1024
> [4] => Callback function does not exist in
> QuickForm::process()
> )
>
> )
>
> [SNIP ... more stuff in here. Please run the example to see
> the entire output.]
> )
>
> -------------------------
> Now, in the following case, if praise_book is defined before 'if
> ($form->validate())', it will work as expected. Also, if the conditional
> check "if (IS_TRUE)" is removed, it will work as expected.
>
> What is going on here?
> Is it something that I am missing, or is it a PHP or QuickForm bug?
>
> Thanks in advance.
>
> - Jay
>
> _______________________________________________
> New York PHP Talk Mailing List
> AMP Technology
> Supporting Apache, MySQL and PHP
> http://lists.nyphp.org/mailman/listinfo/talk
> http://www.nyphp.org
More information about the talk
mailing list