I've had a look at the version in the trunk, and it's not going to work for
anyone - maybe I'm crazy, but I've always thought selects were best used as
an id => value pair, so the id matches the id value in your database, so you
don't have to rely on clunky string matching. In the refactored version (and
it's the same in the old version too), we have this:
$items = array();
foreach ($data as $key => $value) {
$items[] = array('label' => $value, 'name' => $value);
}
$data = new Zend_Dojo_Data('name', $items);
Which submits a value => value pair to the drop down. Is it just me, or is
this a bit useless? I'm beginning to think this is the source of all the
problems I'm having with these things, that I'm trying to do this based on
ids rather than strings, but I'd have thought my use case was far more
common!
On Wed, Nov 12, 2008 at 7:30 PM, Matthew Weier O'Phinney
<[EMAIL PROTECTED]>wrote:
> -- 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/
>