So you don't have to recreate it, the Autocomplete Helper is as follows. It's a cut and paste of the work some other wonderful gentleman did, and I turned off the validator because i was lazy.
class Zend_Controller_Action_Helper_AutoCompleteDojoNew extends Zend_Controller_Action_Helper_AutoComplete_Abstract { public function validateData($data) { return true; } public function prepareAutoCompletion($data, $keepLayouts = false) { $items = array(); foreach ($data as $key => $value) { $items[] = array('label' => $value, 'name' => $value, 'key' => $key); } $final = array( 'identifier' => 'key', 'items' => $items, ); return $this->encodeJson($final, $keepLayouts); } } On Tue, Nov 11, 2008 at 5:50 PM, Bart McLeod <[EMAIL PROTECTED]> wrote: > Hi Cameron, > > I tried to set up a testsite yesterday evening, but I ran out of time > (mostly because I did not do much Dojo so far). I will keep looking into > this and file a bug if I can confirm it. > > Will use your examples if possible to set it up and confirm the bug. > > While you are at it, could you evaluate a patch I provided for the dojo > checkbox? It is Issue ZF-4274, you can download patches there. > > Regards, > > Bart McLeod > > Cameron schreef: > > I'm really stumped with this one, it flat out doesn't work in anything like > the way you'd expect / want it to, and I can't find a single piece of > documentation on this anywhere. I'm not even talking about dependent > dropdowns here, all I am trying to do is get $form->populate to correctly > work in my Edit action when I'm using a FilteringSelect that uses a store > instead of setMultiOptions. Note, this exact same form works just fine (and > submits the ID value correctly) from the New action, the ONLY thing that > fails is the populate method, everything else works perfectly. > > Let's get in to the code. I've trimmed the unimportant parts. > > EDIT ACTION IN THE CONTROLLER: > > public function editAction() { > $form = $this->getForm(); > $id = (int)$this->_request->getParam('id', 0); > $form->setAction("/$this->_class/edit/id/$id") > ->setMethod('post') > ->setName('editform') > ->setElementsBelongTo('editform'); > > if ($this->_request->isPost()) { > //SAVE RECORD > $formData = $this->_request->getPost(); > $formData['id'] = (int) $id; > $model = $this->getModel(); > if (true === $model->update($formData)) { > //SAVE SUCCESS > $this->_redirect("/$this->_class/display/id/$id"); > } else { > //SAVE FAILURE, RETURN AND EDIT AGAIN > $form->populate($formData); > } > } else { > //INITIAL LOAD, GET VALUES AND POPULATE > $model = $this->getModel(); > $job = $model->get($id); > $form->populate($job); > } > $this->view->form = $form; > > } > > ADDELEMENT METHOD FROM THE FORM CLASS > > $this->addElement('FilteringSelect', 'fk_client_id', array( > 'label' => 'Client:', > 'store' => 'clientStore', > 'autoComplete' => 'false', > 'hasDownArrow' => 'true', > 'id' => 'fk_client_id', > )); > > JAVASCRIPT THAT CREATES THE STORE > > dojo.declare("ClientReadStore", dojox.data.QueryReadStore, { > fetch:function (request) { > request.serverQuery = { autocomplete:1, str:request.query.name }; > return this.inherited("fetch", arguments); > } > }); > > JSON FORMAT THE STORE RETURNS > (this is a long story, I had to rewrite > Zend_Controller_Action_Helper_AutoCompleteDojo because it doesn't work, as > has been noted by others, but the end result is that it now outputs this > JSON, and it works) > > ({"identifier":"key","items":[ > > {"label":"aaaaaaaa","name":"aaaaaaaa","key":1}, > {"label":"bbbbbbb","name":"bbbbbbb","key":2}, > {"label":"vvvvvvvvv","name":"vvvvvvvvv","key":3}, > {"label":"ffffffff","name":"ffffffff","key":4}, > {"label":"ddddddd","name":"ddddddd","key":5} > {"label":"sssssssss","name":"sssssssss","key":7}, > {"label":"rrrrrrrrrr","name":"rrrrrrrrrr","key":8}, > {"label":"jjjjjjjjjjjj","name":"jjjjjjjjjjjj","key":9} > > ]}) > > EDIT ACTION VIEW SCRIPT > > <? Zend_Dojo_View_Helper_Dojo::setUseDeclarative();?> > > <div dojoType="ClientReadStore" jsId="clientStore" > url="/clients/autocomplete/format/ajax?autocomplete=1&str=*" > requestMethod="get"></div> > > <? echo $this->form; ?> > > > As you can see, this is all pretty basic stuff, and follows (as far as I > can piece together) the best practices for doing this sort of thing. Now. > Here's the debugging information I've managed to coax out so far. > > If you call print_r($this->form-getValues()) in the View script, it returns > this: > > Array ( [editform] => Array ( [fk_client_id] => 484 [fk_client_contact_id] > => 459 [position] => CIVIL ENGINEER [quantity] => 1 [start] => ASAP? > [duration] => 3 - 4 MTHS INIT [rate] => NEG [charge] => [experience] => MPD > JV. DESIGN EARTHWORKS, DRAINAGE, ROADS. STOCK YARD. [notes] => [comment] => > COMMENT COMMENT COMMENT [contractor] => UNKNOWN [filled] => 2002-04-10 > 00:00:00 [fk_agency_id] => 0 ) ) > > So as you can see, the variable we're working on here (fk_client_id) is > being correctly populated in the view. However, when we do the same thing on > the form from the Dojo side, we get an entirely different result. > > If you call alert(dojo.toJson(dijit.byId("editform").getValues())); in > order to dump out the contents of the form, we get... > > {"editform[fk_client_id]":"","editform[fk_client_contact_id]":"","editform[position]":"CIVIL > ENGINEER","editform[quantity]":"1","editform[start]":"ASAP?","editform[duration]":"3 > - 4 MTHS > INIT","editform[rate]":"NEG","editform[charge]":"","editform[experience]":"MPD > JV. DESIGN EARTHWORKS, DRAINAGE, ROADS. STOCK > YARD.","editform[notes]":"","editform[comment]":"COMMENT COMMENT > COMMENT","editform[contractor]":"UNKNOWN","editform[filled]":undefined,"editform[fk_agency_id]":"","editform[save]":"Save"} > > As you can see, the fk_client_id field is empty. SO. Is this a bug? Or am I > doing something horribly wrong? <rant> Or am I supposed to be building some > JS to... I'm not even sure any more, the closest I can get to making the > form do anything at all has been > dijit.byId("fk_client_id").setValue('<?=$this->form-getValue('fk_client_id'))?>');, > but all that does is put the ID in the drop down, which certainly isn't what > we want. Am I meant to use the ID, write an ajax call to go grab the name > value associated with that ID, then set THAT as the value? Even that isn't > going to work correctly because the dijit form setValue doesn't support a > key=>value pair, so it'll just submit the text version, which I suppose I > could convert back to the id in my controller, but goddamn it if that is the > ONLY way to make this work then I'm packing up and going home, because > that's an impossibly ugly hack, and having to write that would make my skin > crawl.</rant> > > > If anyone has any ideas at all on how to make this work, or can point me to > some documentation, please, let me know. I'm stumped. I promise, just as > soon as I work this whole thing out, I will post a giant-ass tutorial on it > so that no one ever has to suffer again. > > > -- > Bart McLeod > *Space Web Internet Team* > Middenlaan 47 > 6865 VN Heveadorp > The Netherlands > *t* +31(0)26 3392952 > *m* 06 51 51 89 71 > [EMAIL PROTECTED] [EMAIL PROTECTED] > www.spaceweb.nl [image: zce logo] [image: zce PHP 5 logo] > > *Bart McLeod is a Zend Certified Engineer.* > > Click to verify! <http://www.zend.com/zce.php?c=ZEND004591&r=218204904> >
<<Php5-zce-logo.gif>>
<<logo_230.gif>>
<<zce_logo.gif>>