Can't Get FormBuilder to do an INSERT
| From: | Jamie Alessio | Date: | Wed, 26 Jan 2005 19:01:23 +0000 |
| Subject: | Can't Get FormBuilder to do an INSERT | ||
| Groups: | php.pear.general | ||
| Request: | Send a blank email to pear-general+get-17179@lists.php.net to get a copy of this message | ||
I'm having trouble getting DB_DataObject_FormBuilder to generate an INSERT statement when creating new records. It always ends up generating an UPDATE statement like this:
-----------------------------------------------
UPDATE expertise SET expertise = 'yeahyeah'
WHERE expertise.expertise_id = IS NULL
-----------------------------------------------
Here's some sample code that I am using to isolate this problem:
-----------------------------------------------
$obj = DB_DataObject::factory('Expertise');
$formBuilder = DB_DataObject_FormBuilder::create($obj);
$form = $formBuilder->getForm();
if($form->validate())
{
$form->process(array(&$formBuilder, 'processForm'), false);
echo "Should have done an insert, but it probably did an update.";
}
else
{
echo $form->toHtml();
}
-----------------------------------------------
This generates a form with these fields:
-----------------------------------------------
<input name="expertise_id" type="hidden" value="" />
<input name="submit" type="hidden" value="1" />
<input name="expertise" type="text" />
<input name="__submit__" value="Submit" type="submit" />
-----------------------------------------------
I'm using the latest CVS version of FormBuilder and have traced the problem to this block of code in FormBuilder.php at line 2128
-----------------------------------------------
$action = DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEUPDATE;
if (!isset($this->_do->$pk) || !strlen($this->_do->$pk)) {
$action = DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT;
}
-----------------------------------------------
The expected action is that this would evaluate to true and set $action = DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT but it never goes into that block and $action always remains equal to DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEUPDATE
Here's the dump of the the data in $this->_do->$pk at the time of the if() statement in question
-----------------------------------------------
[expertise_id] => DB_DataObject_Cast Object
(
[type] => sql
[day] =>
[month] =>
[year] =>
[value] => NULL
)
-----------------------------------------------
According to the documentation for the FormBuilder.php processForm() function "If the primary key is not set or NULL, it will be assumed that you wish to insert a new element into the database, so DataObject's insert() method is invoked." Should the primary key 'expertise_id' be a 'DB_DataObject_Cast Object' at this point? Could that be the problem? If so, any thoughts on how/why it is getting cast that way?
What am I missing here? I feel like there must be something very basic that I'm missing since the insert/update part of FormBuilder is one of it's core features.
Thanks for any help.
- Jamie