Hi Cameron,

While working on your problem out of curiosity and because I had to dive into Dojo anyway, I have set up the simplest example I could come up with, and it works.

First of all, let me explain why I did not take into account any of the specific problems you are currently facing. As I am completely new to Dojo, I did not want my problem solving to be troubled by specific issues that are not related to your core problem, as this would seriously hinder my understanding of the matter. So if you try this in a different way, you may still encounter a bug and in that case I would like to hear of it and I would in that case encourage you to change my example in such a way that I can easily reproduce it.

What I understand as to be your core problem is that you want to select boxes (Dojo filteringselect), using ZendFramework and DataStores. That is the setup that I have created. My first selectboxs uses mulitoptions, the second uses a datastore and filters values bases on what you select in the first box.

I will attach all the files needed. Note that index.phtml has to go into the scripts directory! If the php files do not come through, I will zip them. Just ask.

If you use this on your giant tutorial, do not forget to mention me!

Regards,

Bart McLeod

Cameron schreef:
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 = "" 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
MailScanner has detected a possible fraud attempt from "1.7.0." claiming to be 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=""
>             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/


--
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]
www.spaceweb.nl
zce logo zce PHP 5 logo

Bart McLeod is a Zend Certified Engineer.

Click to verify!

setIdentifier('name'); $cats = array('', 'Lion', 'Cheeta', 'Cat'); foreach ($cats as $cat) { $data->addItem(array('name' => $cat, 'Cat' => $cat)); } $dogs = array('', 'Bello', 'Blix', 'Freddy', 'Hungry Bill'); foreach ($dogs as $dog) { $data->addItem(array('name' => $dog, 'Dog' => $dog)); } echo $data; setView($view); $autoComplete1 = new Zend_Dojo_Form_Element_FilteringSelect('sel_1'); $autoComplete1->setMultiOptions( array( '' => '', 'Cat' => 'Cats', 'Dog' => 'Dogs') ); $autoComplete1->setAttrib('onchange', "dijit.byId('sel_2').searchAttr = dijit.byId('sel_1').getValue();return true"); $autoComplete1->setLabel('Select 1'); $form->addElement($autoComplete1); $form->addElement( 'FilteringSelect', 'sel_2', array( 'label' => 'Select 2', 'storeId' => 'myData', 'storeType'=> 'dojo.data.ItemFileReadStore', 'storeParams' => array( 'url' => '/zf/dojo.php',), 'dijitParams' => array( 'searchAttr' => 'Dog', ), ) ); $view->form = $form->render(); $view->addBasePath('E:\werk\zf fixes\testsite'); echo $view->render('index.phtml'); ?>
doctype() ?> form ?> inlineScript() ?>

Reply via email to