-- 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/

Reply via email to