-- Cameron <[EMAIL PROTECTED]> wrote
(on Wednesday, 12 November 2008, 06:51 PM +0900):
> 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.
BTW, the Zend_Controller_Action_Helper_AutoCompleteDojo was refactored
in trunk last week to use Zend_Dojo_Data internally, as well as to
accept Zend_Dojo_Data objects. These changes will be released with
1.7.0.
> 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 zce logo zce PHP 5 logo
> [cid]
> Space Web Internet
> Team Bart McLeod is a Zend Certified
> Middenlaan 47 Engineer.
> 6865 VN Heveadorp
> The Netherlands Click to verify!
> t +31(0)26 3392952
> m 06 51 51 89 71
> @ [EMAIL PROTECTED]
> www.spaceweb.nl
>
>
--
Matthew Weier O'Phinney
Software Architect | [EMAIL PROTECTED]
Zend Framework | http://framework.zend.com/