> 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=""
> 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.
>
>
> --
>