2009-05-07 4 views
0

Ich habe ein paar Probleme mit Dojo Filtering Selects, wenn ich die Zend Framework Forms benutze und brauche etwas Hilfe um herauszufinden, was ich verpasst habe, da dies mich verrückt macht.dojo.data ist undefined Flitring select

ich zur Zeit bin immer diese Fehler in firebug:

  • dojo.data undefiniert
  • dojo.data.ItemFileReadStore kein Konstruktor ist

Unten ist der Code, den ich verwende zum Erstellen des Filters select und stelle die json-Daten dem rufenden Controller zur Verfügung.

Zend_Form Element (Dojo aktiviert)

$industry = new Zend_Dojo_Form_Element_FilteringSelect('industry'); 
    $industry->setAutocomplete(true) 
    ->setStoreId('industrystore') 
    ->setStoreType('dojo.data.ItemFileReadStore') 
    ->setStoreParams(array('url' => $baseUrl.'/dojo/industry')) 
    ->setAttrib("searchAttr", "title") 
    ->setRequired(true) 
    ->removeDecorator('DtDdWrapper') 
    ->removeDecorator('label') 
    ->removeDecorator('HtmlTag'); 

Dojo-Controller

public function industryAction(){ 

    $db = Zend_Db::factory($this->config->database); 

    $result = $db->fetchAll("SELECT * FROM industries"); 
    $data = new Zend_Dojo_Data('industryid', $result); 
    $this->_helper->autoCompleteDojo($data); 

    $db->closeConnection(); 
} 

Das Ärgerliche ist, alle meine anderen Dojo Elemente auf diesem Formular und andere Formen arbeiten, um es gut ist einfach Wann immer ich filtere Wählt, dass ich diese Probleme treffe, und dieses Problem führt dazu, dass auch alle anderen Elemente in einem Formular fehlschlagen.

Vielen Dank im Voraus.

Antwort

0

Das Problem besteht eigentlich darin, wie Zend Framework die Dijits und Datenspeicher initialisiert, bevor das Toolkit vollständig geladen ist, in diesem Fall speziell die Methoden, die den Speicher dem Dijit zuweisen. Ich stieß auch auf dieses Problem und fand die beste Möglichkeit, um die Probleme zu umgehen, entweder den Datenspeicher vom Controller an eine JavaScript-Variable in der Ansicht übergeben oder tun, was Sie mit einer bestimmten Autocomplete-Aktion getan haben. Basierend auf Ihrem Beispiel würde ich folgende Änderungen vornehmen.

In Ihrem Formular ich das Element vereinfachen würde:

$industry = new Zend_Dojo_Form_Element_FilteringSelect('industry'); 
    $industry->setAutocomplete(true) 
    ->setRequired(true) 
    ->removeDecorator('DtDdWrapper') 
    ->removeDecorator('label') 
    ->removeDecorator('HtmlTag'); 

Ihrer Ansicht nach wollen Sie den Speicher Ihrer dijit verbinden und sicherstellen, dass Sie das dojo.data.ItemFileReadStore Modul geladen haben:

<?php $this->dojo()->onLoadCaptureStart()?> 
    function(){ 
     dijit.byId('industry').store = new dojo.data.ItemFileReadStore({ url: '/controller/industry' }); 
    } 
<?php 
    $this->dojo()->onLoadCaptureEnd(); 
    $this->dojo()->requireModule('dojo.data.ItemFileReadStore'); 
?> 

Wie bereits erwähnt, stieß ich auf ein ähnliches Problem, das ich beantwortete here. Ein anderes Problem, das ich entdeckte, ist, dass der Datenspeicher es nicht mag, mit Labels zu arbeiten, die etwas anderes als "name" für die Label-Deklaration in Zend_Dojo_Data deklariert haben.