Re: DB_DataObject_FormBuilder: how to override processForm() method
| From: | Giorgio Gorla | Date: | Tue, 16 Nov 2004 12:34:48 +0000 |
| Subject: | Re: DB_DataObject_FormBuilder: how to override processForm() method | ||
| References: | 1 2 3 4 5 6 | Groups: | php.pear.general |
| Request: | Send a blank email to pear-general+get-15558@lists.php.net to get a copy of this message | ||
Justin Patrin ha scritto:
It's clear. Even so DB_DataObject_Formbuilder::create() returns a object from a class that extends DB_DataObject_Formbuilder: DB_DataObject_Formbuilder_QuickForm in DB/DataObject/Formbuilder/QuickForm.php. Due to DB_DataObject_Formbuilder::create() function has been wrotten, it seems to me I've to override create() (extending DB_DataObject_Formbuilder) before, and then I've to override process() extending DB_DataObject_Formbuilder_QuickForm. ARGH!!!http://pear.php.net/package/DB_DataObject_FormBuilder/docs/0.10.3/apidoc/DB_DataObject_FormBuilder-0.10.3/DB_DataObject_FormBuilder.html#methodprocessFormAha...it does say to override it. However, you should be overriding it in a class extended from FB, not in the DO.
I agree, but I'm using Auth library from Pear and the table structure above is that one suggestested by user's documentation (http://pear.php.net/manual/en/package.authentication.auth.intro.php).I have this table: CREATE TABLEWhy not this? CREATE TABLEauth(usernamevarchar(50) NOT NULL default '',passwordvarchar(32) NOT NULL default '', PRIMARY KEY (username), KEYpassword(password) ) TYPE=MyISAM;auth(idINT UNSIGNED NOT NULL AUTO_INCREMENT,usernamevarchar(50) NOT NULL default '',passwordvarchar(32) NOT NULL default '', PRIMARY KEY (id), UNIQUE (id), UNIQUE (username), KEYpassword(password) ) TYPE=MyISAM; This way you have an auto-generated key *and* you have the unique username constraint. Best of both worlds. In my experience, it's always best to have an auto-generated key in a table. 1) because it just makes things simpler and 2) it saves on space and processing time when doing selects and when using foreign keys. Also, why are you making password a key? Are you selecting by password? If not, I don't see why it would be a key...I could understand using the username as a key, but not the password...
Thanks a lot for your suggestions, JWithin Auth.php (class DB_DataObject_Auth generated by createTable.php) I've set $fb_hidePrimaryKey = false in order to input primary key manually. But when I try to insert a new record, DBOF does an update.Here's my take on this. If you want to use your natural primary key, you should be using the forceQueryType() function of FB. If you call as so: $fb->forceQueryType(DB_DATAOBJECT_FORMBUILDER_QUERY_FORCEINSERT); The data will be inserted instead of updated. To check for this, you'll have to do a query before the processform method is called, then force the insert if it's a new record. You could also change the way that the update() method on your DO works something like this: function update($do = false) { if ($do === false) {$checkDo = DB_DataObject::factory($this->__table); if (!$checkDo->get('username', $this->username)) { parent::insert(); return; }} parent::update(); } This will insert the record instead of updating it if the username isn't found in the DB. This isn't a great system as you can't change your username with it. Ok, so that's a bad idea. Your best bet is to add a hidden field to the form which tells you whether you'rs updating or inserting, then force the query type on submit based on that value....of course, this is precisely what having an auto-generate PK does for you. ;-)