0

在使用 Zend 框架表单时,我在使用 Dojo 过滤选择时遇到了一些问题,需要一些帮助来找出我错过了什么,因为这让我发疯。

我目前在firebug中遇到此错误:

  • dojo.data 未定义
  • dojo.data.ItemFileReadStore 不是构造函数

下面是我用来创建过滤器选择并将 json 数据提供给调用控制器的代码。

Zend_Form 元素(启用 Dojo)

$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');

道场控制器

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();
}

烦人的事情是我在这个表单上的所有其他 Dojo 元素和其他表单运行良好,只是每当我执行过滤选择时,我遇到了这些问题,并且这个问题导致表单中的所有其他元素也失败。

提前致谢。

4

1 回答 1

0

问题实际上在于 Zend Framework 如何在工具包完全加载之前初始化 dijit 和数据存储,在这种情况下,特别是将存储分配给 dijit 的方法。我也遇到了这个问题,并发现解决这些问题的最佳方法是将数据存储从控制器传递到视图中定义的 JavaScript 变量,或者使用特定的自动完成操作执行您所做的操作。根据您的示例,我将进行以下更改。

在您的表单中,我将简化元素:

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

在您看来,您希望将商店连接到您的 dijit 并确保您已加载 dojo.data.ItemFileReadStore 模块:

<?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');
?>

正如我提到的,我遇到了一个类似的问题,我在这里回答了。我发现的另一个问题是数据存储不喜欢处理 Zend_Dojo_Data 中标签声明的“名称”以外的任何标签声明。

于 2009-05-21T04:50:41.230 回答