Re: DB_DataObject_FormBuilder: how to override processForm() method

From: 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:
http://pear.php.net/package/DB_DataObject_FormBuilder/docs/0.10.3/apidoc/DB_DataObject_FormBuilder-0.10.3/DB_DataObject_FormBuilder.html#methodprocessForm
Aha...it does say to override it. However, you should be overriding it in a class extended from FB, not in the DO.
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!!!
I have this table: CREATE TABLE auth ( username varchar(50) NOT NULL default '', password varchar(32) NOT NULL default '', PRIMARY KEY (username), KEY password (password) ) TYPE=MyISAM;
Why not this? CREATE TABLE auth ( id INT UNSIGNED NOT NULL AUTO_INCREMENT, username varchar(50) NOT NULL default '', password varchar(32) NOT NULL default '', PRIMARY KEY (id), UNIQUE (id), UNIQUE (username), KEY password (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...
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).
Within 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. ;-)
Thanks a lot for your suggestions, J

« previous php.pear.general (#15558) next »